Bug 7759 - TEST - Getter of BA object fails to construct class instance 64/53264/3
authorJakub Toth <jatoth@cisco.com>
Tue, 14 Mar 2017 10:10:29 +0000 (11:10 +0100)
committerJakub Toth <jatoth@cisco.com>
Tue, 14 Mar 2017 10:31:10 +0000 (11:31 +0100)
 * negative test - if value of data is other like type of data define by yang

Change-Id: Ia6a9abd43e78384f84c867cf6a755cd07d6503c6
Signed-off-by: Jakub Toth <jatoth@cisco.com>
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java

index 8eec43e8bf60a4c6a338ecbba0f0c57f5d53cfee..3ec787285f7ad64926486019e3db3482c96d6ac4 100644 (file)
@@ -7,14 +7,19 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
-import org.junit.Assert;
+import javassist.ClassPool;
 import org.junit.Test;
+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.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
@@ -26,8 +31,8 @@ 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.api.schema.NormalizedNode;
 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;
@@ -38,51 +43,93 @@ import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementR
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl;
 import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream;
-import javassist.ClassPool;
 
 public class BindingToNormalizedNodeCodecTest {
 
+    /**
+     * Test for yang with leaf of type int in container where data are created
+     * with int value (acceptable data)
+     *
+     * @throws Exception
+     */
     @Test
     public void fromNormalizedNodeTest() throws Exception {
-        final StreamWriterGenerator serializerGenerator =
-                new StreamWriterGenerator(JavassistUtils.forClassPool(ClassPool.getDefault()));
-        final BindingNormalizedNodeCodecRegistry codecRegistry =
-                new BindingNormalizedNodeCodecRegistry(serializerGenerator);
-        final GeneratedClassLoadingStrategy classLoadingStrategy =
-                GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
         final SchemaContext schemaCtx = loadSchemaContext("/");
-        final BindingRuntimeContext ctx = BindingRuntimeContext.create(classLoadingStrategy, schemaCtx);
-        codecRegistry.onBindingRuntimeContextUpdated(ctx);
-        final BindingToNormalizedNodeCodec codec =
-                new BindingToNormalizedNodeCodec(classLoadingStrategy, codecRegistry);
+        final NormalizedNode<?, ?> data = prepareData(schemaCtx, 42);
+        final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode = fromNormalizedNode(data, schemaCtx);
+
+        final DataObject value = fromNormalizedNode.getValue();
+        assertNotNull(value);
+        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);
+        assertEquals(42, val.get(id));
+    }
+
+    /**
+     * Test for yang with leaf of type int in container where data are created
+     * with String value (non acceptable data - should failed with
+     * {@link IllegalArgumentException})
+     *
+     * @throws Exception
+     */
+    @Test
+    public void fromNormalizedNodeWithAnotherInputDataTest() throws Exception {
+        final SchemaContext schemaCtx = loadSchemaContext("/");
+        final NormalizedNode<?, ?> data = prepareData(schemaCtx, "42");
 
+        final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode = fromNormalizedNode(data, schemaCtx);
+        final DataObject value = fromNormalizedNode.getValue();
+        assertNotNull(value);
+        assertEquals("Cont", value.getImplementedInterface().getSimpleName());
+        final Object objs[] = {};
+        try {
+            value.getImplementedInterface().getDeclaredMethods()[0].invoke(value, objs);
+            fail();
+        } catch (final Exception e) {
+            final Throwable cause = e.getCause();
+            assertNotNull(cause);
+            assertEquals(cause.getClass(), IllegalArgumentException.class);
+        }
+    }
+
+    private NormalizedNode<?, ?> prepareData(final SchemaContext schemaCtx, final Object value) {
         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 =
+        final DataContainerChild<?, ?> child = Builders.leafBuilder((LeafSchemaNode) leaf).withValue(value).build();
+        final NormalizedNode<?, ?> data =
                 Builders.containerBuilder((ContainerSchemaNode) dataChildByName).withChild(child).build();
+        return data;
+    }
 
+    private Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode(final NormalizedNode<?, ?> data,
+            final SchemaContext schemaCtx) throws Exception {
+        final DataObjectSerializerGenerator serializerGenerator =
+                StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
+        final BindingNormalizedNodeCodecRegistry codecRegistry =
+                new BindingNormalizedNodeCodecRegistry(serializerGenerator);
+        final GeneratedClassLoadingStrategy classLoadingStrategy =
+                GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
+        final BindingRuntimeContext ctx = BindingRuntimeContext.create(classLoadingStrategy, schemaCtx);
+        codecRegistry.onBindingRuntimeContextUpdated(ctx);
+        final BindingToNormalizedNodeCodec codec =
+                new BindingToNormalizedNodeCodec(classLoadingStrategy, codecRegistry);
 
         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));
+        codec.close();
+        return fromNormalizedNode;
     }
 
     public static SchemaContext loadSchemaContext(final String... yangPath)