2 * Copyright (c) 2016 Cisco Systems, Inc. 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.restconf.nb.rfc8040.utils.parser;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertThrows;
12 import static org.junit.Assert.assertTrue;
14 import java.util.LinkedHashMap;
16 import org.junit.AfterClass;
17 import org.junit.BeforeClass;
18 import org.junit.Test;
19 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
23 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
24 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
25 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
28 * Unit tests for {@link YangInstanceIdentifierSerializer}.
30 public class YangInstanceIdentifierSerializerTest {
31 // schema context with test modules
32 private static EffectiveModelContext SCHEMA_CONTEXT;
35 public static void beforeClass() {
36 SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/restconf/parser/serializer");
40 public static void afterClass() {
41 SCHEMA_CONTEXT = null;
45 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container node to
46 * <code>String</code>. Returned <code>String</code> is compared to have expected value.
49 public void serializeContainerTest() {
50 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
51 .node(QName.create("serializer:test", "2016-06-06", "contA"))
54 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
55 assertEquals("Serialization not successful",
56 "serializer-test:contA", result);
60 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container with leaf node to
61 * <code>String</code>. Returned <code>String</code> is compared to have expected value.
64 public void serializeContainerWithLeafTest() {
65 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
66 .node(QName.create("serializer:test", "2016-06-06", "contA"))
67 .node(QName.create("serializer:test", "2016-06-06", "leaf-A"))
70 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
71 assertEquals("Serialization not successful", "serializer-test:contA/leaf-A", result);
75 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container with list with leaf
76 * list node to <code>String</code>. Returned <code>String</code> is compared to have expected value.
79 public void serializeContainerWithListWithLeafListTest() {
80 final QName list = QName.create("serializer:test", "2016-06-06", "list-A");
81 final QName leafList = QName.create("serializer:test", "2016-06-06", "leaf-list-AA");
83 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
84 .node(QName.create("serializer:test", "2016-06-06", "contA"))
86 .node(NodeIdentifierWithPredicates.of(list, QName.create(list, "list-key"), 100))
88 .node(new NodeWithValue<>(leafList, "instance"))
91 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
92 assertEquals("Serialization not successful",
93 "serializer-test:contA/list-A=100/leaf-list-AA=instance",
98 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
99 * <code>YangInstanceIdentifier</code> contains list with no keys. Returned <code>String</code> is compared to have
103 public void serializeListWithNoKeysTest() {
104 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
105 .node(QName.create("serializer:test", "2016-06-06", "list-no-key"))
106 .node(QName.create("serializer:test", "2016-06-06", "list-no-key"))
109 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
110 assertEquals("Serialization not successful", "serializer-test:list-no-key", result);
114 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
115 * <code>YangInstanceIdentifier</code> contains a keyed list, but the path argument does not specify them. Returned
116 * <code>String</code> is compared to have expected value.
119 public void serializeMapWithNoKeysTest() {
120 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
121 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
122 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"), Map.of())
125 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
126 assertEquals("Serialization not successful", "serializer-test:list-one-key", result);
130 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
131 * <code>YangInstanceIdentifier</code> contains list with one key. Returned <code>String</code> is compared to have
135 public void serializeMapWithOneKeyTest() {
136 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
137 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
138 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
139 QName.create("serializer:test", "2016-06-06", "list-one-key"), "value")
142 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
143 assertEquals("Serialization not successful", "serializer-test:list-one-key=value", result);
147 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
148 * <code>YangInstanceIdentifier</code> contains list with multiple keys. Returned <code>String</code> is compared
149 * to have expected value.
152 public void serializeMapWithMultipleKeysTest() {
153 final QName list = QName.create("serializer:test", "2016-06-06", "list-multiple-keys");
154 final Map<QName, Object> values = new LinkedHashMap<>();
155 values.put(QName.create(list, "name"), "value-1");
156 values.put(QName.create(list, "number"), "2");
157 values.put(QName.create(list, "enabled"), "true");
159 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
160 .node(list).nodeWithKey(list, values).build();
162 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
163 assertEquals("Serialization not successful", "serializer-test:list-multiple-keys=value-1,2,true", result);
167 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
168 * <code>YangInstanceIdentifier</code> contains leaf node. Returned <code>String</code> is compared to have
172 public void serializeLeafTest() {
173 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
174 .node(QName.create("serializer:test", "2016-06-06", "leaf-0"))
177 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
178 assertEquals("Serialization not successful", "serializer-test:leaf-0", result);
182 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
183 * <code>YangInstanceIdentifier</code> contains leaf list node. Returned <code>String</code> is compared to have
187 public void serializeLeafListTest() {
188 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
189 .node(QName.create("serializer:test", "2016-06-06", "leaf-list-0"))
190 .node(new NodeWithValue<>(QName.create("serializer:test", "2016-06-06", "leaf-list-0"), "instance"))
193 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
194 assertEquals("Serialization not successful", "serializer-test:leaf-list-0=instance", result);
198 * Negative test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when
199 * <code>SchemaContext</code> is <code>null</code>. Test is expected to fail with
200 * <code>NullPointerException</code>.
203 public void serializeNullSchemaContextNegativeTest() {
204 assertThrows(NullPointerException.class,
205 () -> YangInstanceIdentifierSerializer.create(null, YangInstanceIdentifier.of()));
209 * Negative test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when supplied
210 * <code>YangInstanceIdentifier</code> is <code>null</code>. Test is expected to fail with
211 * <code>NullPointerException</code>.
214 public void serializeNullDataNegativeTest() {
215 assertThrows(NullPointerException.class,
216 () -> YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, null));
220 * Test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when supplied
221 * <code>YangInstanceIdentifier</code> is <code>YangInstanceIdentifier.EMPTY</code>.
222 * Empty <code>String</code> is expected as a return value.
225 public void serializeEmptyDataTest() {
226 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, YangInstanceIdentifier.of());
227 assertTrue("Empty identifier is expected", result.isEmpty());
231 * Negative test when it is not possible to find child node of current node. Test is expected to fail with
232 * <code>RestconfDocumentedException</code> and error message is compared to expected error message.
235 public void serializeChildNodeNotFoundNegativeTest() {
236 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
237 .node(QName.create("serializer:test", "2016-06-06", "contA"))
238 .node(QName.create("serializer:test", "2016-06-06", "not-existing-leaf"))
241 assertThrows(RestconfDocumentedException.class,
242 () -> YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data));
246 * Test if URIs with percent encoded characters are all correctly serialized.
249 public void serializePercentEncodingTest() {
250 final String value = "foo:foo bar/foo,bar/'bar'";
251 final String encoded = "foo%3Afoo%20bar%2Ffoo%2Cbar%2F%27bar%27";
253 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
254 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
255 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
256 QName.create("serializer:test", "2016-06-06", "list-one-key"), value)
259 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
260 assertEquals("Serialization not successful", "serializer-test:list-one-key=" + encoded, result);
264 * Test if URIs with no percent encoded characters are correctly serialized. Input should be untouched.
267 public void serializeNoPercentEncodingTest() {
268 final String value = "foo\"b\"bar";
270 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
271 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
272 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
273 QName.create("serializer:test", "2016-06-06", "list-one-key"), value)
276 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
277 assertEquals("Serialization not successful", "serializer-test:list-one-key=" + value, result);
281 * Test of serialization when nodes in input <code>YangInstanceIdentifier</code> are defined in two different
282 * modules by using augmentation.
285 public void serializeIncludedNodesTest() {
286 final QName list = QName.create("serializer:test:included", "2016-06-06", "augmented-list");
287 final QName child = QName.create("serializer:test", "2016-06-06", "augmented-leaf");
289 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
291 .node(NodeIdentifierWithPredicates.of(list, QName.create(list, "list-key"), 100))
295 final String result = YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data);
297 assertEquals("Serialization not successful",
298 "serializer-test-included:augmented-list=100/serializer-test:augmented-leaf", result);
302 * Test of serialization when nodes in input <code>YangInstanceIdentifier</code> are defined in two different
303 * modules by using augmentation. Augmented node in data supplied for serialization has wrong namespace.
304 * <code>RestconfDocumentedException</code> is expected because augmented node is defined in other module than its
305 * parent and will not be found.
308 public void serializeIncludedNodesSerializationTest() {
309 final QName list = QName.create("serializer:test:included", "2016-06-06", "augmented-list");
310 // child should has different namespace
311 final QName child = QName.create("serializer:test:included", "2016-06-06", "augmented-leaf");
313 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
315 .node(NodeIdentifierWithPredicates.of(list, QName.create(list, "list-key"), 100))
319 assertThrows(RestconfDocumentedException.class,
320 () -> YangInstanceIdentifierSerializer.create(SCHEMA_CONTEXT, data));