YANGTOOLS-766: expand test suite
[yangtools.git] / yang / yang-data-codec-gson / src / test / java / org / opendaylight / yangtools / yang / data / codec / gson / Bug8083Test.java
1 /*
2  * Copyright (c) 2017 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
9 package org.opendaylight.yangtools.yang.data.codec.gson;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.mock;
17 import static org.mockito.Mockito.verify;
18 import static org.opendaylight.yangtools.yang.data.codec.gson.TestUtils.loadTextFile;
19
20 import com.google.common.collect.ImmutableMap;
21 import com.google.common.collect.ImmutableSet;
22 import com.google.gson.stream.JsonReader;
23 import com.google.gson.stream.JsonWriter;
24 import java.io.IOException;
25 import java.io.StringReader;
26 import java.net.URI;
27 import java.net.URISyntaxException;
28 import org.junit.BeforeClass;
29 import org.junit.Test;
30 import org.mockito.ArgumentCaptor;
31 import org.opendaylight.yangtools.yang.common.QName;
32 import org.opendaylight.yangtools.yang.common.QNameModule;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
36 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
37 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
38 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
39 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
40 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
41 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
42 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
43 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
44 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
45 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
46 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
47 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
48 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
49 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
50
51 public class Bug8083Test {
52     private static final QNameModule FOOMOD = QNameModule.create(URI.create("http://example.com/foomod"));
53     private static final QNameModule BARMOD = QNameModule.create(URI.create("http://example.com/barmod"));
54
55     private static final QName FOO_QNAME = QName.create(FOOMOD, "foo");
56     private static final QName FOOLIST_QNAME = QName.create(FOOMOD, "foo-list");
57     private static final QName NAME_QNAME = QName.create(FOOMOD, "name");
58     private static final QName TOP_QNAME = QName.create(FOOMOD, "top");
59     private static final QName BARCONTAINER_QNAME = QName.create(BARMOD, "bar-container");
60
61     private static final YangInstanceIdentifier TEST_IID = YangInstanceIdentifier.builder()
62             .node(TOP_QNAME)
63             .node(FOOLIST_QNAME)
64             .node(new NodeIdentifierWithPredicates(FOOLIST_QNAME, ImmutableMap.of(NAME_QNAME, "key-value")))
65             .node(new AugmentationIdentifier(ImmutableSet.of(BARCONTAINER_QNAME)))
66             .node(BARCONTAINER_QNAME)
67             .node(QName.create(BARMOD, "bar-leaf"))
68             .build();
69
70     private static SchemaContext FULL_SCHEMA_CONTEXT;
71
72     @BeforeClass
73     public static void init() {
74         FULL_SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/bug8083/yang/");
75     }
76
77     @Test
78     public void testInstanceIdentifierSerializeNew() throws IOException {
79         assertEquals("/example-foomod:top/foo-list[name='key-value']/example-barmod:bar-container/bar-leaf",
80             writeInstanceIdentifier(JSONCodecFactorySupplier.RFC7951));
81     }
82
83     @Test
84     public void testInstanceIdentifierSerializeOld() throws IOException {
85         assertEquals("/example-foomod:top/example-foomod:foo-list[example-foomod:name='key-value']"
86                 + "/example-barmod:bar-container/example-barmod:bar-leaf",
87             writeInstanceIdentifier(JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02));
88     }
89
90     @Test
91     public void testRFC7951InstanceIdentifierPath() throws IOException, URISyntaxException {
92         final String inputJson = loadTextFile("/bug8083/json/foo.json");
93
94         // deserialization
95         final NormalizedNodeResult result = new NormalizedNodeResult();
96         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
97         final JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
98             JSONCodecFactorySupplier.RFC7951.getShared(FULL_SCHEMA_CONTEXT));
99         jsonParser.parse(new JsonReader(new StringReader(inputJson)));
100         final NormalizedNode<?, ?> transformedInput = result.getResult();
101
102         assertTrue(transformedInput instanceof ContainerNode);
103         final ContainerNode container = (ContainerNode) transformedInput;
104         final NormalizedNode<?, ?> child = container.getChild(new NodeIdentifier(FOO_QNAME)).get();
105         assertTrue(child instanceof LeafNode);
106         assertEquals(TEST_IID, child.getValue());
107     }
108
109     @Test
110     public void testInstanceIdentifierPathWithEmptyListKey() throws IOException, URISyntaxException {
111         final SchemaContext schemaContext = YangParserTestUtils.parseYangResource("/bug8083/yang/baz.yang");
112         final String inputJson = loadTextFile("/bug8083/json/baz.json");
113
114         // deserialization
115         final NormalizedNodeResult result = new NormalizedNodeResult();
116         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
117         final JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
118             JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext));
119         jsonParser.parse(new JsonReader(new StringReader(inputJson)));
120         final NormalizedNode<?, ?> transformedInput = result.getResult();
121         assertNotNull(transformedInput);
122     }
123
124     @Test
125     public void testInstanceIdentifierPathWithIdentityrefListKey() throws IOException, URISyntaxException {
126         final SchemaContext schemaContext = YangParserTestUtils.parseYangResource("/bug8083/yang/zab.yang");
127         final String inputJson = loadTextFile("/bug8083/json/zab.json");
128
129         // deserialization
130         final NormalizedNodeResult result = new NormalizedNodeResult();
131         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
132         final JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
133             JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext));
134         jsonParser.parse(new JsonReader(new StringReader(inputJson)));
135         final NormalizedNode<?, ?> transformedInput = result.getResult();
136         assertNotNull(transformedInput);
137     }
138
139     @Test
140     public void testInstanceIdentifierPathWithInstanceIdentifierListKey() throws IOException, URISyntaxException {
141         final SchemaContext schemaContext = YangParserTestUtils.parseYangResource("/bug8083/yang/foobar.yang");
142         final String inputJson = loadTextFile("/bug8083/json/foobar.json");
143
144         // deserialization
145         final NormalizedNodeResult result = new NormalizedNodeResult();
146         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
147         final JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
148             JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext));
149         jsonParser.parse(new JsonReader(new StringReader(inputJson)));
150         final NormalizedNode<?, ?> transformedInput = result.getResult();
151         assertNotNull(transformedInput);
152     }
153
154     private static JSONCodec<YangInstanceIdentifier> getCodec(final JSONCodecFactorySupplier supplier) {
155         final DataSchemaNode top = FULL_SCHEMA_CONTEXT.findDataChildByName(TOP_QNAME).get();
156         assertTrue(top instanceof ContainerSchemaNode);
157         final DataSchemaNode foo = ((ContainerSchemaNode) top).findDataChildByName(FOO_QNAME).get();
158         assertTrue(foo instanceof LeafSchemaNode);
159         final TypeDefinition<? extends TypeDefinition<?>> type = ((LeafSchemaNode) foo).getType();
160         assertTrue(type instanceof InstanceIdentifierTypeDefinition);
161         return (JSONCodec<YangInstanceIdentifier>) supplier.createSimple(FULL_SCHEMA_CONTEXT)
162                 .instanceIdentifierCodec((InstanceIdentifierTypeDefinition) type);
163     }
164
165     private static String writeInstanceIdentifier(final JSONCodecFactorySupplier supplier) throws IOException {
166         final JsonWriter writer = mock(JsonWriter.class);
167         ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
168         doReturn(writer).when(writer).value(captor.capture());
169
170         getCodec(supplier).writeValue(writer, TEST_IID);
171         verify(writer).value(any(String.class));
172         return captor.getValue();
173     }
174 }