From: Jakub Toth Date: Tue, 14 Mar 2017 10:10:29 +0000 (+0100) Subject: Bug 7759 - TEST - Getter of BA object fails to construct class instance X-Git-Tag: release/boron-sr3~1 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F64%2F53264%2F3;hp=7b7b266da5becc659df7be24ebafd78ef4639d52;p=mdsal.git Bug 7759 - TEST - Getter of BA object fails to construct class instance * negative test - if value of data is other like type of data define by yang Change-Id: Ia6a9abd43e78384f84c867cf6a755cd07d6503c6 Signed-off-by: Jakub Toth --- 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 index 8eec43e8bf..3ec787285f 100644 --- 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 @@ -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, 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, 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, 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 pathArgs = new ArrayList<>(); pathArgs.add(NodeIdentifier.create(QName.create("urn:test", "2017-01-01", "cont"))); final YangInstanceIdentifier path = YangInstanceIdentifier.create(pathArgs); final Entry, 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)