X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fbinding%2Fimpl%2Ftest%2FDataTreeChangeListenerTest.java;h=8887be0a6410383e5d1cf52b9f28d61d381ccf8e;hp=4e9a79f8690bd63c0f6839930c3df68ca5252b61;hb=b681508d95a7897da263a92f7e3f0aff0adecb33;hpb=8a8de0bffed5b6c9b4ac821dfafa7e944c70ef9d diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/DataTreeChangeListenerTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/DataTreeChangeListenerTest.java index 4e9a79f869..8887be0a64 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/DataTreeChangeListenerTest.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/test/DataTreeChangeListenerTest.java @@ -5,12 +5,14 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.md.sal.binding.impl.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; 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; @@ -22,10 +24,14 @@ import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUti import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.util.concurrent.SettableFuture; +import java.util.ArrayList; import java.util.Collection; +import java.util.Set; import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; +import org.mockito.Matchers; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType; import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; @@ -35,15 +41,17 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataBrokerAdapter; import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.augment.rev140709.TreeComplexUsesAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.Top; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.TopBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.TwoLevelList; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.two.level.list.TopLevelList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.two.level.list.TopLevelListBuilder; 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 AbstractConcurrentDataBrokerTest { @@ -67,8 +75,8 @@ public class DataTreeChangeListenerTest extends AbstractConcurrentDataBrokerTest private SettableFuture>> changes = SettableFuture.create(); @Override - public void onDataTreeChanged(final Collection> changes) { - this.changes.set(changes); + public void onDataTreeChanged(final Collection> modification) { + this.changes.set(modification); } @@ -77,11 +85,10 @@ public class DataTreeChangeListenerTest extends AbstractConcurrentDataBrokerTest changes = 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) @@ -101,23 +108,28 @@ public class DataTreeChangeListenerTest extends AbstractConcurrentDataBrokerTest createAndVerifyTop(listener); putTx(BAR_PATH, BAR_DATA).submit().checkedGet(); - final DataObjectModification afterBarPutEvent = Iterables.getOnlyElement(listener.nextEvent()).getRootNode(); + 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(); + 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); } @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 = new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + TOP_PATH.child(TopLevelList.class)); dataBrokerImpl.registerDataTreeChangeListener(wildcard, listener); putTx(TOP_PATH, TOP_INITIAL_DATA).submit().checkedGet(); @@ -137,7 +149,28 @@ public class DataTreeChangeListenerTest extends AbstractConcurrentDataBrokerTest verifyModification(barDeleteEvent.getRootNode(), BAR_ARGUMENT, ModificationType.DELETE); } + @SuppressWarnings("unchecked") + @Test + public void testWildcardNotificationOfPreexistingData() { + InstanceIdentifier id = InstanceIdentifier.builder(Top.class).build(); + ArrayList list = new ArrayList<>(); + list.add(new TopLevelListBuilder().setName("name").build()); + TopBuilder builder = new TopBuilder().setTopLevelList(list); + + DataBroker dataBroker = getDataBroker(); + WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); + writeTransaction.put(LogicalDatastoreType.OPERATIONAL, id, builder.build()); + assertCommit(writeTransaction.submit()); + + DataTreeChangeListener listener = mock(DataTreeChangeListener.class); + InstanceIdentifier wildcard = InstanceIdentifier.builder(Top.class).child(TopLevelList.class) + .build(); + dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, wildcard), + listener); + + verify(listener, timeout(1000)).onDataTreeChanged(Matchers.anyObject()); + } private void createAndVerifyTop(final EventCapturingListener listener) throws Exception { putTx(TOP_PATH,TOP_INITIAL_DATA).submit().checkedGet(); @@ -150,8 +183,8 @@ public class DataTreeChangeListenerTest extends AbstractConcurrentDataBrokerTest 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());