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.parser.builder;
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.controller.md.sal.rest.common.TestRestconfUtils;
23 import org.opendaylight.restconf.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;
30 * Unit tests for {@link YangInstanceIdentifierSerializer}
32 public class YangInstanceIdentifierSerializerTest {
35 public ExpectedException thrown = ExpectedException.none();
37 // schema context with test modules
38 private SchemaContext schemaContext;
41 public void init() throws Exception {
42 schemaContext = TestRestconfUtils.loadSchemaContext("/restconf/parser/serializer");
46 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container node to
47 * <code>String</code>. Returned <code>String</code> is compared to have expected value.
50 public void serializeContainerTest() {
51 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
52 .node(QName.create("serializer:test", "2016-06-06", "contA"))
55 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
56 assertEquals("Serialization not successful",
57 "serializer-test:contA", result);
61 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container with leaf node to
62 * <code>String</code>. Returned <code>String</code> is compared to have expected value.
65 public void serializeContainerWithLeafTest() {
66 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
67 .node(QName.create("serializer:test", "2016-06-06", "contA"))
68 .node(QName.create("serializer:test", "2016-06-06", "leaf-A"))
71 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
72 assertEquals("Serialization not successful", "serializer-test:contA/leaf-A", result);
76 * Positive test of serialization of <code>YangInstanceIdentifier</code> containing container with list with leaf
77 * list node to <code>String</code>. Returned <code>String</code> is compared to have expected value.
80 public void serializeContainerWithListWithLeafListTest() {
81 final QName list = QName.create("serializer:test", "2016-06-06", "list-A");
82 final QName leafList = QName.create("serializer:test", "2016-06-06", "leaf-list-AA");
84 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
85 .node(QName.create("serializer:test", "2016-06-06", "contA"))
87 .node(new YangInstanceIdentifier.NodeIdentifierWithPredicates(
88 list, QName.create(list, "list-key"), 100))
90 .node(new NodeWithValue(leafList, "instance"))
93 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
94 assertEquals("Serialization not successful",
95 "serializer-test:contA/list-A=100/leaf-list-AA=instance",
100 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
101 * <code>YangInstanceIdentifier</code> contains list with no keys. Returned <code>String</code> is compared to have
105 public void serializeListWithNoKeysTest() {
106 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
107 .node(QName.create("serializer:test", "2016-06-06", "list-no-key"))
108 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-no-key"), Maps.newHashMap())
111 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
112 assertEquals("Serialization not successful", "serializer-test:list-no-key", result);
116 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
117 * <code>YangInstanceIdentifier</code> contains list with one key. Returned <code>String</code> is compared to have
121 public void serializeListWithOneKeyTest() {
122 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
123 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
124 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
125 QName.create("serializer:test", "2016-06-06", "list-one-key"), "value")
128 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
129 assertEquals("Serialization not successful", "serializer-test:list-one-key=value", result);
133 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
134 * <code>YangInstanceIdentifier</code> contains list with multiple keys. Returned <code>String</code> is compared
135 * to have expected value.
138 public void serializeListWithMultipleKeysTest() {
139 final QName list = QName.create("serializer:test", "2016-06-06", "list-multiple-keys");
140 final Map<QName, Object> values = new LinkedHashMap<>();
141 values.put(QName.create(list, "name"), "value-1");
142 values.put(QName.create(list, "number"), "2");
143 values.put(QName.create(list, "enabled"), "true");
145 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
146 .node(list).nodeWithKey(list, values).build();
148 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
149 assertEquals("Serialization not successful", "serializer-test:list-multiple-keys=value-1,2,true", result);
153 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
154 * <code>YangInstanceIdentifier</code> contains leaf node. Returned <code>String</code> is compared to have
158 public void serializeLeafTest() {
159 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
160 .node(QName.create("serializer:test", "2016-06-06", "leaf-0"))
163 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
164 assertEquals("Serialization not successful", "serializer-test:leaf-0", result);
168 * Positive test of serialization of <code>YangInstanceIdentifier</code> to <code>String</code> when serialized
169 * <code>YangInstanceIdentifier</code> contains leaf list node. Returned <code>String</code> is compared to have
173 public void serializeLeafListTest() {
174 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
175 .node(QName.create("serializer:test", "2016-06-06", "leaf-list-0"))
176 .node(new NodeWithValue(QName.create("serializer:test", "2016-06-06", "leaf-list-0"), "instance"))
179 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
180 assertEquals("Serialization not successful", "serializer-test:leaf-list-0=instance", result);
184 * Negative test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when
185 * <code>SchemaContext</code> is <code>null</code>. Test is expected to fail with
186 * <code>NullPointerException</code>.
189 public void serializeNullSchemaContextNegativeTest() {
190 thrown.expect(NullPointerException.class);
191 YangInstanceIdentifierSerializer.create(null, YangInstanceIdentifier.EMPTY);
195 * Negative test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when supplied
196 * <code>YangInstanceIdentifier</code> is <code>null</code>. Test is expected to fail with
197 * <code>NullPointerException</code>.
200 public void serializeNullDataNegativeTest() {
201 thrown.expect(NullPointerException.class);
202 YangInstanceIdentifierSerializer.create(schemaContext, null);
206 * Test of serialization <code>YangInstanceIdentifier</code> to <code>String</code> when supplied
207 * <code>YangInstanceIdentifier</code> is <code>YangInstanceIdentifier.EMPTY</code>.
208 * Empty <code>String</code> is expected as a return value.
211 public void serializeEmptyDataTest() {
212 final String result = YangInstanceIdentifierSerializer.create(schemaContext, YangInstanceIdentifier.EMPTY);
213 assertTrue("Empty identifier is expected", result.isEmpty());
217 * Negative test when it is not possible to find child node of current node. Test is expected to fail with
218 * <code>IllegalArgumentException</code> and error message is compared to expected error message.
221 public void serializeChildNodeNotFoundNegativeTest() {
222 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
223 .node(QName.create("serializer:test", "2016-06-06", "contA"))
224 .node(QName.create("serializer:test", "2016-06-06", "not-existing-leaf"))
227 thrown.expect(IllegalArgumentException.class);
228 YangInstanceIdentifierSerializer.create(schemaContext, data);
232 * Test to verify if all reserved characters according to rfc3986 are considered by serializer implementation to
233 * be percent encoded.
236 public void verifyReservedCharactersTest() {
237 final char[] genDelims = { ':', '/', '?', '#', '[', ']', '@' };
238 final char[] subDelims = { '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=' };
240 for (final char c : genDelims) {
241 assertTrue("Current character is reserved and should be percent encoded",
242 ParserBuilderConstants.Serializer.PERCENT_ENCODE_CHARS.matches(c));
245 for (final char c : subDelims) {
246 assertTrue("Current character is reserved and should be percent encoded",
247 ParserBuilderConstants.Serializer.PERCENT_ENCODE_CHARS.matches(c));
252 * Test if URIs with percent encoded characters are all correctly serialized.
255 public void serializePercentEncodingTest() {
256 final String value = "foo" + ":foo bar/" + "foo,bar/" + "'bar'";
257 final String encoded = "foo%3Afoo%20bar%2Ffoo%2Cbar%2F%27bar%27";
259 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
260 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
261 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
262 QName.create("serializer:test", "2016-06-06", "list-one-key"), value)
265 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
266 assertEquals("Serialization not successful", "serializer-test:list-one-key=" + encoded, result);
270 * Test if URIs with no percent encoded characters are correctly serialized. Input should be untouched.
273 public void serializeNoPercentEncodingTest() {
274 final String value = "foo\"b\"bar";
276 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
277 .node(QName.create("serializer:test", "2016-06-06", "list-one-key"))
278 .nodeWithKey(QName.create("serializer:test", "2016-06-06", "list-one-key"),
279 QName.create("serializer:test", "2016-06-06", "list-one-key"), value)
282 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
283 assertEquals("Serialization not successful", "serializer-test:list-one-key=" + value, result);
287 * Test of serialization when nodes in input <code>YangInstanceIdentifier</code> are defined in two different
288 * modules by using augmentation.
291 public void serializeIncludedNodesTest() {
292 final QName list = QName.create("serializer:test:included", "2016-06-06", "augmented-list");
293 final QName child = QName.create("serializer:test", "2016-06-06", "augmented-leaf");
295 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
297 .node(new YangInstanceIdentifier.NodeIdentifierWithPredicates(
298 list, QName.create(list, "list-key"), 100))
299 .node(new YangInstanceIdentifier.AugmentationIdentifier(Sets.newHashSet(child)))
303 final String result = YangInstanceIdentifierSerializer.create(schemaContext, data);
305 assertEquals("Serialization not successful",
306 "serializer-test-included:augmented-list=100/serializer-test:augmented-leaf", result);
310 * Test of serialization when nodes in input <code>YangInstanceIdentifier</code> are defined in two different
311 * modules by using augmentation. Augmented node in data supplied for serialization has wrong namespace.
312 * <code>IllegalArgumentException</code> is expected because augmented node is defined in other module than its
313 * parent and will not be found.
316 public void serializeIncludedNodesSerializationTest() {
317 final QName list = QName.create("serializer:test:included", "2016-06-06", "augmented-list");
318 // child should has different namespace
319 final QName child = QName.create("serializer:test:included", "2016-06-06", "augmented-leaf");
321 final YangInstanceIdentifier data = YangInstanceIdentifier.builder()
323 .node(new YangInstanceIdentifier.NodeIdentifierWithPredicates(
324 list, QName.create(list, "list-key"), 100))
325 .node(new YangInstanceIdentifier.AugmentationIdentifier(Sets.newHashSet(child)))
329 thrown.expect(IllegalArgumentException.class);
330 YangInstanceIdentifierSerializer.create(schemaContext, data);