1 package org.opendaylight.controller.sal.restconf.impl.cnsn.to.json.test;
3 import static org.junit.Assert.*;
5 import java.io.IOException;
6 import java.io.StringReader;
7 import java.math.BigDecimal;
9 import java.net.URISyntaxException;
12 import javax.ws.rs.WebApplicationException;
13 import javax.xml.bind.DatatypeConverter;
15 import org.junit.BeforeClass;
16 import org.junit.Test;
17 import org.opendaylight.controller.sal.rest.impl.StructuredDataToJsonProvider;
18 import org.opendaylight.controller.sal.restconf.impl.test.TestUtils;
19 import org.opendaylight.controller.sal.restconf.impl.test.YangAndXmlAndDataSchemaLoader;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.data.api.*;
22 import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
24 import com.google.gson.stream.JsonReader;
25 import com.google.gson.stream.JsonToken;
27 public class CnSnToJsonBasicDataTypesTest extends YangAndXmlAndDataSchemaLoader {
30 public static void initialize() {
31 dataLoad("/cnsn-to-json/simple-data-types");
35 public void simpleYangDataTest() {
37 CompositeNode compositeNode = TestUtils.loadCompositeNode("/cnsn-to-json/simple-data-types/xml/data.xml");
39 String jsonOutput = null;
41 TestUtils.normalizeCompositeNode(compositeNode, modules, "simple-data-types:cont");
44 jsonOutput = TestUtils.writeCompNodeWithSchemaContextToOutput(compositeNode, modules, dataSchemaNode,
45 StructuredDataToJsonProvider.INSTANCE);
46 } catch (WebApplicationException | IOException e) {
48 assertNotNull(jsonOutput);
50 verifyJsonOutput(jsonOutput);
53 private CompositeNode prepareData() {
54 MutableCompositeNode cont = NodeFactory.createMutableCompositeNode(TestUtils.buildQName("cont"), null, null,
55 ModifyAction.CREATE, null);
57 List<Node<?>> childNodes = new ArrayList<>();
58 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnint8Min"), cont, (byte) -128,
59 ModifyAction.CREATE, null));
60 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnint8Max"), cont, (byte) 127,
61 ModifyAction.CREATE, null));
62 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnint16Min"), cont, (short) -32768,
63 ModifyAction.CREATE, null));
64 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnint16Max"), cont, (short) 32767,
65 ModifyAction.CREATE, null));
66 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnint32Min"), cont,
67 (int) -2147483648, ModifyAction.CREATE, null));
68 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnint32Max"), cont, (int) 2147483647,
69 ModifyAction.CREATE, null));
70 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnint64Min"), cont, new Long(
71 "-9223372036854775807"), ModifyAction.CREATE, null));
72 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnint64Max"), cont, new Long(
73 "9223372036854775807"), ModifyAction.CREATE, null));
74 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnuint8Max"), cont, (short) 255,
75 ModifyAction.CREATE, null));
76 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnuint16Max"), cont, (int) 65535,
77 ModifyAction.CREATE, null));
78 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfnuint32Max"), cont, new Long(
79 "4294967295"), ModifyAction.CREATE, null));
80 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfstr"), cont, "lfstr",
81 ModifyAction.CREATE, null));
82 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfstr1"), cont, "",
83 ModifyAction.CREATE, null));
84 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfbool1"), cont, Boolean.TRUE,
85 ModifyAction.CREATE, null));
86 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfbool2"), cont, Boolean.FALSE,
87 ModifyAction.CREATE, null));
88 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfdecimal1"), cont, new BigDecimal(
89 "43.32"), ModifyAction.CREATE, null));
90 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfdecimal2"), cont, new BigDecimal(
91 "-0.43"), ModifyAction.CREATE, null));
92 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfdecimal3"), cont, new BigDecimal(
93 "43"), ModifyAction.CREATE, null));
94 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfdecimal4"), cont, new BigDecimal(
95 "43E3"), ModifyAction.CREATE, null));
96 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfdecimal6"), cont, new BigDecimal(
97 "33.12345"), ModifyAction.CREATE, null));
98 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfenum"), cont, "enum3",
99 ModifyAction.CREATE, null));
101 HashSet<String> bits = new HashSet<String>();
103 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfbits"), cont, bits,
104 ModifyAction.CREATE, null));
106 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfbinary"), cont, DatatypeConverter
107 .parseBase64Binary("AAaacdabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"),
108 ModifyAction.CREATE, null));
109 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfempty"), cont, null,
110 ModifyAction.CREATE, null));
111 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion1"), cont, (int) 324,
112 ModifyAction.CREATE, null));
113 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion2"), cont, new BigDecimal(
114 "33.3"), ModifyAction.CREATE, null));
115 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion3"), cont, "55",
116 ModifyAction.CREATE, null));
117 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion4"), cont, Boolean.TRUE,
118 ModifyAction.CREATE, null));
119 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion5"), cont, "true",
120 ModifyAction.CREATE, null));
121 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion6"), cont, "false",
122 ModifyAction.CREATE, null));
123 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion7"), cont, null,
124 ModifyAction.CREATE, null));
125 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion8"), cont, "",
126 ModifyAction.CREATE, null));
127 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion9"), cont, "",
128 ModifyAction.CREATE, null));
130 HashSet<String> bits2 = new HashSet<String>();
132 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion10"), cont, bits2,
133 ModifyAction.CREATE, null));
135 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion11"), cont, (short) 33,
136 ModifyAction.CREATE, null));
137 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfunion12"), cont, Boolean.FALSE,
138 ModifyAction.CREATE, null));
140 childNodes.add(NodeFactory.createMutableSimpleNode(TestUtils.buildQName("identityref1"), cont, new QName(
141 new URI("simple:data:types"), "iden"), ModifyAction.CREATE, null));
142 } catch (URISyntaxException e) {
145 cont.getChildren().addAll(childNodes);
152 private void verifyJsonOutput(String jsonOutput) {
153 StringReader strReader = new StringReader(jsonOutput);
154 JsonReader jReader = new JsonReader(strReader);
156 String exception = null;
158 jsonReadCont(jReader);
159 } catch (IOException e) {
160 exception = e.getMessage();
163 assertNull("Error during reading Json output: " + exception, exception);
166 private void jsonReadCont(JsonReader jReader) throws IOException {
167 jReader.beginObject();
168 assertNotNull("cont1 is missing.", jReader.hasNext());
170 // Cont dataFromJson = new Cont(jReader.nextName());
172 jsonReadContElements(jReader);
174 assertFalse("cont shouldn't have other element.", jReader.hasNext());
176 // return dataFromJson;
179 private void jsonReadContElements(JsonReader jReader) throws IOException {
180 jReader.beginObject();
181 List<String> loadedLfs = new ArrayList<>();
182 boolean exceptForDecimal5Raised = false;
183 boolean enumChecked = false;
184 boolean bitsChecked = false;
185 boolean lfdecimal6Checked = false;
186 boolean lfdecimal4Checked = false;
187 boolean lfdecimal3Checked = false;
188 boolean lfdecimal2Checked = false;
189 boolean lfdecimal1Checked = false;
190 boolean lfbool1Checked = false;
191 boolean lfbool2Checked = false;
192 boolean lfstrChecked = false;
193 boolean lfbinaryChecked = false;
194 // boolean lfref1Checked = false;
195 boolean lfemptyChecked = false;
196 boolean lfstr1Checked = false;
197 boolean lfidentityrefChecked = false;
199 while (jReader.hasNext()) {
200 String keyName = jReader.nextName();
201 JsonToken peek = null;
203 peek = jReader.peek();
204 } catch (IOException e) {
205 if (keyName.equals("lfdecimal5")) {
206 exceptForDecimal5Raised = true;
208 assertTrue("Key " + keyName + " has incorrect value for specifed type", false);
212 if (keyName.startsWith("lfnint") || keyName.startsWith("lfnuint")) {
213 assertEquals("Key " + keyName + " has incorrect type", JsonToken.NUMBER, peek);
216 } catch (NumberFormatException e) {
217 assertTrue("Key " + keyName + " has incorrect value - " + e.getMessage(), false);
219 loadedLfs.add(keyName.substring(3));
220 } else if (keyName.equals("identityref1")) {
221 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
222 assertEquals("simple-data-types:iden", jReader.nextString());
223 lfidentityrefChecked = true;
224 } else if (keyName.equals("lfstr")) {
225 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
226 assertEquals("lfstr", jReader.nextString());
228 } else if (keyName.equals("lfstr1")) {
229 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
230 assertEquals("", jReader.nextString());
231 lfstr1Checked = true;
232 } else if (keyName.equals("lfbool1")) {
233 assertEquals("Key " + keyName + " has incorrect type", JsonToken.BOOLEAN, peek);
234 assertEquals(true, jReader.nextBoolean());
235 lfbool1Checked = true;
236 } else if (keyName.equals("lfbool2")) {
237 assertEquals("Key " + keyName + " has incorrect type", JsonToken.BOOLEAN, peek);
238 assertEquals(false, jReader.nextBoolean());
239 lfbool2Checked = true;
240 } else if (keyName.equals("lfbool3")) {
241 assertEquals("Key " + keyName + " has incorrect type", JsonToken.BOOLEAN, peek);
242 assertEquals(false, jReader.nextBoolean());
243 } else if (keyName.equals("lfdecimal1")) {
244 assertEquals("Key " + keyName + " has incorrect type", JsonToken.NUMBER, peek);
245 assertEquals(new Double(43.32), (Double) jReader.nextDouble());
246 lfdecimal1Checked = true;
247 } else if (keyName.equals("lfdecimal2")) {
248 assertEquals("Key " + keyName + " has incorrect type", JsonToken.NUMBER, peek);
249 assertEquals(new Double(-0.43), (Double) jReader.nextDouble());
250 lfdecimal2Checked = true;
251 } else if (keyName.equals("lfdecimal3")) {
252 assertEquals("Key " + keyName + " has incorrect type", JsonToken.NUMBER, peek);
253 assertEquals(new Double(43), (Double) jReader.nextDouble());
254 lfdecimal3Checked = true;
255 } else if (keyName.equals("lfdecimal4")) {
256 assertEquals("Key " + keyName + " has incorrect type", JsonToken.NUMBER, peek);
257 assertEquals(new Double(43E3), (Double) jReader.nextDouble());
258 lfdecimal4Checked = true;
259 } else if (keyName.equals("lfdecimal6")) {
260 assertEquals("Key " + keyName + " has incorrect type", JsonToken.NUMBER, peek);
261 assertEquals(new Double(33.12345), (Double) jReader.nextDouble());
262 lfdecimal6Checked = true;
263 } else if (keyName.equals("lfenum")) {
264 assertEquals("enum3", jReader.nextString());
266 } else if (keyName.equals("lfbits")) {
267 assertEquals("bit3 bit2", jReader.nextString());
269 } else if (keyName.equals("lfbinary")) {
270 assertEquals("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", jReader.nextString());
271 lfbinaryChecked = true;
272 } else if (keyName.equals("lfempty")) {
273 jReader.beginArray();
276 lfemptyChecked = true;
277 } else if (keyName.startsWith("lfunion")) {
278 checkLfUnion(jReader, keyName, peek);
280 assertTrue("Key " + keyName + " doesn't exists in yang file.", false);
284 Collections.sort(loadedLfs);
285 String expectedLfsStr = "[int16Max, int16Min, int32Max, int32Min, int64Max, int64Min, int8Max, int8Min, uint16Max, uint32Max, uint8Max]";
286 String actualLfsStr = loadedLfs.toString();
287 assertEquals("Some leaves are missing", expectedLfsStr, actualLfsStr);
288 assertTrue("Enum wasn't checked", enumChecked);
289 assertTrue("Bits wasn't checked", bitsChecked);
290 assertTrue("Decimal1 wasn't checked", lfdecimal1Checked);
291 assertTrue("Decimal2 wasn't checked", lfdecimal2Checked);
292 assertTrue("Decimal3 wasn't checked", lfdecimal3Checked);
293 assertTrue("Decimal4 wasn't checked", lfdecimal4Checked);
294 assertTrue("Decimal5 wasn't checked", lfdecimal6Checked);
295 assertTrue("lfbool1 wasn't checked", lfbool1Checked);
296 assertTrue("lfbool2 wasn't checked", lfbool2Checked);
297 assertTrue("lfstr wasn't checked", lfstrChecked);
298 assertTrue("lfstr1 wasn't checked", lfstr1Checked);
299 assertTrue("lfbinary wasn't checked", lfbinaryChecked);
300 assertTrue("lfempty wasn't checked", lfemptyChecked);
301 assertTrue("lfidentityref wasn't checked", lfidentityrefChecked);
305 private void checkLfUnion(JsonReader jReader, String keyName, JsonToken peek) throws IOException {
306 if (keyName.equals("lfunion1")) {
307 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
308 assertEquals("324", jReader.nextString());
309 } else if (keyName.equals("lfunion2")) {
310 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
311 assertEquals("33.3", jReader.nextString());
312 } else if (keyName.equals("lfunion3")) {
313 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
314 assertEquals("55", jReader.nextString());
315 } else if (keyName.equals("lfunion4")) {
316 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
317 assertEquals("true", jReader.nextString());
318 } else if (keyName.equals("lfunion5")) {
319 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
320 assertEquals("true", jReader.nextString());
321 } else if (keyName.equals("lfunion6")) {
322 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
323 assertEquals("false", jReader.nextString());
324 } else if (keyName.equals("lfunion7")) {
325 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
326 assertEquals("", jReader.nextString());
327 } else if (keyName.equals("lfunion8")) {
328 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
329 assertEquals("", jReader.nextString());
330 } else if (keyName.equals("lfunion9")) {
331 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
332 assertEquals("", jReader.nextString());
333 } else if (keyName.equals("lfunion10")) {
334 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
335 assertEquals("bt1", jReader.nextString());
336 } else if (keyName.equals("lfunion11")) {
337 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
338 assertEquals("33", jReader.nextString());
339 } else if (keyName.equals("lfunion12")) {
340 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
341 assertEquals("false", jReader.nextString());
342 } else if (keyName.equals("lfunion13")) {
343 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
344 assertEquals("44", jReader.nextString());
345 } else if (keyName.equals("lfunion14")) {
346 assertEquals("Key " + keyName + " has incorrect type", JsonToken.STRING, peek);
347 assertEquals("21", jReader.nextString());