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.mdsal.binding.dom.adapter;
10 import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.TOP_BAR_KEY;
11 import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.TOP_FOO_KEY;
12 import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.top;
13 import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.topLevelList;
14 import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
16 import java.util.HashSet;
17 import java.util.Objects;
19 import java.util.stream.Collectors;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType;
23 import org.opendaylight.mdsal.binding.api.WriteTransaction;
24 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataTreeChangeListenerTest;
25 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListBuilder;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
33 * This testsuite tests explanation for data change scope and data modifications which were described in
34 * https://lists.opendaylight.org/pipermail/controller-dev/2014-July/005541.html.
36 public class ListInsertionDataChangeListenerTest extends AbstractDataTreeChangeListenerTest {
37 private static final InstanceIdentifier<Top> TOP = InstanceIdentifier.create(Top.class);
38 private static final InstanceIdentifier<TopLevelList> WILDCARDED = TOP.child(TopLevelList.class);
39 private static final InstanceIdentifier<TopLevelList> TOP_FOO = TOP.child(TopLevelList.class, TOP_FOO_KEY);
40 private static final InstanceIdentifier<TopLevelList> TOP_BAR = TOP.child(TopLevelList.class, TOP_BAR_KEY);
43 protected Set<YangModuleInfo> getModuleInfos() throws Exception {
44 return Set.of(BindingRuntimeHelpers.getYangModuleInfo(Top.class));
48 public void setupWithDataBroker() {
49 WriteTransaction initialTx = getDataBroker().newWriteOnlyTransaction();
50 initialTx.put(CONFIGURATION, TOP, top(topLevelList(TOP_FOO_KEY)));
51 assertCommit(initialTx.commit());
55 public void replaceTopNodeSubtreeListeners() {
56 final TopLevelList topBar = topLevelList(TOP_BAR_KEY);
57 final Top top = top(topBar);
58 final TopLevelList topFoo = topLevelList(TOP_FOO_KEY);
60 // Listener for TOP element
61 try (var topListener = createCollector(CONFIGURATION, TOP)) {
62 // Listener for all list items. This one should see Foo item deleted and Bar item added.
63 try (var allListener = createCollector(CONFIGURATION, WILDCARDED)) {
64 // Listener for all Foo item. This one should see only Foo item deleted.
65 try (var fooListener = createCollector(CONFIGURATION, TOP_FOO)) {
66 // Listener for bar list items.
67 try (var barListener = createCollector(CONFIGURATION, TOP_BAR)) {
68 final var writeTx = getDataBroker().newWriteOnlyTransaction();
69 writeTx.put(CONFIGURATION, TOP, top);
70 assertCommit(writeTx.commit());
72 barListener.verifyModifications(added(TOP_BAR, topBar));
74 fooListener.verifyModifications(added(TOP_FOO, topFoo), deleted(TOP_FOO, topFoo));
76 allListener.verifyModifications(
77 added(TOP_FOO, topFoo),
78 added(TOP_BAR, topBar),
79 deleted(TOP_FOO, topFoo));
81 topListener.verifyModifications(
82 added(TOP, top(topLevelList(TOP_FOO_KEY))),
83 replaced(TOP, top(topFoo), top));
88 public void mergeTopNodeSubtreeListeners() {
89 final var topBar = topLevelList(TOP_BAR_KEY);
90 final var topFoo = topLevelList(TOP_FOO_KEY);
92 try (var topListener = createCollector(CONFIGURATION, TOP)) {
93 try (var allListener = createCollector(CONFIGURATION, WILDCARDED)) {
94 try (var fooListener = createCollector(CONFIGURATION, TOP_FOO)) {
95 try (var barListener = createCollector(CONFIGURATION, TOP_BAR)) {
96 final var writeTx = getDataBroker().newWriteOnlyTransaction();
97 writeTx.merge(CONFIGURATION, TOP, top(topLevelList(TOP_BAR_KEY)));
98 assertCommit(writeTx.commit());
100 barListener.verifyModifications(added(TOP_BAR, topBar));
102 fooListener.verifyModifications(added(TOP_FOO, topFoo));
104 allListener.verifyModifications(added(TOP_FOO, topFoo), added(TOP_BAR, topBar));
106 topListener.verifyModifications(
107 added(TOP, top(topLevelList(TOP_FOO_KEY))), topSubtreeModified(topFoo, topBar));
112 public void putTopBarNodeSubtreeListeners() {
113 final var topBar = topLevelList(TOP_BAR_KEY);
114 final var topFoo = topLevelList(TOP_FOO_KEY);
116 try (var topListener = createCollector(CONFIGURATION, TOP)) {
117 try (var allListener = createCollector(CONFIGURATION, WILDCARDED)) {
118 try (var fooListener = createCollector(CONFIGURATION, TOP_FOO)) {
119 try (var barListener = createCollector(CONFIGURATION, TOP_BAR)) {
120 var writeTx = getDataBroker().newWriteOnlyTransaction();
121 writeTx.put(CONFIGURATION, TOP_BAR, topLevelList(TOP_BAR_KEY));
122 assertCommit(writeTx.commit());
124 barListener.verifyModifications(added(TOP_BAR, topBar));
126 fooListener.verifyModifications(added(TOP_FOO, topFoo));
128 allListener.verifyModifications(added(TOP_FOO, topFoo), added(TOP_BAR, topBar));
130 topListener.verifyModifications(
131 added(TOP, top(topLevelList(TOP_FOO_KEY))), topSubtreeModified(topFoo, topBar));
136 public void mergeTopBarNodeSubtreeListeners() {
137 final var topBar = topLevelList(TOP_BAR_KEY);
138 final var topFoo = topLevelList(TOP_FOO_KEY);
140 try (var topListener = createCollector(CONFIGURATION, TOP)) {
141 try (var allListener = createCollector(CONFIGURATION, WILDCARDED)) {
142 try (var fooListener = createCollector(CONFIGURATION, TOP_FOO)) {
143 try (var barListener = createCollector(CONFIGURATION, TOP_BAR)) {
144 final var writeTx = getDataBroker().newWriteOnlyTransaction();
145 writeTx.merge(CONFIGURATION, TOP_BAR, topLevelList(TOP_BAR_KEY));
146 assertCommit(writeTx.commit());
148 barListener.verifyModifications(added(TOP_BAR, topBar));
150 fooListener.verifyModifications(added(TOP_FOO, topFoo));
152 allListener.verifyModifications(added(TOP_FOO, topFoo), added(TOP_BAR, topBar));
154 topListener.verifyModifications(
155 added(TOP, top(topLevelList(TOP_FOO_KEY))), topSubtreeModified(topFoo, topBar));
159 private static Matcher<Top> topSubtreeModified(final TopLevelList topFoo, final TopLevelList topBar) {
160 return match(ModificationType.SUBTREE_MODIFIED, TOP,
161 (DataMatcher<Top>) dataBefore -> Objects.equals(top(topFoo), dataBefore),
163 var expList = new HashSet<>(top(topBar, topFoo).nonnullTopLevelList().values());
164 var actualList = dataAfter.nonnullTopLevelList().values().stream()
165 .map(list -> new TopLevelListBuilder(list).build()).collect(Collectors.toSet());
166 return expList.equals(actualList);