Migrate users of Optional.get()
[netconf.git] / restconf / restconf-nb / src / test / java / org / opendaylight / restconf / nb / rfc8040 / jersey / providers / ParameterAwareNormalizedNodeWriterFieldsTest.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.verifyNoMoreInteractions;
13 import static org.mockito.Mockito.when;
14
15 import java.util.Collection;
16 import java.util.List;
17 import java.util.Set;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21 import org.mockito.InOrder;
22 import org.mockito.Mock;
23 import org.mockito.junit.MockitoJUnitRunner;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
28 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
30 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
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.SystemLeafSetNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
36 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
37
38 /**
39  * Unit test for {@link ParameterAwareNormalizedNodeWriter} used with fields parameter.
40  */
41 @RunWith(MockitoJUnitRunner.StrictStubs.class)
42 public class ParameterAwareNormalizedNodeWriterFieldsTest {
43     @Mock
44     private NormalizedNodeStreamWriter writer;
45     @Mock
46     private ContainerNode containerNodeData;
47     @Mock
48     private SystemMapNode mapNodeData;
49     @Mock
50     private MapEntryNode mapEntryNodeData;
51     @Mock
52     private SystemLeafSetNode<String> leafSetNodeData;
53     @Mock
54     private LeafSetEntryNode<String> leafSetEntryNodeData;
55     @Mock
56     private LeafNode<String> keyLeafNodeData;
57
58     private NodeIdentifier containerNodeIdentifier;
59     private NodeIdentifier mapNodeIdentifier;
60     private NodeIdentifierWithPredicates mapEntryNodeIdentifier;
61     private NodeIdentifier leafSetNodeIdentifier;
62     private NodeWithValue<String> leafSetEntryNodeIdentifier;
63     private NodeIdentifier keyLeafNodeIdentifier;
64
65     private Collection<DataContainerChild> containerNodeValue;
66     private Collection<MapEntryNode> mapNodeValue;
67     private Collection<DataContainerChild> mapEntryNodeValue;
68     private Collection<LeafSetEntryNode<String>> leafSetNodeValue;
69     private String leafSetEntryNodeValue;
70     private String keyLeafNodeValue;
71
72     @Before
73     public void setUp() {
74         // identifiers
75         containerNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "container"));
76         when(containerNodeData.getIdentifier()).thenReturn(containerNodeIdentifier);
77
78         mapNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "list"));
79         when(mapNodeData.getIdentifier()).thenReturn(mapNodeIdentifier);
80
81         final QName leafSetEntryNodeQName = QName.create("namespace", "leaf-set-entry");
82         leafSetEntryNodeValue = "leaf-set-value";
83         leafSetEntryNodeIdentifier = new NodeWithValue<>(leafSetEntryNodeQName, leafSetEntryNodeValue);
84         when(leafSetEntryNodeData.getIdentifier()).thenReturn(leafSetEntryNodeIdentifier);
85
86         leafSetNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "leaf-set"));
87         when(leafSetNodeData.getIdentifier()).thenReturn(leafSetNodeIdentifier);
88
89         final QName mapEntryNodeKey = QName.create("namespace", "key-field");
90         keyLeafNodeIdentifier = NodeIdentifier.create(mapEntryNodeKey);
91         keyLeafNodeValue = "key-value";
92
93         mapEntryNodeIdentifier = NodeIdentifierWithPredicates.of(
94                 QName.create("namespace", "list-entry"), mapEntryNodeKey, keyLeafNodeValue);
95         when(mapEntryNodeData.getIdentifier()).thenReturn(mapEntryNodeIdentifier);
96         when(mapEntryNodeData.childByArg(keyLeafNodeIdentifier)).thenReturn(keyLeafNodeData);
97
98         when(keyLeafNodeData.body()).thenReturn(keyLeafNodeValue);
99         when(keyLeafNodeData.getIdentifier()).thenReturn(keyLeafNodeIdentifier);
100
101         // values
102         when(leafSetEntryNodeData.body()).thenReturn(leafSetEntryNodeValue);
103
104         leafSetNodeValue = List.of(leafSetEntryNodeData);
105         when(leafSetNodeData.body()).thenReturn(leafSetNodeValue);
106
107         containerNodeValue = Set.of(leafSetNodeData);
108         when(containerNodeData.body()).thenReturn(containerNodeValue);
109
110         mapEntryNodeValue = Set.of(keyLeafNodeData);
111         when(mapEntryNodeData.body()).thenReturn(mapEntryNodeValue);
112
113         mapNodeValue = Set.of(mapEntryNodeData);
114         when(mapNodeData.body()).thenReturn(mapNodeValue);
115     }
116
117     /**
118      * Test write {@link ContainerNode} when children which will be written are limited.
119      * Fields parameter selects 0/1 of container children to be written.
120      */
121     @Test
122     public void writeContainerWithLimitedFieldsTest() throws Exception {
123         final List<Set<QName>> limitedFields = List.of(Set.of());
124
125         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
126                 writer, null, limitedFields);
127
128         parameterWriter.write(containerNodeData);
129
130         final InOrder inOrder = inOrder(writer);
131         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, containerNodeValue.size());
132         inOrder.verify(writer, times(1)).endNode();
133         verifyNoMoreInteractions(writer);
134     }
135
136     /**
137      * Test write {@link ContainerNode} when all its children are selected to be written.
138      * Fields parameter selects 1/1 of container children to be written.
139      */
140     @Test
141     public void writeContainerAllFieldsTest() throws Exception {
142         final List<Set<QName>> limitedFields = List.of(Set.of(leafSetNodeIdentifier.getNodeType()));
143
144         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
145                 writer, null, limitedFields);
146
147         parameterWriter.write(containerNodeData);
148
149         final InOrder inOrder = inOrder(writer);
150         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, containerNodeValue.size());
151         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, leafSetNodeValue.size());
152         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
153         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
154         inOrder.verify(writer, times(3)).endNode();
155         verifyNoMoreInteractions(writer);
156     }
157
158     /**
159      * Test write {@link MapEntryNode} as child of {@link MapNode} when children which will be written are limited.
160      * Fields parameter selects 0/1 of map entry node children to be written.
161      */
162     @Test
163     public void writeMapEntryNodeWithLimitedFieldsTest() throws Exception {
164         final List<Set<QName>> limitedFields = List.of(Set.of());
165
166         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
167                 writer, null, limitedFields);
168
169         parameterWriter.write(mapNodeData);
170
171         final InOrder inOrder = inOrder(writer);
172         inOrder.verify(writer, times(1)).startMapNode(mapNodeIdentifier, mapNodeValue.size());
173         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
174         inOrder.verify(writer, times(2)).endNode();
175         verifyNoMoreInteractions(writer);
176     }
177
178     /**
179      * Test write {@link MapEntryNode} as child of {@link MapNode} when all its children will be written.
180      * Fields parameter selects 1/1 of map entry node children to be written.
181      */
182     @Test
183     public void writeMapNodeAllFieldsTest() throws Exception {
184         final List<Set<QName>> limitedFields = List.of(Set.of(keyLeafNodeData.getIdentifier().getNodeType()));
185
186         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
187                 writer, null, limitedFields);
188
189         parameterWriter.write(mapNodeData);
190
191         final InOrder inOrder = inOrder(writer);
192         inOrder.verify(writer, times(1)).startMapNode(mapNodeIdentifier, mapNodeValue.size());
193         inOrder.verify(writer, times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
194         inOrder.verify(writer, times(1)).startLeafNode(keyLeafNodeIdentifier);
195         inOrder.verify(writer, times(1)).scalarValue(keyLeafNodeValue);
196         inOrder.verify(writer, times(3)).endNode();
197         verifyNoMoreInteractions(writer);
198     }
199 }