Bug 7759 - TEST - Getter of BA object fails to construct class instance 75/53075/3
authorJakub Toth <jatoth@cisco.com>
Thu, 9 Mar 2017 10:31:08 +0000 (11:31 +0100)
committerMartin Ciglan <mciglan@cisco.com>
Thu, 9 Mar 2017 14:25:52 +0000 (14:25 +0000)
Change-Id: Idfb3ceabe6808bcd9c421d189566f680f8f0077f
Signed-off-by: Jakub Toth <jatoth@cisco.com>
(cherry picked from commit db2d6f91b55a28d5da6e6b362295b1d412d8d363)

binding/mdsal-binding-dom-adapter/pom.xml
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/test/resources/test.yang [new file with mode: 0644]
binding/mdsal-binding-test-model/src/main/java/org/opendaylight/yang/gen/v1/urn/test/rev170101/ContVlanIdBuilder.java [new file with mode: 0644]
binding/mdsal-binding-test-model/src/main/yang/test.yang [new file with mode: 0644]

index 4cb8fba78007476924dc7edef5b949e31b4dfa71..40b3b13b43ba43af6fe8a2ca2a5a997a90923503 100644 (file)
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-model-util</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-test-util</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java
new file mode 100644 (file)
index 0000000..78c6737
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.dom.adapter;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map.Entry;
+import javassist.ClassPool;
+import org.junit.Assert;
+import org.junit.Test;
+import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
+import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
+import org.opendaylight.mdsal.binding.generator.util.JavassistUtils;
+import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator;
+import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
+import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
+
+public class BindingToNormalizedNodeCodecTest {
+
+    @Test
+    public void fromNormalizedNodeTest() throws Exception {
+        final DataObjectSerializerGenerator serializerGenerator =
+                StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
+        final BindingNormalizedNodeCodecRegistry codecRegistry =
+                new BindingNormalizedNodeCodecRegistry(serializerGenerator);
+        final GeneratedClassLoadingStrategy classLoadingStrategy =
+                GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
+        final SchemaContext schemaCtx = YangParserTestUtils.parseYangSource("/test.yang");
+        final BindingRuntimeContext ctx = BindingRuntimeContext.create(classLoadingStrategy, schemaCtx);
+        codecRegistry.onBindingRuntimeContextUpdated(ctx);
+        final BindingToNormalizedNodeCodec codec =
+                new BindingToNormalizedNodeCodec(classLoadingStrategy, codecRegistry);
+
+        final DataSchemaNode dataChildByName =
+                schemaCtx.getDataChildByName(QName.create("urn:test", "2017-01-01", "cont"));
+        final DataSchemaNode leaf = ((ContainerSchemaNode) dataChildByName)
+                .getDataChildByName(QName.create("urn:test", "2017-01-01", "vlan-id"));
+
+        final DataContainerChild<?, ?> child = Builders.leafBuilder((LeafSchemaNode) leaf).withValue(2420).build();
+        final ContainerNode data =
+                Builders.containerBuilder((ContainerSchemaNode) dataChildByName).withChild(child).build();
+
+        final List<PathArgument> pathArgs = new ArrayList<>();
+        pathArgs.add(NodeIdentifier.create(QName.create("urn:test", "2017-01-01", "cont")));
+
+        final YangInstanceIdentifier path = YangInstanceIdentifier.create(pathArgs);
+        final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode = codec.fromNormalizedNode(path, data);
+
+        final DataObject value = fromNormalizedNode.getValue();
+        Assert.assertNotNull(value);
+        Assert.assertEquals("Cont", value.getImplementedInterface().getSimpleName());
+        final Object[] objs = {};
+        final Object invoked = value.getImplementedInterface().getDeclaredMethods()[0].invoke(value, objs);
+        final Field declaredField = invoked.getClass().getDeclaredField("_id");
+        declaredField.setAccessible(true);
+        final Object id = declaredField.get(invoked);
+        final Field val = id.getClass().getDeclaredField("_value");
+        val.setAccessible(true);
+        Assert.assertEquals(2420, val.get(id));
+    }
+}
diff --git a/binding/mdsal-binding-dom-adapter/src/test/resources/test.yang b/binding/mdsal-binding-dom-adapter/src/test/resources/test.yang
new file mode 100644 (file)
index 0000000..fec593d
--- /dev/null
@@ -0,0 +1,26 @@
+module test{
+    namespace "urn:test";
+    prefix tst;
+
+    revision 2017-01-01;
+
+    typedef id {
+        type uint16 {
+          range "1..4094";
+        }
+    }
+
+    container cont{
+        leaf vlan-id {
+            type union {
+              type id;
+              type enumeration {
+                enum "any" {
+                  value 4096;
+                }
+              }
+            }
+            mandatory true;
+          }
+    }
+}
\ No newline at end of file
diff --git a/binding/mdsal-binding-test-model/src/main/java/org/opendaylight/yang/gen/v1/urn/test/rev170101/ContVlanIdBuilder.java b/binding/mdsal-binding-test-model/src/main/java/org/opendaylight/yang/gen/v1/urn/test/rev170101/ContVlanIdBuilder.java
new file mode 100644 (file)
index 0000000..bc623e1
--- /dev/null
@@ -0,0 +1,20 @@
+package org.opendaylight.yang.gen.v1.urn.test.rev170101;
+import org.opendaylight.yang.gen.v1.urn.test.rev170101.Cont.VlanId;
+
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class ContVlanIdBuilder {
+
+    public static VlanId getDefaultInstance(java.lang.String defaultValue) {
+        throw new java.lang.UnsupportedOperationException("Not yet implemented");
+    }
+
+}
diff --git a/binding/mdsal-binding-test-model/src/main/yang/test.yang b/binding/mdsal-binding-test-model/src/main/yang/test.yang
new file mode 100644 (file)
index 0000000..6a95fdd
--- /dev/null
@@ -0,0 +1,26 @@
+module test{
+    namespace "urn:test";
+    prefix tst;
+
+    revision 2017-01-01;
+
+    typedef id {
+        type uint16 {
+          range "1..4094";
+        }
+    }
+
+    container cont{
+        leaf vlan-id {
+            type union {
+              type id;
+              type enumeration {
+                enum "any" {
+                  value 4096;
+                }
+              }
+            }
+            mandatory true;
+          }
+    }
+}