2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.md.sal.binding.impl.test;
9 import static org.junit.Assert.assertFalse;
10 import static org.opendaylight.controller.md.sal.binding.test.AssertCollections.assertContains;
11 import static org.opendaylight.controller.md.sal.binding.test.AssertCollections.assertEmpty;
12 import static org.opendaylight.controller.md.sal.binding.test.AssertCollections.assertNotContains;
13 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
14 import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.TOP_BAR_KEY;
15 import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.TOP_FOO_KEY;
16 import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.top;
17 import static org.opendaylight.controller.md.sal.test.model.util.ListsBindingUtils.topLevelList;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
22 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
23 import org.opendaylight.controller.md.sal.binding.test.AbstractDataChangeListenerTest;
24 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
25 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.Top;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.two.level.list.TopLevelList;
28 import org.opendaylight.yangtools.yang.binding.DataObject;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 * This testsuite tests explanation for data change scope and data modifications
33 * which were described in
34 * https://lists.opendaylight.org/pipermail/controller-dev/2014-July/005541.html.
36 public class ListInsertionDataChangeListenerTest extends AbstractDataChangeListenerTest {
38 private static final InstanceIdentifier<Top> TOP = InstanceIdentifier.create(Top.class);
39 private static final InstanceIdentifier<TopLevelList> WILDCARDED = TOP.child(TopLevelList.class);
40 private static final InstanceIdentifier<TopLevelList> TOP_FOO = TOP.child(TopLevelList.class, TOP_FOO_KEY);
41 private static final InstanceIdentifier<TopLevelList> TOP_BAR = TOP.child(TopLevelList.class, TOP_BAR_KEY);
44 public void setupWithDataBroker() {
45 WriteTransaction initialTx = getDataBroker().newWriteOnlyTransaction();
46 initialTx.put(CONFIGURATION, TOP, top(topLevelList(TOP_FOO_KEY)));
47 assertCommit(initialTx.submit());
51 public void replaceTopNodeSubtreeListeners() {
52 TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE);
53 TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE, false);
54 TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE);
55 TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE, false);
57 ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction();
58 writeTx.put(CONFIGURATION, TOP, top(topLevelList(TOP_BAR_KEY)));
59 assertCommit(writeTx.submit());
60 final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> top = topListener.event();
61 final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> all = allListener.event();
62 final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> foo = fooListener.event();
63 final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> bar = barListener.event();
65 // Listener for TOP element
66 assertContains(top.getOriginalData(), TOP,TOP_FOO);
67 assertContains(top.getCreatedData(), TOP_BAR);
68 assertContains(top.getUpdatedData(), TOP);
69 assertContains(top.getRemovedPaths(), TOP_FOO);
72 * Listener for all list items
74 * Updated should be empty, since no list item was
75 * updated, items were only removed and added
77 assertContains(all.getOriginalData(), TOP_FOO);
78 assertContains(all.getCreatedData(), TOP_BAR);
79 assertEmpty(all.getUpdatedData());
80 assertContains(all.getRemovedPaths(), TOP_FOO);
84 * Listener for all Foo item
86 * This one should see only Foo item removed
88 assertContains(foo.getOriginalData(), TOP_FOO);
89 assertEmpty(foo.getCreatedData());
90 assertEmpty(foo.getUpdatedData());
91 assertContains(foo.getRemovedPaths(), TOP_FOO);
94 * Listener for bar list items
96 * Updated should be empty, since no list item was
97 * updated, items were only removed and added
99 assertEmpty(bar.getOriginalData());
100 assertContains(bar.getCreatedData(), TOP_BAR);
101 assertEmpty(bar.getUpdatedData());
102 assertEmpty(bar.getRemovedPaths());
106 public void mergeTopNodeSubtreeListeners() {
107 TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE);
108 TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE, false);
109 TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE);
110 TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE, false);
112 ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction();
113 writeTx.merge(CONFIGURATION, TOP, top(topLevelList(TOP_BAR_KEY)));
114 assertCommit(writeTx.submit());
116 verifyBarOnlyAdded(topListener,allListener,fooListener,barListener);
120 public void putTopBarNodeSubtreeListeners() {
121 TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE);
122 TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE, false);
123 TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE);
124 TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE, false);
126 ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction();
127 writeTx.put(CONFIGURATION, TOP_BAR, topLevelList(TOP_BAR_KEY));
128 assertCommit(writeTx.submit());
130 verifyBarOnlyAdded(topListener,allListener,fooListener,barListener);
134 public void mergeTopBarNodeSubtreeListeners() {
135 TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE);
136 TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE, false);
137 TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE);
138 TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE, false);
140 ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction();
141 writeTx.merge(CONFIGURATION, TOP_BAR, topLevelList(TOP_BAR_KEY));
142 assertCommit(writeTx.submit());
144 verifyBarOnlyAdded(topListener,allListener,fooListener,barListener);
147 private void verifyBarOnlyAdded(final TestListener top, final TestListener all, final TestListener foo,
148 final TestListener bar) {
150 assertFalse(foo.hasEvent());
152 // Listener for TOP element
153 assertContains(top.event().getOriginalData(), TOP);
154 assertNotContains(top.event().getOriginalData(),TOP_FOO);
155 assertContains(top.event().getCreatedData(), TOP_BAR);
156 assertContains(top.event().getUpdatedData(), TOP);
157 assertEmpty(top.event().getRemovedPaths());
160 * Listener for all list items
162 * Updated should be empty, since no list item was
163 * updated, items were only removed and added
165 assertEmpty(all.event().getOriginalData());
166 assertContains(all.event().getCreatedData(), TOP_BAR);
167 assertEmpty(all.event().getUpdatedData());
168 assertEmpty(all.event().getRemovedPaths());
171 * Listener for all Foo item
173 * Foo Listener should not have foo event
175 assertFalse(foo.hasEvent());
178 * Listener for bar list items
180 * Updated should be empty, since no list item was
181 * updated, items were only removed and added
183 assertEmpty(bar.event().getOriginalData());
184 assertContains(bar.event().getCreatedData(), TOP_BAR);
185 assertEmpty(bar.event().getUpdatedData());
186 assertEmpty(bar.event().getRemovedPaths());