X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-adapter%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fadapter%2Ftest%2FDataTreeChangeListenerTest.java;h=029e990ecf48c9c5dcfcefb824135f529f11af64;hb=0e5a91c81e8fbd2a2118acba69aa3ba6159806ba;hp=d4bfa40c610455ebd213c0b47ed7137af9d9625d;hpb=6a192f0eeedc302ae0b506d04f9d79b34406aef5;p=mdsal.git diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/DataTreeChangeListenerTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/DataTreeChangeListenerTest.java index d4bfa40c61..029e990ecf 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/DataTreeChangeListenerTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/DataTreeChangeListenerTest.java @@ -11,30 +11,31 @@ package org.opendaylight.mdsal.binding.dom.adapter.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.TOP_BAR_KEY; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.TOP_FOO_KEY; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.USES_ONE_KEY; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.complexUsesAugment; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.path; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.top; -import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.topLevelList; - -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.TOP_BAR_KEY; +import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.TOP_FOO_KEY; +import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.USES_ONE_KEY; +import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.complexUsesAugment; +import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.path; +import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.top; +import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.topLevelList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.util.concurrent.SettableFuture; +import java.util.Collection; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.junit.Test; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataObjectModification; +import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType; import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.binding.api.WriteTransaction; -import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType; import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.SettableFuture; -import java.util.Collection; -import java.util.concurrent.TimeUnit; -import org.junit.Test; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; 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.binding.rev140701.Top; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.TwoLevelList; @@ -43,20 +44,19 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; public class DataTreeChangeListenerTest extends AbstractDataBrokerTest { private static final InstanceIdentifier TOP_PATH = InstanceIdentifier.create(Top.class); - private static final PathArgument TOP_ARGUMENT= TOP_PATH.getPathArguments().iterator().next(); + private static final PathArgument TOP_ARGUMENT = TOP_PATH.getPathArguments().iterator().next(); private static final InstanceIdentifier FOO_PATH = path(TOP_FOO_KEY); private static final PathArgument FOO_ARGUMENT = Iterables.getLast(FOO_PATH.getPathArguments()); private static final TopLevelList FOO_DATA = topLevelList(TOP_FOO_KEY, complexUsesAugment(USES_ONE_KEY)); private static final InstanceIdentifier BAR_PATH = path(TOP_BAR_KEY); private static final PathArgument BAR_ARGUMENT = Iterables.getLast(BAR_PATH.getPathArguments()); private static final TopLevelList BAR_DATA = topLevelList(TOP_BAR_KEY); -private static final DataTreeIdentifier TOP_IDENTIFIER = new DataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, - TOP_PATH); + private static final DataTreeIdentifier TOP_IDENTIFIER + = DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, TOP_PATH); private static final Top TOP_INITIAL_DATA = top(FOO_DATA); @@ -64,24 +64,23 @@ private static final DataTreeIdentifier TOP_IDENTIFIER = new DataTreeIdenti private static final class EventCapturingListener implements DataTreeChangeListener { - private SettableFuture>> changes = SettableFuture.create(); + private SettableFuture>> futureChanges = SettableFuture.create(); @Override public void onDataTreeChanged(final Collection> changes) { - this.changes.set(changes); + this.futureChanges.set(changes); } Collection> nextEvent() throws Exception { - final Collection> result = changes.get(200,TimeUnit.MILLISECONDS); - changes = SettableFuture.create(); + final Collection> result = futureChanges.get(200,TimeUnit.MILLISECONDS); + futureChanges = SettableFuture.create(); return result; } - } @Override - protected Iterable getModuleInfos() throws Exception { + protected Set getModuleInfos() throws Exception { return ImmutableSet.of( BindingReflections.getModuleInfo(TwoLevelList.class), BindingReflections.getModuleInfo(TreeComplexUsesAugment.class) @@ -100,47 +99,66 @@ private static final DataTreeIdentifier TOP_IDENTIFIER = new DataTreeIdenti createAndVerifyTop(listener); - putTx(BAR_PATH, BAR_DATA).submit().checkedGet(); - final DataObjectModification afterBarPutEvent = Iterables.getOnlyElement(listener.nextEvent()).getRootNode(); + putTx(BAR_PATH, BAR_DATA).commit().get(); + final DataObjectModification afterBarPutEvent + = Iterables.getOnlyElement(listener.nextEvent()).getRootNode(); verifyModification(afterBarPutEvent, TOP_ARGUMENT, ModificationType.SUBTREE_MODIFIED); - final DataObjectModification barPutMod = afterBarPutEvent.getModifiedChildListItem(TopLevelList.class, TOP_BAR_KEY); + final DataObjectModification barPutMod = afterBarPutEvent.getModifiedChildListItem( + TopLevelList.class, TOP_BAR_KEY); assertNotNull(barPutMod); verifyModification(barPutMod, BAR_ARGUMENT, ModificationType.WRITE); - deleteTx(BAR_PATH).submit().checkedGet(); - final DataObjectModification afterBarDeleteEvent = Iterables.getOnlyElement(listener.nextEvent()).getRootNode(); + deleteTx(BAR_PATH).commit().get(); + final DataObjectModification afterBarDeleteEvent + = Iterables.getOnlyElement(listener.nextEvent()).getRootNode(); verifyModification(afterBarDeleteEvent, TOP_ARGUMENT, ModificationType.SUBTREE_MODIFIED); - final DataObjectModification barDeleteMod = afterBarDeleteEvent.getModifiedChildListItem(TopLevelList.class, TOP_BAR_KEY); + final DataObjectModification barDeleteMod = afterBarDeleteEvent.getModifiedChildListItem( + TopLevelList.class, TOP_BAR_KEY); verifyModification(barDeleteMod, BAR_ARGUMENT, ModificationType.DELETE); + + dataBrokerImpl.registerDataTreeChangeListener(TOP_IDENTIFIER, listener).close(); } @Test public void testWildcardedListListener() throws Exception { final EventCapturingListener listener = new EventCapturingListener<>(); - final DataTreeIdentifier wildcard = new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, TOP_PATH.child(TopLevelList.class)); + final DataTreeIdentifier wildcard = DataTreeIdentifier.create( + LogicalDatastoreType.OPERATIONAL, TOP_PATH.child(TopLevelList.class)); dataBrokerImpl.registerDataTreeChangeListener(wildcard, listener); - putTx(TOP_PATH, TOP_INITIAL_DATA).submit().checkedGet(); + putTx(TOP_PATH, TOP_INITIAL_DATA).commit().get(); final DataTreeModification fooWriteEvent = Iterables.getOnlyElement(listener.nextEvent()); assertEquals(FOO_PATH, fooWriteEvent.getRootPath().getRootIdentifier()); verifyModification(fooWriteEvent.getRootNode(), FOO_ARGUMENT, ModificationType.WRITE); - putTx(BAR_PATH, BAR_DATA).submit().checkedGet(); + putTx(BAR_PATH, BAR_DATA).commit().get(); final DataTreeModification barWriteEvent = Iterables.getOnlyElement(listener.nextEvent()); assertEquals(BAR_PATH, barWriteEvent.getRootPath().getRootIdentifier()); verifyModification(barWriteEvent.getRootNode(), BAR_ARGUMENT, ModificationType.WRITE); - deleteTx(BAR_PATH).submit().checkedGet(); + deleteTx(BAR_PATH).commit().get(); final DataTreeModification barDeleteEvent = Iterables.getOnlyElement(listener.nextEvent()); assertEquals(BAR_PATH, barDeleteEvent.getRootPath().getRootIdentifier()); verifyModification(barDeleteEvent.getRootNode(), BAR_ARGUMENT, ModificationType.DELETE); } + @Test + public void testWildcardedListListenerWithPreexistingData() throws Exception { + putTx(TOP_PATH, TOP_INITIAL_DATA).commit().get(); + final EventCapturingListener listener = new EventCapturingListener<>(); + final DataTreeIdentifier wildcard = DataTreeIdentifier.create( + LogicalDatastoreType.OPERATIONAL, TOP_PATH.child(TopLevelList.class)); + dataBrokerImpl.registerDataTreeChangeListener(wildcard, listener); + + final DataTreeModification fooWriteEvent = Iterables.getOnlyElement(listener.nextEvent()); + assertEquals(FOO_PATH, fooWriteEvent.getRootPath().getRootIdentifier()); + verifyModification(fooWriteEvent.getRootNode(), FOO_ARGUMENT, ModificationType.WRITE); + } private void createAndVerifyTop(final EventCapturingListener listener) throws Exception { - putTx(TOP_PATH,TOP_INITIAL_DATA).submit().checkedGet(); + putTx(TOP_PATH,TOP_INITIAL_DATA).commit().get(); final Collection> events = listener.nextEvent(); assertFalse("Non empty collection should be received.",events.isEmpty()); @@ -150,14 +168,14 @@ private static final DataTreeIdentifier TOP_IDENTIFIER = new DataTreeIdenti assertEquals(TOP_INITIAL_DATA, initialNode.getDataAfter()); } - private void verifyModification(final DataObjectModification barWrite, final PathArgument pathArg, - final ModificationType eventType) { + private static void verifyModification(final DataObjectModification barWrite, + final PathArgument pathArg, final ModificationType eventType) { assertEquals(pathArg.getType(), barWrite.getDataType()); assertEquals(eventType,barWrite.getModificationType()); assertEquals(pathArg, barWrite.getIdentifier()); } - private WriteTransaction putTx(final InstanceIdentifier path,final T data) { + private WriteTransaction putTx(final InstanceIdentifier path, final T data) { final WriteTransaction tx = dataBrokerImpl.newWriteOnlyTransaction(); tx.put(LogicalDatastoreType.OPERATIONAL, path, data); return tx;