/* * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * 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.assertFalse; import static org.opendaylight.controller.md.sal.binding.test.AssertCollections.assertContains; import static org.opendaylight.controller.md.sal.binding.test.AssertCollections.assertEmpty; import static org.opendaylight.controller.md.sal.binding.test.AssertCollections.assertNotContains; import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION; 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.top; import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.topLevelList; import org.junit.Test; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.binding.test.AbstractDataChangeListenerTest; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; 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.two.level.list.TopLevelList; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** * * This testsuite tests explanation for data change scope and data modifications * which were described in * https://lists.opendaylight.org/pipermail/controller-dev/2014-July/005541.html * * */ public class ListInsertionDataChangeListenerTest extends AbstractDataChangeListenerTest{ private static final InstanceIdentifier TOP = InstanceIdentifier.create(Top.class); private static final InstanceIdentifier WILDCARDED = TOP.child(TopLevelList.class); private static final InstanceIdentifier TOP_FOO = TOP.child(TopLevelList.class, TOP_FOO_KEY); private static final InstanceIdentifier TOP_BAR = TOP.child(TopLevelList.class, TOP_BAR_KEY); @Override protected void setupWithDataBroker(final DataBroker dataBroker) { WriteTransaction initialTx = dataBroker.newWriteOnlyTransaction(); initialTx.put(CONFIGURATION, TOP, top(topLevelList(TOP_FOO_KEY))); assertCommit(initialTx.submit()); } @Test public void replaceTopNodeSubtreeListeners() { TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE); TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE); TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE); TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE); ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction(); writeTx.put(CONFIGURATION, TOP, top(topLevelList(TOP_BAR_KEY))); assertCommit(writeTx.submit()); AsyncDataChangeEvent, DataObject> top = topListener.event(); AsyncDataChangeEvent, DataObject> all = allListener.event(); AsyncDataChangeEvent, DataObject> foo = fooListener.event(); AsyncDataChangeEvent, DataObject> bar = barListener.event(); // Listener for TOP element assertContains(top.getOriginalData(), TOP,TOP_FOO); assertContains(top.getCreatedData(), TOP_BAR); assertContains(top.getUpdatedData(), TOP); assertContains(top.getRemovedPaths(), TOP_FOO); /* * Listener for all list items * * Updated should be empty, since no list item was * updated, items were only removed and added */ assertContains(all.getOriginalData(), TOP_FOO); assertContains(all.getCreatedData(), TOP_BAR); assertEmpty(all.getUpdatedData()); assertContains(all.getRemovedPaths(), TOP_FOO); /* * Listener for all Foo item * * This one should see only Foo item removed */ assertContains(foo.getOriginalData(), TOP_FOO); assertEmpty(foo.getCreatedData()); assertEmpty(foo.getUpdatedData()); assertContains(foo.getRemovedPaths(), TOP_FOO); /* * Listener for bar list items * * Updated should be empty, since no list item was * updated, items were only removed and added */ assertEmpty(bar.getOriginalData()); assertContains(bar.getCreatedData(), TOP_BAR); assertEmpty(bar.getUpdatedData()); assertEmpty(bar.getRemovedPaths()); } @Test public void mergeTopNodeSubtreeListeners() { TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE); TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE); TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE); TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE); ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction(); writeTx.merge(CONFIGURATION, TOP, top(topLevelList(TOP_BAR_KEY))); assertCommit(writeTx.submit()); verifyBarOnlyAdded(topListener,allListener,fooListener,barListener); } @Test public void putTopBarNodeSubtreeListeners() { TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE); TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE); TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE); TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE); ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction(); writeTx.put(CONFIGURATION, TOP_BAR, topLevelList(TOP_BAR_KEY)); assertCommit(writeTx.submit()); verifyBarOnlyAdded(topListener,allListener,fooListener,barListener); } @Test public void mergeTopBarNodeSubtreeListeners() { TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE); TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE); TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE); TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE); ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction(); writeTx.merge(CONFIGURATION, TOP_BAR, topLevelList(TOP_BAR_KEY)); assertCommit(writeTx.submit()); verifyBarOnlyAdded(topListener,allListener,fooListener,barListener); } private void verifyBarOnlyAdded(final TestListener top, final TestListener all, final TestListener foo, final TestListener bar) { assertFalse(foo.hasEvent()); // Listener for TOP element assertContains(top.event().getOriginalData(), TOP); assertNotContains(top.event().getOriginalData(),TOP_FOO); assertContains(top.event().getCreatedData(), TOP_BAR); assertContains(top.event().getUpdatedData(), TOP); assertEmpty(top.event().getRemovedPaths()); /* * Listener for all list items * * Updated should be empty, since no list item was * updated, items were only removed and added */ assertEmpty(all.event().getOriginalData()); assertContains(all.event().getCreatedData(), TOP_BAR); assertEmpty(all.event().getUpdatedData()); assertEmpty(all.event().getRemovedPaths()); /* * Listener for all Foo item * * Foo Listener should not have foo event */ assertFalse(foo.hasEvent()); /* * Listener for bar list items * * Updated should be empty, since no list item was * updated, items were only removed and added */ assertEmpty(bar.event().getOriginalData()); assertContains(bar.event().getCreatedData(), TOP_BAR); assertEmpty(bar.event().getUpdatedData()); assertEmpty(bar.event().getRemovedPaths()); } }