Adopt odlparent-10.0.0/yangtools-8.0.0-SNAPSHOT
[mdsal.git] / binding / mdsal-binding-dom-codec / src / test / java / org / opendaylight / mdsal / binding / dom / codec / impl / InstanceIdentifierSerializeDeserializeTest.java
index bbcb8937730cea8a157a5f705d173f5108ed49e4..e000547f16696173ace68e1b8b6967ff2bd0fba7 100644 (file)
@@ -7,13 +7,21 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
+import static org.hamcrest.CoreMatchers.startsWith;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.Iterables;
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.dom.codec.api.IncorrectNestingException;
+import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Lst;
+import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lst.Foo;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.notification.rev150205.OutOfPixieDustNotification;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.md.sal.knock.knock.rev180723.KnockKnockInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
@@ -60,19 +68,21 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testYangIIToBindingAwareII() {
-        final InstanceIdentifier<?> instanceIdentifier = registry.fromYangInstanceIdentifier(BI_TOP_PATH);
+        final InstanceIdentifier<?> instanceIdentifier = codecContext.fromYangInstanceIdentifier(BI_TOP_PATH);
         assertEquals(Top.class, instanceIdentifier.getTargetType());
     }
 
     @Test
     public void testYangIIToBindingAwareIIListWildcarded() {
-        final InstanceIdentifier<?> instanceIdentifier = registry.fromYangInstanceIdentifier(BI_TOP_LEVEL_LIST_PATH);
+        final InstanceIdentifier<?> instanceIdentifier = codecContext.fromYangInstanceIdentifier(
+            BI_TOP_LEVEL_LIST_PATH);
         assertNull(instanceIdentifier);
     }
 
     @Test
     public void testYangIIToBindingAwareIIListWithKey() {
-        final InstanceIdentifier<?> instanceIdentifier = registry.fromYangInstanceIdentifier(BI_TOP_LEVEL_LIST_1_PATH);
+        final InstanceIdentifier<?> instanceIdentifier = codecContext.fromYangInstanceIdentifier(
+            BI_TOP_LEVEL_LIST_1_PATH);
         final InstanceIdentifier.PathArgument last = Iterables.getLast(instanceIdentifier.getPathArguments());
         assertEquals(TopLevelList.class, instanceIdentifier.getTargetType());
         assertFalse(instanceIdentifier.isWildcarded());
@@ -84,7 +94,7 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testBindingAwareIIToYangIContainer() {
-        final YangInstanceIdentifier yangInstanceIdentifier = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier yangInstanceIdentifier = codecContext.toYangInstanceIdentifier(
                 InstanceIdentifier.create(Top.class).child(TopLevelList.class));
         final PathArgument lastPathArgument = yangInstanceIdentifier.getLastPathArgument();
         assertTrue(lastPathArgument instanceof NodeIdentifier);
@@ -93,7 +103,7 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testBindingAwareIIToYangIIWildcard() {
-        final YangInstanceIdentifier yangInstanceIdentifier = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier yangInstanceIdentifier = codecContext.toYangInstanceIdentifier(
                 InstanceIdentifier.create(Top.class).child(TopLevelList.class));
         final PathArgument lastPathArgument = yangInstanceIdentifier.getLastPathArgument();
         assertTrue(lastPathArgument instanceof NodeIdentifier);
@@ -102,7 +112,7 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testBindingAwareIIToYangIIListWithKey() {
-        final YangInstanceIdentifier yangInstanceIdentifier = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier yangInstanceIdentifier = codecContext.toYangInstanceIdentifier(
                 InstanceIdentifier.create(Top.class).child(TopLevelList.class, TOP_FOO_KEY));
         final PathArgument lastPathArgument = yangInstanceIdentifier.getLastPathArgument();
         assertTrue(lastPathArgument instanceof NodeIdentifierWithPredicates);
@@ -112,67 +122,104 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testBindingAwareIIToYangIIAugmentation() {
-        final PathArgument lastArg = registry.toYangInstanceIdentifier(BA_TREE_COMPLEX_USES).getLastPathArgument();
+        final PathArgument lastArg = codecContext.toYangInstanceIdentifier(BA_TREE_COMPLEX_USES).getLastPathArgument();
         assertTrue(lastArg instanceof AugmentationIdentifier);
     }
 
     @Test
     public void testBindingAwareIIToYangIILeafOnlyAugmentation() {
-        final PathArgument leafOnlyLastArg = registry.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY).getLastPathArgument();
+        final PathArgument leafOnlyLastArg = codecContext.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY)
+                .getLastPathArgument();
         assertTrue(leafOnlyLastArg instanceof AugmentationIdentifier);
         assertTrue(((AugmentationIdentifier) leafOnlyLastArg).getPossibleChildNames().contains(SIMPLE_VALUE_QNAME));
     }
 
     @Test
     public void testChoiceCaseGroupingFromBinding() {
-        final YangInstanceIdentifier contBase = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier contBase = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(Cont.class).child(ContBase.class, GrpCont.class).build());
         assertEquals(YangInstanceIdentifier.create(NodeIdentifier.create(Cont.QNAME),
             NodeIdentifier.create(ContChoice.QNAME), NodeIdentifier.create(GrpCont.QNAME)), contBase);
 
-        final YangInstanceIdentifier contAug = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier contAug = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(Cont.class).child(ContAug.class, GrpCont.class).build());
         assertEquals(YangInstanceIdentifier.create(NodeIdentifier.create(Cont.QNAME),
             NodeIdentifier.create(ContChoice.QNAME),
-            NodeIdentifier.create(GrpCont.QNAME.withModule(ContAug.QNAME.getModule()))), contAug);
+            NodeIdentifier.create(GrpCont.QNAME.bindTo(ContAug.QNAME.getModule()))), contAug);
 
         // Legacy: downcast the child to Class, losing type safety but still working. Faced with ambiguity, it will
         //         select the lexically-lower class
         assertEquals(1, ContBase.class.getCanonicalName().compareTo(ContAug.class.getCanonicalName()));
