2 * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.data.api.schema.stream;
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.mockito.ArgumentMatchers.any;
12 import static org.mockito.Mockito.doCallRealMethod;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
16 import java.io.IOException;
17 import java.util.List;
18 import java.util.Optional;
20 import org.junit.jupiter.api.Test;
21 import org.junit.jupiter.api.extension.ExtendWith;
22 import org.mockito.junit.jupiter.MockitoExtension;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
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.LeafNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
33 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
35 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
36 import org.opendaylight.yangtools.yang.model.api.ContainerLike;
37 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
38 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
39 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
41 @ExtendWith(MockitoExtension.class)
42 public class YangInstanceIdentifierWriterTest {
44 public void testYangInstanceIdentifierWriter() throws IOException {
45 final FormattingNormalizedNodeStreamWriter streamWriter = new FormattingNormalizedNodeStreamWriter();
47 final DataNodeContainer root = mock(DataNodeContainer.class);
49 final ContainerLike containerSchema1 = mock(ContainerLike.class);
50 final ContainerLike containerSchema2 = mock(ContainerLike.class);
51 final ContainerLike containerSchema3 = mock(ContainerLike.class);
53 doReturn(containerSchema1).when(root).dataChildByName(any());
54 doReturn(containerSchema2).when(containerSchema1).dataChildByName(any());
55 doReturn(containerSchema3).when(containerSchema2).dataChildByName(any());
57 final YangInstanceIdentifier path = YangInstanceIdentifier.builder()
58 .node(QName.create("test", "container-1"))
59 .node(QName.create("test", "container-2"))
60 .node(QName.create("test", "container-3"))
63 try (var iidWriter = YangInstanceIdentifierWriter.open(streamWriter, root, path)) {
64 try (var nnWriter = new NormalizedNodeWriter(streamWriter)) {
65 nnWriter.write(mockedPayload());
69 assertEquals("(test)container-1(container)\n"
70 + " (test)container-2(container)\n"
71 + " (test)container-3(container)\n"
72 + " (test)payload-container(container)\n"
73 + " (test)payload-leaf(leaf)\n"
74 + " (String)=leaf-value\n"
79 + "(end)\n", streamWriter.result());
83 public void testAugmentationIdentifier() throws IOException {
84 final FormattingNormalizedNodeStreamWriter streamWriter = new FormattingNormalizedNodeStreamWriter();
86 final ContainerLike root = mock(ContainerLike.class);
87 final QName augmented = QName.create("augment-namespace", "augmented-container");
88 final QName container2Qname = QName.create("augment-namespace", "container-2");
90 final ContainerLike containerSchema1 = mock(ContainerLike.class);
91 final AugmentationSchemaNode augmentationSchema = mock(AugmentationSchemaNode.class);
92 final ContainerLike augmentedContainerSchema = mock(ContainerLike.class);
93 final ContainerLike containerSchema2 = mock(ContainerLike.class);
95 doReturn(containerSchema1).when(root).dataChildByName(any());
97 doReturn(Set.of(augmentationSchema)).when(containerSchema1).getAvailableAugmentations();
98 doReturn(augmentedContainerSchema).when(augmentationSchema).dataChildByName(augmented);
100 doReturn(Set.of(augmentedContainerSchema)).when(augmentationSchema).getChildNodes();
101 doReturn(augmented).when(augmentedContainerSchema).getQName();
103 doReturn(containerSchema2).when(augmentedContainerSchema).dataChildByName(any());
105 final YangInstanceIdentifier path = YangInstanceIdentifier.builder()
106 .node(QName.create("test", "container-1"))
107 .node(AugmentationIdentifier.create(Set.of(augmented)))
109 .node(container2Qname)
112 try (var iidWriter = YangInstanceIdentifierWriter.open(streamWriter, root, path)) {
113 try (var nnWriter = new NormalizedNodeWriter(streamWriter)) {
114 nnWriter.write(mockedPayload());
118 assertEquals("(test)container-1(container)\n"
119 + " AugmentationIdentifier{childNames=[(augment-namespace)augmented-container]}(augmentation)\n"
120 + " (augment-namespace)augmented-container(container)\n"
121 + " (augment-namespace)container-2(container)\n"
122 + " (test)payload-container(container)\n"
123 + " (test)payload-leaf(leaf)\n"
124 + " (String)=leaf-value\n"
130 + "(end)\n", streamWriter.result());
134 public void testMapIdentifier() throws IOException {
135 final FormattingNormalizedNodeStreamWriter streamWriter = new FormattingNormalizedNodeStreamWriter();
137 final ContainerLike root = mock(ContainerLike.class);
138 final ListSchemaNode listSchemaNode = mock(ListSchemaNode.class);
140 final MapEntryNode listEntry = mock(MapEntryNode.class);
142 final ContainerLike containerSchema1 = mock(ContainerLike.class);
143 final QName container1Qname = QName.create("test", "container-1");
144 final QName list1KeyQname = QName.create("test", "list-1-key");
145 final QName listQname = QName.create("test", "list-1");
147 doReturn(listQname).when(listSchemaNode).getQName();
148 doReturn(listSchemaNode).when(root).dataChildByName(any());
149 doReturn(List.of(list1KeyQname)).when(listSchemaNode).getKeyDefinition();
150 doReturn(containerSchema1).when(listSchemaNode).dataChildByName(container1Qname);
151 doReturn("test-list-entry").when(listEntry).toString();
153 final YangInstanceIdentifier path = YangInstanceIdentifier.builder()
155 .nodeWithKey(listQname,list1KeyQname, listEntry)
156 .node(container1Qname)
159 try (var iidWriter = YangInstanceIdentifierWriter.open(streamWriter, root, path)) {
160 try (var nnWriter = new NormalizedNodeWriter(streamWriter)) {
161 nnWriter.write(mockedPayload());
165 assertEquals("(test)list-1(key)\n"
166 + " (test)list-1[{(test)list-1-key=test-list-entry}][](key)\n"
167 + " (test)container-1(container)\n"
168 + " (test)payload-container(container)\n"
169 + " (test)payload-leaf(leaf)\n"
170 + " (String)=leaf-value\n"
175 + "(end)\n", streamWriter.result());
179 public void testChoiceIdentifier() throws IOException {
180 final FormattingNormalizedNodeStreamWriter streamWriter = new FormattingNormalizedNodeStreamWriter();
181 final ContainerLike root = mock(ContainerLike.class);
182 final ChoiceSchemaNode choiceSchemaNode = mock(ChoiceSchemaNode.class);
183 final CaseSchemaNode caseSchemaNode = mock(CaseSchemaNode.class);
184 final ContainerLike caseContainer = mock(ContainerLike.class);
186 final QName choiceQname = QName.create("test", "choice-node");
187 final QName caseQname = QName.create("test", "container-in-case");
189 doReturn(choiceSchemaNode).when(root).dataChildByName(choiceQname);
190 doReturn(Set.of(caseSchemaNode)).when(choiceSchemaNode).getCases();
191 doCallRealMethod().when(choiceSchemaNode).findDataSchemaChild(any());
192 doReturn(Optional.of(caseContainer)).when(caseSchemaNode).findDataChildByName(any());
194 final YangInstanceIdentifier path = YangInstanceIdentifier.builder()
199 try (var iidWriter = YangInstanceIdentifierWriter.open(streamWriter, root, path)) {
200 try (var nnWriter = new NormalizedNodeWriter(streamWriter)) {
201 nnWriter.write(mockedPayload());
205 assertEquals("(test)choice-node(choice)\n"
206 + " (test)container-in-case(container)\n"
207 + " (test)payload-container(container)\n"
208 + " (test)payload-leaf(leaf)\n"
209 + " (String)=leaf-value\n"
213 + "(end)\n", streamWriter.result());
217 public void testLeafSetIdentifier() throws IOException {
218 final FormattingNormalizedNodeStreamWriter streamWriter = new FormattingNormalizedNodeStreamWriter();
220 final ContainerLike root = mock(ContainerLike.class);
221 final LeafListSchemaNode leafSetSchema = mock(LeafListSchemaNode.class);
223 doReturn(leafSetSchema).when(root).dataChildByName(any());
225 final YangInstanceIdentifier path = YangInstanceIdentifier.builder()
226 .node(QName.create("test", "list-list"))
229 try (var iidWriter = YangInstanceIdentifierWriter.open(streamWriter, root, path)) {
230 try (var nnWriter = new NormalizedNodeWriter(streamWriter)) {
231 final QName leafQname = QName.create("test", "leaf");
233 final LeafSetEntryNode<?> leafNode = mock(LeafSetEntryNode.class);
234 doReturn(new NodeWithValue<>(leafQname, "test-value")).when(leafNode).getIdentifier();
235 doReturn("test-value").when(leafNode).body();
236 nnWriter.write(leafNode);
238 final LeafSetEntryNode<?> leafNode2 = mock(LeafSetEntryNode.class);
239 doReturn(new NodeWithValue<>(leafQname, "test-value-2")).when(leafNode2).getIdentifier();
240 doReturn("test-value-2").when(leafNode2).body();
241 nnWriter.write(leafNode2);
245 assertEquals("(test)list-list(leaf-list)\n"
246 + " (test)leaf(entry)\n"
247 + " (String)=test-value\n"
249 + " (test)leaf(entry)\n"
250 + " (String)=test-value-2\n"
252 + "(end)\n", streamWriter.result());
255 private static NormalizedNode mockedPayload() {
256 final ContainerNode containerNode = mock(ContainerNode.class);
257 final LeafNode<?> leafNode = mock(LeafNode.class);
259 doReturn(new NodeIdentifier(QName.create("test", "payload-container"))).when(containerNode).getIdentifier();
260 doReturn(Set.of(leafNode)).when(containerNode).body();
261 doReturn(new NodeIdentifier(QName.create("test", "payload-leaf"))).when(leafNode).getIdentifier();
262 doReturn("leaf-value").when(leafNode).body();
264 return containerNode;