*/
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;
@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());
@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);
@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);
@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);
@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());
+ }
}