58debcbbf6e791ef5c051539b03f6ff13bdad186
[netconf.git] / restconf / restconf-nb-bierman02 / src / test / java / org / opendaylight / netconf / sal / rest / impl / DepthAwareNormalizedNodeWriterTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.netconf.sal.rest.impl;
9
10 import static org.mockito.Mockito.inOrder;
11 import static org.mockito.Mockito.times;
12 import static org.mockito.Mockito.verify;
13 import static org.mockito.Mockito.verifyNoMoreInteractions;
14 import static org.mockito.Mockito.when;
15
16 import com.google.common.collect.Sets;
17 import java.util.Collection;
18 import java.util.Collections;
19 import java.util.Optional;
20 import org.junit.Before;
21 import org.junit.Ignore;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.InOrder;
25 import org.mockito.Mock;
26 import org.mockito.junit.MockitoJUnitRunner;
27 import org.opendaylight.yangtools.yang.common.QName;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
31 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
33 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
34 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
36 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
37 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
38 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
39
40 @RunWith(MockitoJUnitRunner.StrictStubs.class)
41 public class DepthAwareNormalizedNodeWriterTest {
42
43     @Mock
44     private NormalizedNodeStreamWriter writer;
45     @Mock
46     private ContainerNode containerNodeData;
47     @Mock
48     private MapNode mapNodeData;
49     @Mock
50     private MapEntryNode mapEntryNodeData;
51     @Mock
52     private LeafSetNode<String> leafSetNodeData;
53     @Mock
54     private LeafSetEntryNode<String> leafSetEntryNodeData;
55     @Mock
56     private LeafNode<String> keyLeafNodeData;
57     @Mock
58     private LeafNode<String> anotherLeafNodeData;
59
60     private NodeIdentifier containerNodeIdentifier;
61     private NodeIdentifier mapNodeIdentifier;
62     private NodeIdentifierWithPredicates mapEntryNodeIdentifier;
63     private NodeIdentifier leafSetNodeIdentifier;
64     private NodeWithValue<String> leafSetEntryNodeIdentifier;
65     private NodeIdentifier keyLeafNodeIdentifier;
66     private NodeIdentifier anotherLeafNodeIdentifier;
67
68     private Collection<DataContainerChild> containerNodeValue;
69     private Collection<MapEntryNode> mapNodeValue;
70     private Collection<DataContainerChild> mapEntryNodeValue;
71     private Collection<LeafSetEntryNode<String>> leafSetNodeValue;
72     private String leafSetEntryNodeValue;
73     private String keyLeafNodeValue;
74     private String anotherLeafNodeValue;
75
76     @Before
77     public void setUp() {
78         // identifiers
79         containerNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "container"));
80         when(containerNodeData.getIdentifier()).thenReturn(containerNodeIdentifier);
81
82         mapNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "list"));
83         when(mapNodeData.getIdentifier()).thenReturn(mapNodeIdentifier);
84
85         final QName leafSetEntryNodeQName = QName.create("namespace", "leaf-set-entry");
86         leafSetEntryNodeValue = "leaf-set-value";
87         leafSetEntryNodeIdentifier = new NodeWithValue<>(leafSetEntryNodeQName, leafSetEntryNodeValue);
88         when(leafSetEntryNodeData.getIdentifier()).thenReturn(leafSetEntryNodeIdentifier);
89
90         leafSetNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "leaf-set"));
91         when(leafSetNodeData.getIdentifier()).thenReturn(leafSetNodeIdentifier);
92
93         final QName mapEntryNodeKey = QName.create("namespace", "key-field");
94         keyLeafNodeIdentifier = NodeIdentifier.create(mapEntryNodeKey);
95         keyLeafNodeValue = "key-value";
96
97         mapEntryNodeIdentifier = NodeIdentifierWithPredicates.of(
98                 QName.create("namespace", "list-entry"), mapEntryNodeKey, keyLeafNodeValue);
99         when(mapEntryNodeData.getIdentifier()).thenReturn(mapEntryNodeIdentifier);
100         when(mapEntryNodeData.findChildByArg(keyLeafNodeIdentifier)).thenReturn(Optional.of(keyLeafNodeData));
101
102         when(keyLeafNodeData.body()).thenReturn(keyLeafNodeValue);
103         when(keyLeafNodeData.getIdentifier()).thenReturn(keyLeafNodeIdentifier);
104
105         anotherLeafNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "another-field"));
106         anotherLeafNodeValue = "another-value";
107
108         when(anotherLeafNodeData.body()).thenReturn(anotherLeafNodeValue);
109         when(anotherLeafNodeData.getIdentifier()).thenReturn(anotherLeafNodeIdentifier);
110
111         // values
112         when(leafSetEntryNodeData.body()).thenReturn(leafSetEntryNodeValue);
113
114         leafSetNodeValue = Collections.singletonList(leafSetEntryNodeData);
115         when(leafSetNodeData.body()).thenReturn(leafSetNodeValue);
116
117         containerNodeValue = Collections.singleton(leafSetNodeData);
118         when(containerNodeData.body()).thenReturn(containerNodeValue);
119
120         mapEntryNodeValue = Sets.newHashSet(keyLeafNodeData, anotherLeafNodeData);
121         when(mapEntryNodeData.body()).thenReturn(mapEntryNodeValue);
122
123         mapNodeValue = Collections.singleton(mapEntryNodeData);
124         when(mapNodeData.body()).thenReturn(mapNodeValue);
125     }
126
127     /**
128      * Test write {@link ContainerNode} with children but write data only to depth 1 (children will not be written).
129      */
130     @Test
131     public void writeContainerWithoutChildrenTest() throws Exception {
132         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(writer, 1);
133
134         depthWriter.write(containerNodeData);
135
136         final InOrder inOrder = inOrder(writer);
137         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, containerNodeValue.size());
138         inOrder.verify(writer, times(1)).endNode();
139         verifyNoMoreInteractions(writer);
140     }
141
142     /**
143      * Test write {@link ContainerNode} with children and write also all its children.
144      */
145     @Test
146     public void writeContainerWithChildrenTest() throws Exception {
147         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
148                 writer, Integer.MAX_VALUE);
149
150         depthWriter.write(containerNodeData);
151
152         final InOrder inOrder = inOrder(writer);
153         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, containerNodeValue.size());
154         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, leafSetNodeValue.size());
155         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
156         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
157         inOrder.verify(writer, times(3)).endNode();
158         verifyNoMoreInteractions(writer);
159     }
160
161     /**
162      * Test write with {@link MapNode} with children but write data only to depth 1 (children will not be written).
163      */
164     @Test
165     public void writeMapNodeWithoutChildrenTest() throws Exception {
166         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(writer, 1);
167
168         depthWriter.write(mapNodeData);
169
170         final InOrder inOrder = inOrder(writer);
171         inOrder.verify(writer, times(1)).startMapNode(mapNodeIdentifier, mapNodeValue.size());
172         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
173         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
174         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
175         inOrder.verify(writer, times(3)).endNode();
176         verifyNoMoreInteractions(writer);
177     }
178
179     /**
180      * Test write {@link MapNode} with children and write also all its children.
181      * FIXME
182      * Although ordered writer is used leaves are not written in expected order.
183      *
184      */
185     @Ignore
186     @Test
187     public void writeMapNodeWithChildrenTest() throws Exception {
188         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
189                 writer, Integer.MAX_VALUE);
190
191         depthWriter.write(mapNodeData);
192
193         final InOrder inOrder = inOrder(writer);
194         inOrder.verify(writer, times(1)).startMapNode(mapNodeIdentifier, mapNodeValue.size());
195         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
196         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
197         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
198         inOrder.verify(writer, times(1)).endNode();
199         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
200         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
201         inOrder.verify(writer, times(1)).endNode();
202
203         // FIXME this assertion is not working because leaves are not written in expected order
204         inOrder.verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
205         inOrder.verify(writer, times(1)).scalarValue(anotherLeafNodeValue);
206         inOrder.verify(writer, times(3)).endNode();
207         verifyNoMoreInteractions(writer);
208     }
209
210     /**
211      * Test write with {@link LeafSetNode} with depth 1 (children will not be written).
212      */
213     @Test
214     public void writeLeafSetNodeWithoutChildrenTest() throws Exception {
215         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
216                 writer, 1);
217
218         depthWriter.write(leafSetNodeData);
219
220         final InOrder inOrder = inOrder(writer);
221         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, leafSetNodeValue.size());
222         inOrder.verify(writer, times(1)).endNode();
223         verifyNoMoreInteractions(writer);
224     }
225
226     /**
227      * Test write with {@link LeafSetNode} when all its children will be written.
228      */
229     @Test
230     public void writeLeafSetNodeWithChildrenTest() throws Exception {
231         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
232                 writer, Integer.MAX_VALUE);
233
234         depthWriter.write(leafSetNodeData);
235
236         final InOrder inOrder = inOrder(writer);
237         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, leafSetNodeValue.size());
238         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
239         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
240         inOrder.verify(writer, times(2)).endNode();
241         verifyNoMoreInteractions(writer);
242     }
243
244     /**
245      * Test write with {@link LeafSetEntryNode}.
246      */
247     @Test
248     public void writeLeafSetEntryNodeTest() throws Exception {
249         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
250                 writer, Integer.MAX_VALUE);
251
252         depthWriter.write(leafSetEntryNodeData);
253
254         final InOrder inOrder = inOrder(writer);
255         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
256         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
257         inOrder.verify(writer, times(1)).endNode();
258         verifyNoMoreInteractions(writer);
259     }
260
261     /**
262      * Test write with {@link MapEntryNode} unordered to depth 1 to write only keys.
263      */
264     @Test
265     public void writeMapEntryNodeUnorderedOnlyKeysTest() throws Exception {
266         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
267                 writer, false, 1);
268
269         depthWriter.write(mapEntryNodeData);
270
271         final InOrder inOrder = inOrder(writer);
272         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
273         // write only the key
274         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
275         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
276         inOrder.verify(writer, times(2)).endNode();
277         verifyNoMoreInteractions(writer);
278     }
279
280     /**
281      * Test write with {@link MapEntryNode} unordered with full depth.
282      */
283     @Test
284     public void writeMapEntryNodeUnorderedTest() throws Exception {
285         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
286                 writer, false, Integer.MAX_VALUE);
287
288         depthWriter.write(mapEntryNodeData);
289
290         // unordered
291         verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
292         verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
293         verify(writer, times(1)).scalarValue(keyLeafNodeValue);
294         verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
295         verify(writer, times(1)).scalarValue(anotherLeafNodeValue);
296         verify(writer, times(3)).endNode();
297         verifyNoMoreInteractions(writer);
298     }
299
300     /**
301      * Test write with {@link MapEntryNode} ordered with depth 1 (children will not be written).
302      */
303     @Test
304     public void writeMapEntryNodeOrderedWithoutChildrenTest() throws Exception {
305         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
306                 writer, true, 1);
307
308         depthWriter.write(mapEntryNodeData);
309
310         final InOrder inOrder = inOrder(writer);
311         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
312         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
313         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
314         inOrder.verify(writer, times(2)).endNode();
315         verifyNoMoreInteractions(writer);
316     }
317
318     /**
319      * Test write with {@link MapEntryNode} ordered and write also all its children.
320      * FIXME
321      * Although ordered writer is used leaves are not written in expected order.
322      *
323      */
324     @Ignore
325     @Test
326     public void writeMapEntryNodeOrderedTest() throws Exception {
327         final DepthAwareNormalizedNodeWriter depthWriter = DepthAwareNormalizedNodeWriter.forStreamWriter(
328                 writer, true, Integer.MAX_VALUE);
329
330         depthWriter.write(mapEntryNodeData);
331
332         final InOrder inOrder = inOrder(writer);
333         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
334         inOrder.verify(writer, times(2)).startLeafNode(keyLeafNodeIdentifier);
335         inOrder.verify(writer, times(2)).scalarValue(keyLeafNodeValue);
336         inOrder.verify(writer, times(1)).endNode();
337         // FIXME this assertion is not working because leaves are not written in expected order
338         inOrder.verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
339         inOrder.verify(writer, times(2)).scalarValue(anotherLeafNodeValue);
340         inOrder.verify(writer, times(2)).endNode();
341         verifyNoMoreInteractions(writer);
342     }
343 }