-        final YangInstanceIdentifier contAugLegacy = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier contAugLegacy = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(Cont.class).child((Class) GrpCont.class).build());
         assertEquals(contAug, contAugLegacy);
 
-        final YangInstanceIdentifier rootBase = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier rootBase = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(RootBase.class, GrpCont.class).build());
         assertEquals(YangInstanceIdentifier.create(NodeIdentifier.create(Root.QNAME),
             NodeIdentifier.create(GrpCont.QNAME)), rootBase);
 
-        final YangInstanceIdentifier rootAug = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier rootAug = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(RootAug.class, GrpCont.class).build());
         assertEquals(YangInstanceIdentifier.create(NodeIdentifier.create(Root.QNAME),
-            NodeIdentifier.create(GrpCont.QNAME.withModule(RootAug.QNAME.getModule()))), rootAug);
+            NodeIdentifier.create(GrpCont.QNAME.bindTo(RootAug.QNAME.getModule()))), rootAug);
     }
 
     @Test
     public void testChoiceCaseGroupingToBinding() {
-        final InstanceIdentifier<?> contBase = registry.fromYangInstanceIdentifier(
+        final InstanceIdentifier<?> contBase = codecContext.fromYangInstanceIdentifier(
             YangInstanceIdentifier.create(NodeIdentifier.create(Cont.QNAME),
             NodeIdentifier.create(ContChoice.QNAME), NodeIdentifier.create(GrpCont.QNAME)));
         assertEquals(InstanceIdentifier.builder(Cont.class).child(ContBase.class, GrpCont.class).build(), contBase);
 
-        final InstanceIdentifier<?> contAug = registry.fromYangInstanceIdentifier(
+        final InstanceIdentifier<?> contAug = codecContext.fromYangInstanceIdentifier(
             YangInstanceIdentifier.create(NodeIdentifier.create(Cont.QNAME), NodeIdentifier.create(ContChoice.QNAME),
-                NodeIdentifier.create(GrpCont.QNAME.withModule(ContAug.QNAME.getModule()))));
+                NodeIdentifier.create(GrpCont.QNAME.bindTo(ContAug.QNAME.getModule()))));
         assertEquals(InstanceIdentifier.builder(Cont.class).child(ContAug.class, GrpCont.class).build(), contAug);
 
-        final InstanceIdentifier<?> rootBase = registry.fromYangInstanceIdentifier(
+        final InstanceIdentifier<?> rootBase = codecContext.fromYangInstanceIdentifier(
             YangInstanceIdentifier.create(NodeIdentifier.create(Root.QNAME), NodeIdentifier.create(GrpCont.QNAME)));
         assertEquals(InstanceIdentifier.builder(RootBase.class, GrpCont.class).build(), rootBase);
 
-        final InstanceIdentifier<?> rootAug = registry.fromYangInstanceIdentifier(
+        final InstanceIdentifier<?> rootAug = codecContext.fromYangInstanceIdentifier(
             YangInstanceIdentifier.create(NodeIdentifier.create(Root.QNAME),
-                NodeIdentifier.create(GrpCont.QNAME.withModule(RootAug.QNAME.getModule()))));
+                NodeIdentifier.create(GrpCont.QNAME.bindTo(RootAug.QNAME.getModule()))));
         assertEquals(InstanceIdentifier.builder(RootAug.class, GrpCont.class).build(), rootAug);
     }
+
+    @Test
+    public void testRejectNotificationQName() {
+        // A purposely-wrong YangInstanceIdentifier
+        final var yiid = YangInstanceIdentifier.create(NodeIdentifier.create(OutOfPixieDustNotification.QNAME));
+        final var ex = assertThrows(IncorrectNestingException.class,
+            () -> codecContext.fromYangInstanceIdentifier(yiid));
+        assertThat(ex.getMessage(),
+            startsWith("Argument (urn:opendaylight:params:xml:ns:yang:controller:md:sal:test:bi:ba:notification"
+                + "?revision=2015-02-05)out-of-pixie-dust-notification is not valid data tree child of "));
+    }
+
+    @Test
+    public void testRejectRpcQName() {
+        // A purposely-wrong YangInstanceIdentifier
+        final var yiid = YangInstanceIdentifier.create(NodeIdentifier.create(
+            // TODO: use the RPC interface once we are generating it
+            QName.create(KnockKnockInput.QNAME, "knock-knock")));
+        final var ex = assertThrows(IncorrectNestingException.class,
+            () -> codecContext.fromYangInstanceIdentifier(yiid));
+        assertThat(ex.getMessage(), startsWith("Argument (urn:opendaylight:params:xml:ns:yang:md:sal:knock-knock"
+            + "?revision=2018-07-23)knock-knock is not valid child of "));
+    }
+
+    @Test
+    public void testRejectActionQName() {
+        // A purposely-wrong YangInstanceIdentifier
+        final var yiid = YangInstanceIdentifier.create(
+            NodeIdentifier.create(Lst.QNAME),
+            NodeIdentifierWithPredicates.of(Lst.QNAME, QName.create(Lst.QNAME, "key"), "foo"),
+            NodeIdentifier.create(Foo.QNAME));
+        final var ex = assertThrows(IncorrectNestingException.class,
+            () -> codecContext.fromYangInstanceIdentifier(yiid));
+        assertEquals("Argument (urn:odl:actions)foo is not valid child of "
+            + "EmptyListEffectiveStatement{argument=(urn:odl:actions)lst}", ex.getMessage());
+    }
 }