2 * Copyright (c) 2016 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.restconf.nb.rfc8040.rests.utils;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNull;
12 import static org.mockito.Mockito.doReturn;
13 import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFluentFuture;
15 import com.google.common.collect.ImmutableList;
16 import java.util.Optional;
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.eclipse.jdt.annotation.Nullable;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.Mock;
23 import org.mockito.junit.MockitoJUnitRunner;
24 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
25 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
26 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
27 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
28 import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
29 import org.opendaylight.restconf.nb.rfc8040.ContentParam;
30 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.MdsalRestconfStrategy;
31 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.NetconfRestconfStrategy;
32 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy;
33 import org.opendaylight.yangtools.yang.common.QName;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
36 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
37 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
38 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
39 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
40 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
41 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
42 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
43 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
45 @RunWith(MockitoJUnitRunner.StrictStubs.class)
46 public class ReadDataTransactionUtilTest {
47 private static final TestData DATA = new TestData();
48 private static final NodeIdentifier NODE_IDENTIFIER =
49 new NodeIdentifier(QName.create("ns", "2016-02-28", "container"));
51 private RestconfStrategy mdsalStrategy;
52 private RestconfStrategy netconfStrategy;
54 private NetconfDataTreeService netconfService;
56 private InstanceIdentifierContext context;
58 private DOMDataTreeReadTransaction read;
60 private EffectiveModelContext schemaContext;
62 private DOMDataBroker mockDataBroker;
66 // FIXME: these tests need to be parameterized somehow. The trouble is we need mocking before we invoke
67 // the strategy. This needs some more thought.
68 doReturn(read).when(mockDataBroker).newReadOnlyTransaction();
69 mdsalStrategy = new MdsalRestconfStrategy(mockDataBroker);
70 netconfStrategy = new NetconfRestconfStrategy(netconfService);
74 public void readDataConfigTest() {
75 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(read)
76 .read(LogicalDatastoreType.CONFIGURATION, DATA.path);
77 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(netconfService).getConfig(DATA.path);
78 NormalizedNode normalizedNode = readData(ContentParam.CONFIG, DATA.path, mdsalStrategy);
79 assertEquals(DATA.data3, normalizedNode);
81 normalizedNode = readData(ContentParam.CONFIG, DATA.path, netconfStrategy);
82 assertEquals(DATA.data3, normalizedNode);
86 public void readAllHavingOnlyConfigTest() {
87 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(read)
88 .read(LogicalDatastoreType.CONFIGURATION, DATA.path);
89 doReturn(immediateFluentFuture(Optional.empty())).when(read)
90 .read(LogicalDatastoreType.OPERATIONAL, DATA.path);
91 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(netconfService).getConfig(DATA.path);
92 doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).get(DATA.path);
93 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.path, mdsalStrategy);
94 assertEquals(DATA.data3, normalizedNode);
96 normalizedNode = readData(ContentParam.ALL, DATA.path, netconfStrategy);
97 assertEquals(DATA.data3, normalizedNode);
101 public void readAllHavingOnlyNonConfigTest() {
102 doReturn(immediateFluentFuture(Optional.of(DATA.data2))).when(read)
103 .read(LogicalDatastoreType.OPERATIONAL, DATA.path2);
104 doReturn(immediateFluentFuture(Optional.empty())).when(read)
105 .read(LogicalDatastoreType.CONFIGURATION, DATA.path2);
106 doReturn(immediateFluentFuture(Optional.of(DATA.data2))).when(netconfService).get(DATA.path2);
107 doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(DATA.path2);
108 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.path2, mdsalStrategy);
109 assertEquals(DATA.data2, normalizedNode);
111 normalizedNode = readData(ContentParam.ALL, DATA.path2, netconfStrategy);
112 assertEquals(DATA.data2, normalizedNode);
116 public void readDataNonConfigTest() {
117 doReturn(immediateFluentFuture(Optional.of(DATA.data2))).when(read)
118 .read(LogicalDatastoreType.OPERATIONAL, DATA.path2);
119 doReturn(immediateFluentFuture(Optional.of(DATA.data2))).when(netconfService).get(DATA.path2);
120 NormalizedNode normalizedNode = readData(ContentParam.NONCONFIG, DATA.path2, mdsalStrategy);
121 assertEquals(DATA.data2, normalizedNode);
123 normalizedNode = readData(ContentParam.NONCONFIG, DATA.path2, netconfStrategy);
124 assertEquals(DATA.data2, normalizedNode);
128 public void readContainerDataAllTest() {
129 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(read)
130 .read(LogicalDatastoreType.CONFIGURATION, DATA.path);
131 doReturn(immediateFluentFuture(Optional.of(DATA.data4))).when(read)
132 .read(LogicalDatastoreType.OPERATIONAL, DATA.path);
133 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(netconfService).getConfig(DATA.path);
134 doReturn(immediateFluentFuture(Optional.of(DATA.data4))).when(netconfService).get(DATA.path);
135 final ContainerNode checkingData = Builders
137 .withNodeIdentifier(NODE_IDENTIFIER)
138 .withChild(DATA.contentLeaf)
139 .withChild(DATA.contentLeaf2)
141 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.path, mdsalStrategy);
142 assertEquals(checkingData, normalizedNode);
144 normalizedNode = readData(ContentParam.ALL, DATA.path, netconfStrategy);
145 assertEquals(checkingData, normalizedNode);
149 public void readContainerDataConfigNoValueOfContentTest() {
150 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(read)
151 .read(LogicalDatastoreType.CONFIGURATION, DATA.path);
152 doReturn(immediateFluentFuture(Optional.of(DATA.data4))).when(read)
153 .read(LogicalDatastoreType.OPERATIONAL, DATA.path);
154 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(netconfService).getConfig(DATA.path);
155 doReturn(immediateFluentFuture(Optional.of(DATA.data4))).when(netconfService).get(DATA.path);
156 final ContainerNode checkingData = Builders
158 .withNodeIdentifier(NODE_IDENTIFIER)
159 .withChild(DATA.contentLeaf)
160 .withChild(DATA.contentLeaf2)
162 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.path, mdsalStrategy);
163 assertEquals(checkingData, normalizedNode);
165 normalizedNode = readData(ContentParam.ALL, DATA.path, netconfStrategy);
166 assertEquals(checkingData, normalizedNode);
170 public void readListDataAllTest() {
171 doReturn(immediateFluentFuture(Optional.of(DATA.listData))).when(read)
172 .read(LogicalDatastoreType.OPERATIONAL, DATA.path3);
173 doReturn(immediateFluentFuture(Optional.of(DATA.listData2))).when(read)
174 .read(LogicalDatastoreType.CONFIGURATION, DATA.path3);
175 doReturn(immediateFluentFuture(Optional.of(DATA.listData))).when(netconfService).get(DATA.path3);
176 doReturn(immediateFluentFuture(Optional.of(DATA.listData2))).when(netconfService).getConfig(DATA.path3);
177 final MapNode checkingData = Builders
179 .withNodeIdentifier(new NodeIdentifier(QName.create("ns", "2016-02-28", "list")))
180 .withChild(DATA.checkData)
182 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.path3, mdsalStrategy);
183 assertEquals(checkingData, normalizedNode);
185 normalizedNode = readData(ContentParam.ALL, DATA.path3, netconfStrategy);
186 assertEquals(checkingData, normalizedNode);
190 public void readOrderedListDataAllTest() {
191 doReturn(immediateFluentFuture(Optional.of(DATA.orderedMapNode1))).when(read)
192 .read(LogicalDatastoreType.OPERATIONAL, DATA.path3);
193 doReturn(immediateFluentFuture(Optional.of(DATA.orderedMapNode2))).when(read)
194 .read(LogicalDatastoreType.CONFIGURATION, DATA.path3);
195 doReturn(immediateFluentFuture(Optional.of(DATA.orderedMapNode1))).when(netconfService).get(DATA.path3);
196 doReturn(immediateFluentFuture(Optional.of(DATA.orderedMapNode2))).when(netconfService)
197 .getConfig(DATA.path3);
198 final MapNode expectedData = Builders.orderedMapBuilder()
199 .withNodeIdentifier(new NodeIdentifier(DATA.listQname))
200 .withChild(DATA.checkData)
202 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.path3,
204 assertEquals(expectedData, normalizedNode);
206 normalizedNode = readData(ContentParam.ALL, DATA.path3, netconfStrategy);
207 assertEquals(expectedData, normalizedNode);
211 public void readUnkeyedListDataAllTest() {
212 doReturn(immediateFluentFuture(Optional.of(DATA.unkeyedListNode1))).when(read)
213 .read(LogicalDatastoreType.OPERATIONAL, DATA.path3);
214 doReturn(immediateFluentFuture(Optional.of(DATA.unkeyedListNode2))).when(read)
215 .read(LogicalDatastoreType.CONFIGURATION, DATA.path3);
216 doReturn(immediateFluentFuture(Optional.of(DATA.unkeyedListNode1))).when(netconfService).get(DATA.path3);
217 doReturn(immediateFluentFuture(Optional.of(DATA.unkeyedListNode2))).when(netconfService)
218 .getConfig(DATA.path3);
219 final UnkeyedListNode expectedData = Builders.unkeyedListBuilder()
220 .withNodeIdentifier(new NodeIdentifier(DATA.listQname))
221 .withChild(Builders.unkeyedListEntryBuilder()
222 .withNodeIdentifier(new NodeIdentifier(DATA.listQname))
223 .withChild(DATA.unkeyedListEntryNode1.body().iterator().next())
224 .withChild(DATA.unkeyedListEntryNode2.body().iterator().next()).build()).build();
225 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.path3, mdsalStrategy);
226 assertEquals(expectedData, normalizedNode);
228 normalizedNode = readData(ContentParam.ALL, DATA.path3, netconfStrategy);
229 assertEquals(expectedData, normalizedNode);
233 public void readLeafListDataAllTest() {
234 doReturn(immediateFluentFuture(Optional.of(DATA.leafSetNode1))).when(read)
235 .read(LogicalDatastoreType.OPERATIONAL, DATA.leafSetNodePath);
236 doReturn(immediateFluentFuture(Optional.of(DATA.leafSetNode2))).when(read)
237 .read(LogicalDatastoreType.CONFIGURATION, DATA.leafSetNodePath);
238 doReturn(immediateFluentFuture(Optional.of(DATA.leafSetNode1))).when(netconfService)
239 .get(DATA.leafSetNodePath);
240 doReturn(immediateFluentFuture(Optional.of(DATA.leafSetNode2))).when(netconfService)
241 .getConfig(DATA.leafSetNodePath);
242 final LeafSetNode<String> expectedData = Builders.<String>leafSetBuilder()
243 .withNodeIdentifier(new NodeIdentifier(DATA.leafListQname))
244 .withValue(ImmutableList.<LeafSetEntryNode<String>>builder()
245 .addAll(DATA.leafSetNode1.body())
246 .addAll(DATA.leafSetNode2.body())
249 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.leafSetNodePath,
251 assertEquals(expectedData, normalizedNode);
253 normalizedNode = readData(ContentParam.ALL, DATA.leafSetNodePath, netconfStrategy);
254 assertEquals(expectedData, normalizedNode);
258 public void readOrderedLeafListDataAllTest() {
259 doReturn(immediateFluentFuture(Optional.of(DATA.orderedLeafSetNode1))).when(read)
260 .read(LogicalDatastoreType.OPERATIONAL, DATA.leafSetNodePath);
261 doReturn(immediateFluentFuture(Optional.of(DATA.orderedLeafSetNode2))).when(read)
262 .read(LogicalDatastoreType.CONFIGURATION, DATA.leafSetNodePath);
263 doReturn(immediateFluentFuture(Optional.of(DATA.orderedLeafSetNode1))).when(netconfService)
264 .get(DATA.leafSetNodePath);
265 doReturn(immediateFluentFuture(Optional.of(DATA.orderedLeafSetNode2))).when(netconfService)
266 .getConfig(DATA.leafSetNodePath);
267 final LeafSetNode<String> expectedData = Builders.<String>orderedLeafSetBuilder()
268 .withNodeIdentifier(new NodeIdentifier(DATA.leafListQname))
269 .withValue(ImmutableList.<LeafSetEntryNode<String>>builder()
270 .addAll(DATA.orderedLeafSetNode1.body())
271 .addAll(DATA.orderedLeafSetNode2.body())
274 NormalizedNode normalizedNode = readData(ContentParam.ALL, DATA.leafSetNodePath,
276 assertEquals(expectedData, normalizedNode);
278 normalizedNode = readData(ContentParam.ALL, DATA.leafSetNodePath, netconfStrategy);
279 assertEquals(expectedData, normalizedNode);
283 public void readDataWrongPathOrNoContentTest() {
284 doReturn(immediateFluentFuture(Optional.empty())).when(read)
285 .read(LogicalDatastoreType.CONFIGURATION, DATA.path2);
286 doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(DATA.path2);
287 NormalizedNode normalizedNode = readData(ContentParam.CONFIG, DATA.path2, mdsalStrategy);
288 assertNull(normalizedNode);
290 normalizedNode = readData(ContentParam.CONFIG, DATA.path2, netconfStrategy);
291 assertNull(normalizedNode);
295 * Read specific type of data from data store via transaction.
297 * @param content type of data to read (config, state, all)
298 * @param strategy {@link RestconfStrategy} - wrapper for variables
299 * @return {@link NormalizedNode}
301 private @Nullable NormalizedNode readData(final @NonNull ContentParam content,
302 final YangInstanceIdentifier path, final @NonNull RestconfStrategy strategy) {
303 return ReadDataTransactionUtil.readData(content, path, strategy, null, schemaContext);