Modernize collection allocation
[netconf.git] / restconf / restconf-nb-rfc8040 / 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
9 package org.opendaylight.restconf.nb.rfc8040.jersey.providers;
10
11 import com.google.common.collect.Sets;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.Collections;
15 import java.util.HashSet;
16 import java.util.List;
17 import java.util.Optional;
18 import java.util.Set;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.mockito.InOrder;
22 import org.mockito.Mock;
23 import org.mockito.Mockito;
24 import org.mockito.MockitoAnnotations;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
29 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
31 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
34 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
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 public class ParameterAwareNormalizedNodeWriterFieldsTest {
42
43     @Mock
44     private NormalizedNodeStreamWriter writer;
45     @Mock
46     private ContainerNode containerNodeData;
47     @Mock
48     private MapNode mapNodeData;
49     @Mock
50     private MapEntryNode mapEntryNodeData;
51     @Mock
52     private LeafSetNode<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<?> 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         MockitoAnnotations.initMocks(this);
75
76         // identifiers
77         containerNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "container"));
78         Mockito.when(containerNodeData.getIdentifier()).thenReturn(containerNodeIdentifier);
79         Mockito.when(containerNodeData.getNodeType()).thenReturn(containerNodeIdentifier.getNodeType());
80
81         mapNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "list"));
82         Mockito.when(mapNodeData.getIdentifier()).thenReturn(mapNodeIdentifier);
83         Mockito.when(mapNodeData.getNodeType()).thenReturn(mapNodeIdentifier.getNodeType());
84
85         final QName leafSetEntryNodeQName = QName.create("namespace", "leaf-set-entry");
86         leafSetEntryNodeValue = "leaf-set-value";
87         leafSetEntryNodeIdentifier = new NodeWithValue<>(leafSetEntryNodeQName, leafSetEntryNodeValue);
88         Mockito.when(leafSetEntryNodeData.getIdentifier()).thenReturn(leafSetEntryNodeIdentifier);
89         Mockito.when(leafSetEntryNodeData.getNodeType()).thenReturn(leafSetEntryNodeIdentifier.getNodeType());
90         Mockito.when(leafSetEntryNodeData.getNodeType()).thenReturn(leafSetEntryNodeQName);
91
92         leafSetNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "leaf-set"));
93         Mockito.when(leafSetNodeData.getIdentifier()).thenReturn(leafSetNodeIdentifier);
94         Mockito.when(leafSetNodeData.getNodeType()).thenReturn(leafSetNodeIdentifier.getNodeType());
95
96         final QName mapEntryNodeKey = QName.create("namespace", "key-field");
97         keyLeafNodeIdentifier = NodeIdentifier.create(mapEntryNodeKey);
98         keyLeafNodeValue = "key-value";
99
100         mapEntryNodeIdentifier = new NodeIdentifierWithPredicates(
101                 QName.create("namespace", "list-entry"), Collections.singletonMap(mapEntryNodeKey, keyLeafNodeValue));
102         Mockito.when(mapEntryNodeData.getIdentifier()).thenReturn(mapEntryNodeIdentifier);
103         Mockito.when(mapEntryNodeData.getNodeType()).thenReturn(mapEntryNodeIdentifier.getNodeType());
104         Mockito.when(mapEntryNodeData.getChild(keyLeafNodeIdentifier)).thenReturn(Optional.of(keyLeafNodeData));
105
106         Mockito.when(keyLeafNodeData.getValue()).thenReturn(keyLeafNodeValue);
107         Mockito.when(keyLeafNodeData.getIdentifier()).thenReturn(keyLeafNodeIdentifier);
108         Mockito.when(keyLeafNodeData.getNodeType()).thenReturn(keyLeafNodeIdentifier.getNodeType());
109
110         // values
111         Mockito.when(leafSetEntryNodeData.getValue()).thenReturn(leafSetEntryNodeValue);
112
113         leafSetNodeValue = Collections.singletonList(leafSetEntryNodeData);
114         Mockito.when(leafSetNodeData.getValue()).thenReturn(leafSetNodeValue);
115
116         containerNodeValue = Collections.singleton(leafSetNodeData);
117         Mockito.when(containerNodeData.getValue()).thenReturn(containerNodeValue);
118
119         mapEntryNodeValue = Sets.newHashSet(keyLeafNodeData);
120         Mockito.when(mapEntryNodeData.getValue()).thenReturn(mapEntryNodeValue);
121
122         mapNodeValue = Collections.singleton(mapEntryNodeData);
123         Mockito.when(mapNodeData.getValue()).thenReturn(mapNodeValue);
124     }
125
126     /**
127      * Test write {@link ContainerNode} when children which will be written are limited.
128      * Fields parameter selects 0/1 of container children to be written.
129      */
130     @Test
131     public void writeContainerWithLimitedFieldsTest() throws Exception {
132         final List<Set<QName>> limitedFields = new ArrayList<>();
133         limitedFields.add(new HashSet<>());
134
135         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
136                 writer, null, limitedFields);
137
138         parameterWriter.write(containerNodeData);
139
140         final InOrder inOrder = Mockito.inOrder(writer);
141         inOrder.verify(writer, Mockito.times(1)).startContainerNode(containerNodeIdentifier, containerNodeValue.size());
142         inOrder.verify(writer, Mockito.times(1)).endNode();
143         Mockito.verifyNoMoreInteractions(writer);
144     }
145
146     /**
147      * Test write {@link ContainerNode} when all its children are selected to be written.
148      * Fields parameter selects 1/1 of container children to be written.
149      */
150     @Test
151     public void writeContainerAllFieldsTest() throws Exception {
152         final List<Set<QName>> limitedFields = new ArrayList<>();
153         limitedFields.add(Sets.newHashSet(leafSetNodeIdentifier.getNodeType()));
154
155         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
156                 writer, null, limitedFields);
157
158         parameterWriter.write(containerNodeData);
159
160         final InOrder inOrder = Mockito.inOrder(writer);
161         inOrder.verify(writer, Mockito.times(1)).startContainerNode(containerNodeIdentifier, containerNodeValue.size());
162         inOrder.verify(writer, Mockito.times(1)).startLeafSet(leafSetNodeIdentifier, leafSetNodeValue.size());
163         inOrder.verify(writer, Mockito.times(1)).leafSetEntryNode(
164                 leafSetEntryNodeIdentifier.getNodeType(), leafSetEntryNodeValue);
165         inOrder.verify(writer, Mockito.times(2)).endNode();
166         Mockito.verifyNoMoreInteractions(writer);
167     }
168
169     /**
170      * Test write {@link MapEntryNode} as child of {@link MapNode} when children which will be written are limited.
171      * Fields parameter selects 0/1 of map entry node children to be written.
172      */
173     @Test
174     public void writeMapEntryNodeWithLimitedFieldsTest() throws Exception {
175         final List<Set<QName>> limitedFields = new ArrayList<>();
176         limitedFields.add(new HashSet<>());
177
178         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
179                 writer, null, limitedFields);
180
181         parameterWriter.write(mapNodeData);
182
183         final InOrder inOrder = Mockito.inOrder(writer);
184         inOrder.verify(writer, Mockito.times(1)).startMapNode(mapNodeIdentifier, mapNodeValue.size());
185         inOrder.verify(writer, Mockito.times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
186         inOrder.verify(writer, Mockito.times(2)).endNode();
187         Mockito.verifyNoMoreInteractions(writer);
188     }
189
190     /**
191      * Test write {@link MapEntryNode} as child of {@link MapNode} when all its children will be written.
192      * Fields parameter selects 1/1 of map entry node children to be written.
193      */
194     @Test
195     public void writeMapNodeAllFieldsTest() throws Exception {
196         final List<Set<QName>> limitedFields = new ArrayList<>();
197         limitedFields.add(Sets.newHashSet(keyLeafNodeData.getNodeType()));
198
199         final ParameterAwareNormalizedNodeWriter parameterWriter = ParameterAwareNormalizedNodeWriter.forStreamWriter(
200                 writer, null, limitedFields);
201
202         parameterWriter.write(mapNodeData);
203
204         final InOrder inOrder = Mockito.inOrder(writer);
205         inOrder.verify(writer, Mockito.times(1)).startMapNode(mapNodeIdentifier, mapNodeValue.size());
206         inOrder.verify(writer, Mockito.times(1)).startMapEntryNode(mapEntryNodeIdentifier, mapEntryNodeValue.size());
207         inOrder.verify(writer, Mockito.times(1)).leafNode(keyLeafNodeIdentifier, keyLeafNodeValue);
208         inOrder.verify(writer, Mockito.times(2)).endNode();
209         Mockito.verifyNoMoreInteractions(writer);
210     }
211 }