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