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.Test;
20 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
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;
33 * This testsuite tests explanation for data change scope and data modifications
34 * which were described in
35 * https://lists.opendaylight.org/pipermail/controller-dev/2014-July/005541.html
39 public class ListInsertionDataChangeListenerTest extends AbstractDataChangeListenerTest{
41 private static final InstanceIdentifier<Top> TOP = InstanceIdentifier.create(Top.class);
42 private static final InstanceIdentifier<TopLevelList> WILDCARDED = TOP.child(TopLevelList.class);
43 private static final InstanceIdentifier<TopLevelList> TOP_FOO = TOP.child(TopLevelList.class, TOP_FOO_KEY);
44 private static final InstanceIdentifier<TopLevelList> TOP_BAR = TOP.child(TopLevelList.class, TOP_BAR_KEY);
48 protected void setupWithDataBroker(final DataBroker dataBroker) {
49 WriteTransaction initialTx = dataBroker.newWriteOnlyTransaction();
50 initialTx.put(CONFIGURATION, TOP, top(topLevelList(TOP_FOO_KEY)));
51 assertCommit(initialTx.submit());
55 public void replaceTopNodeSubtreeListeners() {
56 TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE);
57 TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE);
58 TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE);
59 TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE);
61 ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction();
62 writeTx.put(CONFIGURATION, TOP, top(topLevelList(TOP_BAR_KEY)));
63 assertCommit(writeTx.submit());
64 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> top = topListener.event();
65 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> all = allListener.event();
66 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> foo = fooListener.event();
67 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> bar = barListener.event();
69 // Listener for TOP element
70 assertContains(top.getOriginalData(), TOP,TOP_FOO);
71 assertContains(top.getCreatedData(), TOP_BAR);
72 assertContains(top.getUpdatedData(), TOP);
73 assertContains(top.getRemovedPaths(), TOP_FOO);
76 * Listener for all list items
78 * Updated should be empty, since no list item was
79 * updated, items were only removed and added
81 assertContains(all.getOriginalData(), TOP_FOO);
82 assertContains(all.getCreatedData(), TOP_BAR);
83 assertEmpty(all.getUpdatedData());
84 assertContains(all.getRemovedPaths(), TOP_FOO);
88 * Listener for all Foo item
90 * This one should see only Foo item removed
92 assertContains(foo.getOriginalData(), TOP_FOO);
93 assertEmpty(foo.getCreatedData());
94 assertEmpty(foo.getUpdatedData());
95 assertContains(foo.getRemovedPaths(), TOP_FOO);
98 * Listener for bar list items
100 * Updated should be empty, since no list item was
101 * updated, items were only removed and added
103 assertEmpty(bar.getOriginalData());
104 assertContains(bar.getCreatedData(), TOP_BAR);
105 assertEmpty(bar.getUpdatedData());
106 assertEmpty(bar.getRemovedPaths());
110 public void mergeTopNodeSubtreeListeners() {
111 TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE);
112 TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE);
113 TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE);
114 TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE);
116 ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction();
117 writeTx.merge(CONFIGURATION, TOP, top(topLevelList(TOP_BAR_KEY)));
118 assertCommit(writeTx.submit());
120 verifyBarOnlyAdded(topListener,allListener,fooListener,barListener);
124 public void putTopBarNodeSubtreeListeners() {
125 TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE);
126 TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE);
127 TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE);
128 TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE);
130 ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction();
131 writeTx.put(CONFIGURATION, TOP_BAR, topLevelList(TOP_BAR_KEY));
132 assertCommit(writeTx.submit());
134 verifyBarOnlyAdded(topListener,allListener,fooListener,barListener);
138 public void mergeTopBarNodeSubtreeListeners() {
139 TestListener topListener = createListener(CONFIGURATION, TOP, DataChangeScope.SUBTREE);
140 TestListener allListener = createListener(CONFIGURATION, WILDCARDED, DataChangeScope.SUBTREE);
141 TestListener fooListener = createListener(CONFIGURATION, TOP_FOO, DataChangeScope.SUBTREE);
142 TestListener barListener = createListener(CONFIGURATION, TOP_BAR, DataChangeScope.SUBTREE);
144 ReadWriteTransaction writeTx = getDataBroker().newReadWriteTransaction();
145 writeTx.merge(CONFIGURATION, TOP_BAR, topLevelList(TOP_BAR_KEY));
146 assertCommit(writeTx.submit());
148 verifyBarOnlyAdded(topListener,allListener,fooListener,barListener);
151 private void verifyBarOnlyAdded(final TestListener top, final TestListener all, final TestListener foo,
152 final TestListener bar) {
154 assertFalse(foo.hasEvent());
156 // Listener for TOP element
157 assertContains(top.event().getOriginalData(), TOP);
158 assertNotContains(top.event().getOriginalData(),TOP_FOO);
159 assertContains(top.event().getCreatedData(), TOP_BAR);
160 assertContains(top.event().getUpdatedData(), TOP);
161 assertEmpty(top.event().getRemovedPaths());
164 * Listener for all list items
166 * Updated should be empty, since no list item was
167 * updated, items were only removed and added
169 assertEmpty(all.event().getOriginalData());
170 assertContains(all.event().getCreatedData(), TOP_BAR);
171 assertEmpty(all.event().getUpdatedData());
172 assertEmpty(all.event().getRemovedPaths());
175 * Listener for all Foo item
177 * Foo Listener should not have foo event
179 assertFalse(foo.hasEvent());
182 * Listener for bar list items
184 * Updated should be empty, since no list item was
185 * updated, items were only removed and added
187 assertEmpty(bar.event().getOriginalData());
188 assertContains(bar.event().getCreatedData(), TOP_BAR);
189 assertEmpty(bar.event().getUpdatedData());
190 assertEmpty(bar.event().getRemovedPaths());