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