d38bcca4c33a341ace2c6acf4cbc96d8dedcaabb
[netconf.git] / restconf / restconf-nb / src / test / java / org / opendaylight / restconf / nb / rfc8040 / jersey / providers / RestconfNormalizedNodeWriterParametersTest.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
14 import java.util.List;
15 import java.util.Set;
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.NodeWithValue;
24 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.SystemLeafSetNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
28 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
29 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
30
31 /**
32  * Unit test for {@link RestconfNormalizedNodeWriter} used with all parameters.
33  */
34 @RunWith(MockitoJUnitRunner.StrictStubs.class)
35 public class RestconfNormalizedNodeWriterParametersTest {
36     private final String leafSetEntryNodeValue = "leaf-set-value";
37     private final NodeIdentifier containerNodeIdentifier =
38         NodeIdentifier.create(QName.create("namespace", "container"));
39     private final NodeIdentifier leafSetNodeIdentifier = NodeIdentifier.create(QName.create("namespace", "leaf-set"));
40     private final NodeWithValue<String> leafSetEntryNodeIdentifier =
41         new NodeWithValue<>(QName.create("namespace", "leaf-set-entry"), leafSetEntryNodeValue);
42
43     private final LeafSetEntryNode<String> leafSetEntryNodeData = ImmutableNodes.<String>newLeafSetEntryBuilder()
44         .withNodeIdentifier(leafSetEntryNodeIdentifier)
45         .withValue(leafSetEntryNodeValue)
46         .build();
47     private final SystemLeafSetNode<String> leafSetNodeData = ImmutableNodes.<String>newSystemLeafSetBuilder()
48         .withNodeIdentifier(leafSetNodeIdentifier)
49         .withChild(leafSetEntryNodeData)
50         .build();
51     private final ContainerNode containerNodeData = ImmutableNodes.newContainerBuilder()
52         .withNodeIdentifier(containerNodeIdentifier)
53         .withChild(leafSetNodeData)
54         .build();
55     private final ContainerNode rootDataContainerData = ImmutableNodes.newContainerBuilder()
56         .withNodeIdentifier(NodeIdentifier.create(
57             QName.create("urn:ietf:params:xml:ns:netconf:base:1.0", "data")))
58         .withChild(leafSetNodeData)
59         .build();
60
61     @Mock
62     private NormalizedNodeStreamWriter writer;
63
64     /**
65      * Test write {@link ContainerNode} when all its children are selected to be written by fields parameter.
66      * Depth parameter is also used and limits output to depth 1.
67      * Fields parameter has effect limiting depth parameter in the way that selected nodes and its ancestors are
68      * written regardless of their depth (some of container children have depth > 1).
69      * Fields parameter selects all container children to be written and also all children of those children.
70      */
71     @Test
72     public void writeContainerParameterPrioritiesTest() throws Exception {
73         final var parameterWriter = RestconfNormalizedNodeWriter.forStreamWriter(writer, DepthParam.min(),
74             List.of(
75                 Set.of(leafSetNodeIdentifier.getNodeType()),
76                 Set.of(leafSetEntryNodeIdentifier.getNodeType())));
77
78         parameterWriter.write(containerNodeData);
79
80         final var inOrder = inOrder(writer);
81         inOrder.verify(writer, times(1)).startContainerNode(containerNodeIdentifier, 1);
82         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, 1);
83         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
84         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
85         inOrder.verify(writer, times(3)).endNode();
86         verifyNoMoreInteractions(writer);
87     }
88
89     /**
90      * Test write {@link ContainerNode} which represents data at restconf/data root.
91      * No parameters are used.
92      */
93     @Test
94     public void writeRootDataTest() throws Exception {
95         final var parameterWriter = RestconfNormalizedNodeWriter.forStreamWriter(writer, null);
96
97         parameterWriter.write(rootDataContainerData);
98
99         final var inOrder = inOrder(writer);
100         inOrder.verify(writer, times(1)).startLeafSet(leafSetNodeIdentifier, 1);
101         inOrder.verify(writer, times(1)).startLeafSetEntryNode(leafSetEntryNodeIdentifier);
102         inOrder.verify(writer, times(1)).scalarValue(leafSetEntryNodeValue);
103         inOrder.verify(writer, times(2)).endNode();
104         verifyNoMoreInteractions(writer);
105     }
106
107     @Test
108     public void writeEmptyRootContainerTest() throws Exception {
109         final var parameterWriter = RestconfNormalizedNodeWriter.forStreamWriter(writer, null);
110
111         parameterWriter.write(ImmutableNodes.newContainerBuilder()
112             .withNodeIdentifier(new NodeIdentifier(SchemaContext.NAME))
113             .build());
114     }
115 }