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=bfa7e827251d86944ef77ea573b4330158b4c7f5;hp=4a4137c2a5d2a8b43d373162d1f94a759aa5a87f;hb=3ec97cd0a86ad1b79f6854dc6924eb7b06e359a3;hpb=ed8f40c01c61ed505cb0c4d5b307a8dea0acc82f 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 4a4137c2a5..bfa7e82725 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,9 +24,13 @@ 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; @@ -33,30 +39,33 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; 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.AbstractDataBrokerTest; +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 AbstractDataBrokerTest { +@Deprecated +public class DataTreeChangeListenerTest extends AbstractConcurrentDataBrokerTest { 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 = + new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, TOP_PATH); private static final Top TOP_INITIAL_DATA = top(FOO_DATA); @@ -67,8 +76,8 @@ private static final DataTreeIdentifier TOP_IDENTIFIER = new DataTreeIdenti 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,20 +86,19 @@ private static final DataTreeIdentifier TOP_IDENTIFIER = new DataTreeIdenti 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) ); } - @Override - protected void setupWithDataBroker(final DataBroker dataBroker) { - dataBrokerImpl = (BindingDOMDataBrokerAdapter) dataBroker; + @Before + public void setupWithDataBroker() { + dataBrokerImpl = (BindingDOMDataBrokerAdapter) getDataBroker(); } @Test @@ -101,23 +109,28 @@ 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(); + 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 +150,28 @@ private static final DataTreeIdentifier TOP_IDENTIFIER = new DataTreeIdenti 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 +184,8 @@ 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());