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
9 package org.opendaylight.restconf.nb.rfc8040.utils.parser;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertTrue;
14 import com.google.common.collect.Maps;
15 import com.google.common.collect.Sets;
16 import java.util.LinkedHashMap;
18 import org.junit.Before;
19 import org.junit.Rule;
20 import org.junit.Test;
21 import org.junit.rules.ExpectedException;
22 import org.opendaylight.restconf.nb.rfc8040.TestRestconfUtils;
23 import org.opendaylight.restconf.nb.rfc8040.utils.parser.builder.ParserBuilderConstants;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
27 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
31 * Unit tests for {@link YangInstanceIdentifierSerializer}.
33 public class YangInstanceIdentifierSerializerTest {
36 public ExpectedException thrown = ExpectedException.none();
38 // schema context with test modules
39 private SchemaContext schemaContext;
42 public void init() throws Exception {
44 YangParserTestUtils.parseYangSources(TestRestconfUtils.loadFiles("/restconf/parser/serializer"));
48 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container node to
49 * <code>String</code>. Returned <code>String</code> is compared to have expected value.
52 public void serializeContainerTest() {
53 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
54 .node(QName.create("serializer:test", "2016-06-06", "contA"))
57 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
58 assertEquals("Serialization not successful",
59 "serializer-test:contA", result);
63 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container with leaf node to
64 * <code>String</code>. Returned <code>String</code> is compared to have expected value.
67 public void serializeContainerWithLeafTest() {
68 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
69 .node(QName.create("serializer:test", "2016-06-06", "contA"))
70 .node(QName.create("serializer:test", "2016-06-06", "leaf-A"))
73 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
74 assertEquals("Serialization not successful", "serializer-test:contA/leaf-A", result);
78 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container with list with leaf
79 * list node to <code>String</code>. Returned <code>String</code> is compared to have expected value.
82 public void serializeContainerWithListWithLeafListTest() {
83 final QName list = QName.create("serializer:test", "2016-06-06", "list-A");
84 final QName leafList = QName.create("serializer:test", "2016-06-06", "leaf-list-AA");
86 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
87 .node(QName.create("serializer:test", "2016-06-06", "contA"))
89 .node(new YangInstanceIdentifier.NodeIdentifierWithPredicates(
90 list, QName.create(list, "list-key"), 100))
92 .node(new NodeWithValue<>(leafList, "instance"))
95 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
96 assertEquals("Serialization not successful",
97 "serializer-test:contA/list-A=100/leaf-list-AA=instance",
102 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
103 * <code>YangInstanceIdentifier</code> contains list with no keys. Returned <code>String</code> is compared to have
107 public void serializeListWithNoKeysTest() {
108 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
109 .node(QName.create("serializer:test", "2016-06-06", "list-no-key"))
110 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-no-key"), Maps.newHashMap())
113 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
114 assertEquals("Serialization not successful", "serializer-test:list-no-key", result);
118 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
119 * <code>YangInstanceIdentifier</code> contains list with one key. Returned <code>String</code> is compared to have
123 public void serializeListWithOneKeyTest() {
124 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
125 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
126 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
127 QName.create("serializer:test", "2016-06-06", "list-one-key"), "value")
130 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
131 assertEquals("Serialization not successful", "serializer-test:list-one-key=value", result);
135 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
136 * <code>YangInstanceIdentifier</code> contains list with multiple keys. Returned <code>String</code> is compared
137 * to have expected value.
140 public void serializeListWithMultipleKeysTest() {
141 final QName list = QName.create("serializer:test", "2016-06-06", "list-multiple-keys");
142 final Map<QName, Object> values = new LinkedHashMap<>();
143 values.put(QName.create(list, "name"), "value-1");
144 values.put(QName.create(list, "number"), "2");
145 values.put(QName.create(list, "enabled"), "true");
147 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
148 .node(list).nodeWithKey(list, values).build();
150 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
151 assertEquals("Serialization not successful", "serializer-test:list-multiple-keys=value-1,2,true", result);
155 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
156 * <code>YangInstanceIdentifier</code> contains leaf node. Returned <code>String</code> is compared to have
160 public void serializeLeafTest() {
161 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
162 .node(QName.create("serializer:test", "2016-06-06", "leaf-0"))
165 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
166 assertEquals("Serialization not successful", "serializer-test:leaf-0", result);
170 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
171 * <code>YangInstanceIdentifier</code> contains leaf list node. Returned <code>String</code> is compared to have
175 public void serializeLeafListTest() {
176 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
177 .node(QName.create("serializer:test", "2016-06-06", "leaf-list-0"))
178 .node(new NodeWithValue<>(QName.create("serializer:test", "2016-06-06", "leaf-list-0"), "instance"))
181 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
182 assertEquals("Serialization not successful", "serializer-test:leaf-list-0=instance", result);
186 * Negative test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when
187 * <code>SchemaContext</code> is <code>null</code>. Test is expected to fail with
188 * <code>NullPointerException</code>.
191 public void serializeNullSchemaContextNegativeTest() {
192 this.thrown.expect(NullPointerException.class);
193 YangInstanceIdentifierSerializer.create(null, YangInstanceIdentifier.EMPTY);
197 * Negative test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when supplied
198 * <code>YangInstanceIdentifier</code> is <code>null</code>. Test is expected to fail with
199 * <code>NullPointerException</code>.
202 public void serializeNullDataNegativeTest() {
203 this.thrown.expect(NullPointerException.class);
204 YangInstanceIdentifierSerializer.create(this.schemaContext, null);
208 * Test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when supplied
209 * <code>YangInstanceIdentifier</code> is <code>YangInstanceIdentifier.EMPTY</code>.
210 * Empty <code>String</code> is expected as a return value.
213 public void serializeEmptyDataTest() {
214 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, YangInstanceIdentifier.EMPTY);
215 assertTrue("Empty identifier is expected", result.isEmpty());
219 * Negative test when it is not possible to find child node of current node. Test is expected to fail with
220 * <code>IllegalArgumentException</code> and error message is compared to expected error message.
223 public void serializeChildNodeNotFoundNegativeTest() {
224 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
225 .node(QName.create("serializer:test", "2016-06-06", "contA"))
226 .node(QName.create("serializer:test", "2016-06-06", "not-existing-leaf"))
229 this.thrown.expect(IllegalArgumentException.class);
230 YangInstanceIdentifierSerializer.create(this.schemaContext, data);
234 * Test to verify if all reserved characters according to rfc3986 are considered by serializer implementation to
235 * be percent encoded.
238 public void verifyReservedCharactersTest() {
239 final char[] genDelims = { ':', '/', '?', '#', '[', ']', '@' };
240 final char[] subDelims = { '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=' };
242 for (final char c : genDelims) {
243 assertTrue("Current character is reserved and should be percent encoded",
244 ParserBuilderConstants.Serializer.PERCENT_ENCODE_CHARS.matches(c));
247 for (final char c : subDelims) {
248 assertTrue("Current character is reserved and should be percent encoded",
249 ParserBuilderConstants.Serializer.PERCENT_ENCODE_CHARS.matches(c));
254 * Test if URIs with percent encoded characters are all correctly serialized.
257 public void serializePercentEncodingTest() {
258 final String value = "foo" + ":foo bar/" + "foo,bar/" + "'bar'";
259 final String encoded = "foo%3Afoo%20bar%2Ffoo%2Cbar%2F%27bar%27";
261 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
262 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
263 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
264 QName.create("serializer:test", "2016-06-06", "list-one-key"), value)
267 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
268 assertEquals("Serialization not successful", "serializer-test:list-one-key=" + encoded, result);
272 * Test if URIs with no percent encoded characters are correctly serialized. Input should be untouched.
275 public void serializeNoPercentEncodingTest() {
276 final String value = "foo\"b\"bar";
278 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
279 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
280 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
281 QName.create("serializer:test", "2016-06-06", "list-one-key"), value)
284 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
285 assertEquals("Serialization not successful", "serializer-test:list-one-key=" + value, result);
289 * Test of serialization when nodes in input <code>YangInstanceIdentifier</code> are defined in two different
290 * modules by using augmentation.
293 public void serializeIncludedNodesTest() {
294 final QName list = QName.create("serializer:test:included", "2016-06-06", "augmented-list");
295 final QName child = QName.create("serializer:test", "2016-06-06", "augmented-leaf");
297 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
299 .node(new YangInstanceIdentifier.NodeIdentifierWithPredicates(
300 list, QName.create(list, "list-key"), 100))
301 .node(new YangInstanceIdentifier.AugmentationIdentifier(Sets.newHashSet(child)))
305 final String result = YangInstanceIdentifierSerializer.create(this.schemaContext, data);
307 assertEquals("Serialization not successful",
308 "serializer-test-included:augmented-list=100/serializer-test:augmented-leaf", result);
312 * Test of serialization when nodes in input <code>YangInstanceIdentifier</code> are defined in two different
313 * modules by using augmentation. Augmented node in data supplied for serialization has wrong namespace.
314 * <code>IllegalArgumentException</code> is expected because augmented node is defined in other module than its
315 * parent and will not be found.
318 public void serializeIncludedNodesSerializationTest() {
319 final QName list = QName.create("serializer:test:included", "2016-06-06", "augmented-list");
320 // child should has different namespace
321 final QName child = QName.create("serializer:test:included", "2016-06-06", "augmented-leaf");
323 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
325 .node(new YangInstanceIdentifier.NodeIdentifierWithPredicates(
326 list, QName.create(list, "list-key"), 100))
327 .node(new YangInstanceIdentifier.AugmentationIdentifier(Sets.newHashSet(child)))
331 this.thrown.expect(IllegalArgumentException.class);
332 YangInstanceIdentifierSerializer.create(this.schemaContext, data);