8743d3756dbe4e476c2a673be2a2bc48fae7dc14
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / dom / adapter / BindingToNormalizedNodeCodecTest.java
1 /*
2  * Copyright (c) 2017 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.binding.dom.adapter;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.fail;
13
14 import java.io.File;
15 import java.lang.reflect.Field;
16 import java.lang.reflect.InvocationTargetException;
17 import java.util.ArrayList;
18 import java.util.List;
19 import java.util.Map.Entry;
20 import javassist.ClassPool;
21 import org.junit.Test;
22 import org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataObjectSerializerGenerator;
23 import org.opendaylight.mdsal.binding.dom.codec.gen.impl.StreamWriterGenerator;
24 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
25 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
26 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
27 import org.opendaylight.mdsal.binding.generator.util.JavassistUtils;
28 import org.opendaylight.yangtools.yang.binding.DataObject;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.opendaylight.yangtools.yang.common.QName;
31 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
32 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
34 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
35 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
36 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
37 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
38 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
39 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
40 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
41 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
42
43 public class BindingToNormalizedNodeCodecTest {
44
45     /**
46      * Positive test.
47      *
48      * <p>
49      * Test for yang with leaf of type int in container where data are created
50      * with int value (acceptable data).
51      *
52      * @throws Exception
53      *             - throw exception
54      */
55     @Test
56     public void fromNormalizedNodeTest() throws Exception {
57         final SchemaContext schemaCtx =
58                 YangParserTestUtils.parseYangFiles(new File(getClass().getResource("/test.yang").toURI()));
59         final NormalizedNode<?, ?> data = prepareData(schemaCtx, 42);
60         final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode = fromNormalizedNode(data, schemaCtx);
61
62         final DataObject value = fromNormalizedNode.getValue();
63         assertNotNull(value);
64         assertEquals("Cont", value.getImplementedInterface().getSimpleName());
65         final Object[] objs = {};
66         final Object invoked = value.getImplementedInterface().getDeclaredMethods()[0].invoke(value, objs);
67         final Field declaredField = invoked.getClass().getDeclaredField("_id");
68         declaredField.setAccessible(true);
69         final Object id = declaredField.get(invoked);
70         final Field val = id.getClass().getDeclaredField("_value");
71         val.setAccessible(true);
72         assertEquals(42, val.get(id));
73     }
74
75     /**
76      * Negative test.
77      *
78      * <p>
79      * Test for yang with leaf of type int in container where data are created
80      * with String value (non acceptable data - should failed with
81      * {@link IllegalArgumentException})
82      *
83      * @throws Exception
84      *             - throw exception
85      */
86     @Test
87     public void fromNormalizedNodeWithAnotherInputDataTest() throws Exception {
88         final SchemaContext schemaCtx =
89                 YangParserTestUtils.parseYangFiles(new File(getClass().getResource("/test.yang").toURI()));
90         final NormalizedNode<?, ?> data = prepareData(schemaCtx, "42");
91
92         final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode = fromNormalizedNode(data, schemaCtx);
93         final DataObject value = fromNormalizedNode.getValue();
94         assertNotNull(value);
95         assertEquals("Cont", value.getImplementedInterface().getSimpleName());
96         final Object[] objs = {};
97         try {
98             value.getImplementedInterface().getDeclaredMethods()[0].invoke(value, objs);
99             fail();
100         } catch (final InvocationTargetException e) {
101             final Throwable cause = e.getCause();
102             assertNotNull(cause);
103             assertEquals(cause.getClass(), IllegalArgumentException.class);
104         }
105     }
106
107     private static NormalizedNode<?, ?> prepareData(final SchemaContext schemaCtx, final Object value) {
108         final DataSchemaNode dataChildByName =
109                 schemaCtx.getDataChildByName(QName.create("urn:test", "2017-01-01", "cont"));
110         final DataSchemaNode leaf = ((ContainerSchemaNode) dataChildByName)
111                 .getDataChildByName(QName.create("urn:test", "2017-01-01", "vlan-id"));
112
113         final DataContainerChild<?, ?> child = Builders.leafBuilder((LeafSchemaNode) leaf).withValue(value).build();
114         final NormalizedNode<?, ?> data =
115                 Builders.containerBuilder((ContainerSchemaNode) dataChildByName).withChild(child).build();
116         return data;
117     }
118
119     private static Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode(final NormalizedNode<?, ?> data,
120             final SchemaContext schemaCtx) throws Exception {
121         final DataObjectSerializerGenerator serializerGenerator =
122                 StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
123         final BindingNormalizedNodeCodecRegistry codecRegistry =
124                 new BindingNormalizedNodeCodecRegistry(serializerGenerator);
125         final GeneratedClassLoadingStrategy classLoadingStrategy =
126                 GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
127         final BindingRuntimeContext ctx = BindingRuntimeContext.create(classLoadingStrategy, schemaCtx);
128         codecRegistry.onBindingRuntimeContextUpdated(ctx);
129         final BindingToNormalizedNodeCodec codec =
130                 new BindingToNormalizedNodeCodec(classLoadingStrategy, codecRegistry);
131         final List<PathArgument> pathArgs = new ArrayList<>();
132         pathArgs.add(NodeIdentifier.create(QName.create("urn:test", "2017-01-01", "cont")));
133
134         final YangInstanceIdentifier path = YangInstanceIdentifier.create(pathArgs);
135         final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode = codec.fromNormalizedNode(path, data);
136         codec.close();
137         return fromNormalizedNode;
138     }
139 }