ba3a8aff393579b2bd436920fedf0e773d95a921
[netconf.git] / restconf / restconf-nb-rfc8040 / src / test / java / org / opendaylight / restconf / nb / rfc8040 / jersey / providers / ParameterAwareNormalizedNodeWriterDepthTest.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.restconf.nb.rfc8040.jersey.providers;
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 /**
41  * Unit test for {@link ParameterAwareNormalizedNodeWriter} used with depth parameter.
42  */
43 @RunWith(MockitoJUnitRunner.StrictStubs.class)
44 public class ParameterAwareNormalizedNodeWriterDepthTest {
45
46     @Mock
47     private NormalizedNodeStreamWriter writer;
48     @Mock
49     private ContainerNode containerNodeData;
50     @Mock
51     private MapNode mapNodeData;
52     @Mock
53     private MapEntryNode mapEntryNodeData;
54     @Mock
55     private LeafSetNode<String> leafSetNodeData;
56     @Mock
57     private LeafSetEntryNode<String> leafSetEntryNodeData;
58     @Mock
59     private LeafNode<String> keyLeafNodeData;
60     @Mock
61     private LeafNode<String> anotherLeafNodeData;
62
63     private NodeIdentifier containerNodeIdentifier;
64     private NodeIdentifier mapNodeIdentifier;
65     private NodeIdentifierWithPredicates mapEntryNodeIdentifier;
66     private NodeIdentifier leafSetNodeIdentifier;
67     private NodeWithValue<String> leafSetEntryNodeIdentifier;
68     private NodeIdentifier keyLeafNodeIdentifier;
69     private NodeIdentifier anotherLeafNodeIdentifier;
70
71     private Collection<DataContainerChild> containerNodeValue;
72     private Collection<MapEntryNode> mapNodeValue;
73     private Collection<DataContainerChild> mapEntryNodeValue;
74     private Collection<LeafSetEntryNode<String>> leafSetNodeValue;
75     private String leafSetEntryNodeValue;
76     private String keyLeafNodeValue;
77     private String anotherLeafNodeValue;
78
79     @Before
80     public void setUp() {
81         // identifiers
82         containerNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "container"));
83         when(containerNodeData.getIdentifier()).thenReturn(containerNodeIdentifier);
84
85         mapNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "list"));
86         when(mapNodeData.getIdentifier()).thenReturn(mapNodeIdentifier);
87
88         final QName leafSetEntryNodeQName = QName.create("namespace", "leaf-set-entry");
89         leafSetEntryNodeValue = "leaf-set-value";
90         leafSetEntryNodeIdentifier = new NodeWithValue<>(leafSetEntryNodeQName, leafSetEntryNodeValue);
91         when(leafSetEntryNodeData.getIdentifier()).thenReturn(leafSetEntryNodeIdentifier);
92
93         leafSetNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "leaf-set"));
94         when(leafSetNodeData.getIdentifier()).thenReturn(leafSetNodeIdentifier);
95
96         final QName mapEntryNodeKey = QName.create("namespace", "key-field");
97         keyLeafNodeIdentifier = NodeIdentifier.create(mapEntryNodeKey);
98         keyLeafNodeValue = "key-value";
99
100         mapEntryNodeIdentifier = NodeIdentifierWithPredicates.of(
101                 QName.create("namespace", "list-entry"), mapEntryNodeKey, keyLeafNodeValue);
102         when(mapEntryNodeData.getIdentifier()).thenReturn(mapEntryNodeIdentifier);
103         when(mapEntryNodeData.findChildByArg(keyLeafNodeIdentifier)).thenReturn(Optional.of(keyLeafNodeData));
104
105         when(keyLeafNodeData.body()).thenReturn(keyLeafNodeValue);
106         when(keyLeafNodeData.getIdentifier()).thenReturn(keyLeafNodeIdentifier);
107
108         anotherLeafNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "another-field"));
109         anotherLeafNodeValue = "another-value";
110
111         when(anotherLeafNodeData.body()).thenReturn(anotherLeafNodeValue);
112         when(anotherLeafNodeData.getIdentifier()).thenReturn(anotherLeafNodeIdentifier);
113
114         // values
115         when(leafSetEntryNodeData.body()).thenReturn(leafSetEntryNodeValue);
116
117         leafSetNodeValue = Collections.singletonList(leafSetEntryNodeData);
118         when(leafSetNodeData.body()).thenReturn(leafSetNodeValue);
119
120         containerNodeValue = Collections.singleton(leafSetNodeData);
121         when(containerNodeData.body()).thenReturn(containerNodeValue);
122
123         mapEntryNodeValue = Sets.newHashSet(keyLeafNodeData, anotherLeafNodeData);
124         when(mapEntryNodeData.body()).thenReturn(mapEntryNodeValue);
125
126         mapNodeValue = Collections.singleton(mapEntryNodeData);
127         when(mapNodeData.body()).thenReturn(mapNodeValue);
128     }
129
130     /**
131      * Test write {@link ContainerNode} with children but write data only to depth 1 (children will not be written).
132      * Depth parameter is limited to 1.
133      */
134     @Test
135     public void writeContainerWithoutChildrenDepthTest() throws Exception {
136         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter
137                 .forStreamWriter(writer, 1, null);
138
139         parameterWriter.write(containerNodeData);
140
141         final InOrder inOrder = inOrder(writer);
142         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, containerNodeValue.size());
143         inOrder.verify(writer, times(1)).endNode();
144         verifyNoMoreInteractions(writer);
145     }
146
147     /**
148      * Test write {@link ContainerNode} with children and write also all its children.
149      * Depth parameter has higher value than maximal children depth.
150      */
151     @Test
152     public void writeContainerWithChildrenDepthTest() throws Exception {
153         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
154                 writer, Integer.MAX_VALUE, null);
155
156         parameterWriter.write(containerNodeData);
157
158         final InOrder inOrder = inOrder(writer);
159         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, containerNodeValue.size());
160         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, leafSetNodeValue.size());
161         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
162         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
163         inOrder.verify(writer, times(3)).endNode();
164         verifyNoMoreInteractions(writer);
165     }
166
167     /**
168      * Test write with {@link MapNode} with children but write data only to depth 1 (children will not be written).
169      * Depth parameter limits depth to 1.
170      */
171     @Test
172     public void writeMapNodeWithoutChildrenDepthTest() throws Exception {
173         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter
174                 .forStreamWriter(writer, 1, null);
175
176         parameterWriter.write(mapNodeData);
177
178         final InOrder inOrder = inOrder(writer);
179         inOrder.verify(writer, times(1)).startMapNode(mapNodeIdentifier, mapNodeValue.size());
180         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
181         inOrder.verify(writer, times(2)).endNode();
182         verifyNoMoreInteractions(writer);
183     }
184
185     /**
186      * Test write {@link MapNode} with children and write also all its children.
187      * Depth parameter has higher value than maximal children depth.
188      * FIXME
189      * Although ordered writer is used leaves are not written in expected order.
190      *
191      */
192     @Ignore
193     @Test
194     public void writeMapNodeWithChildrenDepthTest() throws Exception {
195         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
196                 writer, Integer.MAX_VALUE, null);
197
198         parameterWriter.write(mapNodeData);
199
200         final InOrder inOrder = inOrder(writer);
201         inOrder.verify(writer, times(1)).startMapNode(mapNodeIdentifier, mapNodeValue.size());
202         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
203         inOrder.verify(writer, times(2)).startLeafNode(keyLeafNodeIdentifier);
204         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
205         inOrder.verify(writer, times(1)).endNode();
206         inOrder.verify(writer, times(2)).startLeafNode(keyLeafNodeIdentifier);
207         inOrder.verify(writer, times(2)).scalarValue(keyLeafNodeValue);
208         inOrder.verify(writer, times(2)).endNode();
209         // FIXME this assertion is not working because leaves are not written in expected order
210         inOrder.verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
211         inOrder.verify(writer, times(1)).scalarValue(anotherLeafNodeValue);
212         inOrder.verify(writer, times(3)).endNode();
213         verifyNoMoreInteractions(writer);
214     }
215
216     /**
217      * Test write with {@link LeafSetNode} with depth 1 (children will not be written).
218      * Depth parameter limits depth to 1.
219      */
220     @Test
221     public void writeLeafSetNodeWithoutChildrenDepthTest() throws Exception {
222         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
223                 writer, 1, null);
224
225         parameterWriter.write(leafSetNodeData);
226
227         final InOrder inOrder = inOrder(writer);
228         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, leafSetNodeValue.size());
229         inOrder.verify(writer, times(1)).endNode();
230         verifyNoMoreInteractions(writer);
231     }
232
233     /**
234      * Test write with {@link LeafSetNode} when all its children will be written.
235      * Depth parameter has higher value than maximal children depth.
236      */
237     @Test
238     public void writeLeafSetNodeWithChildrenDepthTest() throws Exception {
239         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
240                 writer, Integer.MAX_VALUE, null);
241
242         parameterWriter.write(leafSetNodeData);
243
244         final InOrder inOrder = inOrder(writer);
245         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, leafSetNodeValue.size());
246         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
247         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
248         inOrder.verify(writer, times(2)).endNode();
249         verifyNoMoreInteractions(writer);
250     }
251
252     /**
253      * Test write with {@link LeafSetEntryNode}.
254      * Depth parameter has higher value than maximal children depth.
255      */
256     @Test
257     public void writeLeafSetEntryNodeDepthTest() throws Exception {
258         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
259                 writer, Integer.MAX_VALUE, null);
260
261         parameterWriter.write(leafSetEntryNodeData);
262
263         final InOrder inOrder = inOrder(writer);
264         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
265         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
266         inOrder.verify(writer, times(1)).endNode();
267         verifyNoMoreInteractions(writer);
268     }
269
270     /**
271      * Test write with {@link MapEntryNode} unordered to depth 1 to write only keys.
272      * Depth parameter limits depth to 1.
273      */
274     @Test
275     public void writeMapEntryNodeUnorderedOnlyKeysDepthTest() throws Exception {
276         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
277                 writer, false, 1, null);
278
279         parameterWriter.write(mapEntryNodeData);
280
281         final InOrder inOrder = inOrder(writer);
282         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
283         // write only the key
284         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
285         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
286         inOrder.verify(writer, times(2)).endNode();
287         verifyNoMoreInteractions(writer);
288     }
289
290     /**
291      * Test write with {@link MapEntryNode} unordered with full depth.
292      * Depth parameter has higher value than maximal children depth.
293      */
294     @Test
295     public void writeMapEntryNodeUnorderedDepthTest() throws Exception {
296         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
297                 writer, false, Integer.MAX_VALUE, null);
298
299         parameterWriter.write(mapEntryNodeData);
300
301         // unordered
302         verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
303         verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
304         verify(writer, times(1)).scalarValue(keyLeafNodeValue);
305         verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
306         verify(writer, times(1)).scalarValue(anotherLeafNodeValue);
307         verify(writer, times(3)).endNode();
308         verifyNoMoreInteractions(writer);
309     }
310
311     /**
312      * Test write with {@link MapEntryNode} ordered with depth 1 (children will not be written).
313      * Depth parameter limits depth to 1.
314      */
315     @Test
316     public void writeMapEntryNodeOrderedWithoutChildrenTest() throws Exception {
317         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
318                 writer, true, 1, null);
319
320         parameterWriter.write(mapEntryNodeData);
321
322         final InOrder inOrder = inOrder(writer);
323         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
324         inOrder.verify(writer, times(1)).endNode();
325         verifyNoMoreInteractions(writer);
326     }
327
328     /**
329      * Test write with {@link MapEntryNode} ordered and write also all its children.
330      * Depth parameter has higher value than maximal children depth.
331      * FIXME
332      * Although ordered writer is used leaves are not written in expected order.
333      *
334      */
335     @Ignore
336     @Test
337     public void writeMapEntryNodeOrderedTest() throws Exception {
338         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
339                 writer, true, Integer.MAX_VALUE, null);
340
341         parameterWriter.write(mapEntryNodeData);
342
343         final InOrder inOrder = inOrder(writer);
344         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
345         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
346         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
347         inOrder.verify(writer, times(1)).endNode();
348         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
349         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
350         inOrder.verify(writer, times(1)).endNode();
351         // FIXME this assertion is not working because leaves are not written in expected order
352         inOrder.verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
353         inOrder.verify(writer, times(1)).scalarValue(anotherLeafNodeValue);
354         inOrder.verify(writer, times(2)).endNode();
355         verifyNoMoreInteractions(writer);
356     }
357 }