a3010f0d0c1756639068577aa89e5e8235837f75
[netconf.git] / restconf / restconf-nb / 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
15 import org.junit.Ignore;
16 import org.junit.Test;
17 import org.junit.runner.RunWith;
18 import org.mockito.Mock;
19 import org.mockito.junit.MockitoJUnitRunner;
20 import org.opendaylight.restconf.api.query.DepthParam;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
23 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
25 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
28 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.SystemLeafSetNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
34 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
35 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
36
37 /**
38  * Unit test for {@link ParameterAwareNormalizedNodeWriter} used with depth parameter.
39  */
40 @RunWith(MockitoJUnitRunner.StrictStubs.class)
41 public class ParameterAwareNormalizedNodeWriterDepthTest {
42     private final String leafSetEntryNodeValue = "leaf-set-value";
43     private final String keyLeafNodeValue = "key-value";
44     private final String anotherLeafNodeValue = "another-value";
45
46     private final NodeIdentifier containerNodeIdentifier =
47         NodeIdentifier.create(QName.create("namespace", "container"));
48     private final NodeIdentifier mapNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "list"));
49     private final NodeIdentifier keyLeafNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "key-field"));
50     private final NodeWithValue<String> leafSetEntryNodeIdentifier =
51         new NodeWithValue<>(QName.create("namespace", "leaf-set-entry"), leafSetEntryNodeValue);
52     private final NodeIdentifier leafSetNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "leaf-set"));
53     private final NodeIdentifierWithPredicates mapEntryNodeIdentifier = NodeIdentifierWithPredicates.of(
54         QName.create("namespace", "list-entry"), keyLeafNodeIdentifier.getNodeType(), keyLeafNodeValue);
55     private final NodeIdentifier anotherLeafNodeIdentifier =
56         NodeIdentifier.create(QName.create("namespace", "another-field"));
57
58     private final LeafNode<String> keyLeafNodeData = ImmutableNodes.leafNode(keyLeafNodeIdentifier, keyLeafNodeValue);
59     private final LeafNode<String> anotherLeafNodeData =
60         ImmutableNodes.leafNode(anotherLeafNodeIdentifier, anotherLeafNodeValue);
61     private final LeafSetEntryNode<String> leafSetEntryNodeData = Builders.<String>leafSetEntryBuilder()
62         .withNodeIdentifier(leafSetEntryNodeIdentifier)
63         .withValue(leafSetEntryNodeValue)
64         .build();
65     private final SystemLeafSetNode<String> leafSetNodeData = Builders.<String>leafSetBuilder()
66         .withNodeIdentifier(leafSetNodeIdentifier)
67         .withChild(leafSetEntryNodeData)
68         .build();
69     private final MapEntryNode mapEntryNodeData = Builders.mapEntryBuilder()
70         .withNodeIdentifier(mapEntryNodeIdentifier)
71         .withChild(keyLeafNodeData)
72         .withChild(anotherLeafNodeData)
73         .build();
74     private final SystemMapNode mapNodeData = Builders.mapBuilder()
75         .withNodeIdentifier(mapNodeIdentifier)
76         .withChild(mapEntryNodeData)
77         .build();
78     private final ContainerNode containerNodeData = Builders.containerBuilder()
79         .withNodeIdentifier(containerNodeIdentifier)
80         .withChild(leafSetNodeData)
81         .build();
82
83     @Mock
84     private NormalizedNodeStreamWriter writer;
85
86     /**
87      * Test write {@link ContainerNode} with children but write data only to depth 1 (children will not be written).
88      * Depth parameter is limited to 1.
89      */
90     @Test
91     public void writeContainerWithoutChildrenDepthTest() throws Exception {
92         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, DepthParam.min(), null);
93
94         parameterWriter.write(containerNodeData);
95
96         final var inOrder = inOrder(writer);
97         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, 1);
98         inOrder.verify(writer, times(1)).endNode();
99         verifyNoMoreInteractions(writer);
100     }
101
102     /**
103      * Test write {@link ContainerNode} with children and write also all its children.
104      * Depth parameter has higher value than maximal children depth.
105      */
106     @Test
107     public void writeContainerWithChildrenDepthTest() throws Exception {
108         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, DepthParam.max(), null);
109
110         parameterWriter.write(containerNodeData);
111
112         final var inOrder = inOrder(writer);
113         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, 1);
114         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, 1);
115         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
116         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
117         inOrder.verify(writer, times(3)).endNode();
118         verifyNoMoreInteractions(writer);
119     }
120
121     /**
122      * Test write with {@link MapNode} with children but write data only to depth 1 (children will not be written).
123      * Depth parameter limits depth to 1.
124      */
125     @Test
126     public void writeMapNodeWithoutChildrenDepthTest() throws Exception {
127         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, DepthParam.min(), null);
128
129         parameterWriter.write(mapNodeData);
130
131         final var inOrder = inOrder(writer);
132         inOrder.verify(writer, times(1)).startMapNode(mapNodeIdentifier, 1);
133         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, 2);
134         inOrder.verify(writer, times(2)).endNode();
135         verifyNoMoreInteractions(writer);
136     }
137
138     /**
139      * Test write {@link MapNode} with children and write also all its children.
140      * Depth parameter has higher value than maximal children depth.
141      * FIXME
142      * Although ordered writer is used leaves are not written in expected order.
143      *
144      */
145     @Ignore
146     @Test
147     public void writeMapNodeWithChildrenDepthTest() throws Exception {
148         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, DepthParam.max(), null);
149
150         parameterWriter.write(mapNodeData);
151
152         final var inOrder = inOrder(writer);
153         inOrder.verify(writer, times(1)).startMapNode(mapNodeIdentifier, 1);
154         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, 2);
155         inOrder.verify(writer, times(2)).startLeafNode(keyLeafNodeIdentifier);
156         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
157         inOrder.verify(writer, times(1)).endNode();
158         inOrder.verify(writer, times(2)).startLeafNode(keyLeafNodeIdentifier);
159         inOrder.verify(writer, times(2)).scalarValue(keyLeafNodeValue);
160         inOrder.verify(writer, times(2)).endNode();
161         // FIXME this assertion is not working because leaves are not written in expected order
162         inOrder.verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
163         inOrder.verify(writer, times(1)).scalarValue(anotherLeafNodeValue);
164         inOrder.verify(writer, times(3)).endNode();
165         verifyNoMoreInteractions(writer);
166     }
167
168     /**
169      * Test write with {@link LeafSetNode} with depth 1 (children will not be written).
170      * Depth parameter limits depth to 1.
171      */
172     @Test
173     public void writeLeafSetNodeWithoutChildrenDepthTest() throws Exception {
174         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, DepthParam.min(), null);
175
176         parameterWriter.write(leafSetNodeData);
177
178         final var inOrder = inOrder(writer);
179         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, 1);
180         inOrder.verify(writer, times(1)).endNode();
181         verifyNoMoreInteractions(writer);
182     }
183
184     /**
185      * Test write with {@link LeafSetNode} when all its children will be written.
186      * Depth parameter has higher value than maximal children depth.
187      */
188     @Test
189     public void writeLeafSetNodeWithChildrenDepthTest() throws Exception {
190         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, DepthParam.max(), null);
191
192         parameterWriter.write(leafSetNodeData);
193
194         final var inOrder = inOrder(writer);
195         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, 1);
196         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
197         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
198         inOrder.verify(writer, times(2)).endNode();
199         verifyNoMoreInteractions(writer);
200     }
201
202     /**
203      * Test write with {@link LeafSetEntryNode}.
204      * Depth parameter has higher value than maximal children depth.
205      */
206     @Test
207     public void writeLeafSetEntryNodeDepthTest() throws Exception {
208         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, DepthParam.max(), null);
209
210         parameterWriter.write(leafSetEntryNodeData);
211
212         final var inOrder = inOrder(writer);
213         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
214         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
215         inOrder.verify(writer, times(1)).endNode();
216         verifyNoMoreInteractions(writer);
217     }
218
219     /**
220      * Test write with {@link MapEntryNode} unordered to depth 1 to write only keys.
221      * Depth parameter limits depth to 1.
222      */
223     @Test
224     public void writeMapEntryNodeUnorderedOnlyKeysDepthTest() throws Exception {
225         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, false, DepthParam.min(),
226             null);
227
228         parameterWriter.write(mapEntryNodeData);
229
230         final var inOrder = inOrder(writer);
231         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, 2);
232         // write only the key
233         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
234         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
235         inOrder.verify(writer, times(2)).endNode();
236         verifyNoMoreInteractions(writer);
237     }
238
239     /**
240      * Test write with {@link MapEntryNode} unordered with full depth.
241      * Depth parameter has higher value than maximal children depth.
242      */
243     @Test
244     public void writeMapEntryNodeUnorderedDepthTest() throws Exception {
245         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, false, DepthParam.max(),
246             null);
247
248         parameterWriter.write(mapEntryNodeData);
249
250         // unordered
251         verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, 2);
252         verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
253         verify(writer, times(1)).scalarValue(keyLeafNodeValue);
254         verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
255         verify(writer, times(1)).scalarValue(anotherLeafNodeValue);
256         verify(writer, times(3)).endNode();
257         verifyNoMoreInteractions(writer);
258     }
259
260     /**
261      * Test write with {@link MapEntryNode} ordered with depth 1 (children will not be written).
262      * Depth parameter limits depth to 1.
263      */
264     @Test
265     public void writeMapEntryNodeOrderedWithoutChildrenTest() throws Exception {
266         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, true, DepthParam.min(),
267             null);
268
269         parameterWriter.write(mapEntryNodeData);
270
271         final var inOrder = inOrder(writer);
272         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, 2);
273         inOrder.verify(writer, times(1)).endNode();
274         verifyNoMoreInteractions(writer);
275     }
276
277     /**
278      * Test write with {@link MapEntryNode} ordered and write also all its children.
279      * Depth parameter has higher value than maximal children depth.
280      * FIXME
281      * Although ordered writer is used leaves are not written in expected order.
282      *
283      */
284     @Ignore
285     @Test
286     public void writeMapEntryNodeOrderedTest() throws Exception {
287         final var parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(writer, true, DepthParam.max(),
288             null);
289
290         parameterWriter.write(mapEntryNodeData);
291
292         final var inOrder = inOrder(writer);
293         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, 2);
294         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
295         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
296         inOrder.verify(writer, times(1)).endNode();
297         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
298         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
299         inOrder.verify(writer, times(1)).endNode();
300         // FIXME this assertion is not working because leaves are not written in expected order
301         inOrder.verify(writer, times(1)).startLeafNode(anotherLeafNodeIdentifier);
302         inOrder.verify(writer, times(1)).scalarValue(anotherLeafNodeValue);
303         inOrder.verify(writer, times(2)).endNode();
304         verifyNoMoreInteractions(writer);
305     }
306 }