2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
22 * ============LICENSE_START=======================================================
24 * ================================================================================
25 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
26 * ================================================================================
27 * Licensed under the Apache License, Version 2.0 (the "License");
28 * you may not use this file except in compliance with the License.
29 * You may obtain a copy of the License at
31 * http://www.apache.org/licenses/LICENSE-2.0
33 * Unless required by applicable law or agreed to in writing, software
34 * distributed under the License is distributed on an "AS IS" BASIS,
35 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
36 * See the License for the specific language governing permissions and
37 * limitations under the License.
38 * ============LICENSE_END=========================================================
41 package org.openecomp.mso.bpmn.core;
43 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
46 import java.io.IOException;
47 import java.nio.charset.StandardCharsets;
48 import java.nio.file.Files;
49 import org.junit.BeforeClass;
50 import org.junit.Test;
51 import org.openecomp.mso.bpmn.core.json.JsonUtils;
52 import org.openecomp.mso.bpmn.core.xml.XmlTool;
53 import org.xmlunit.builder.DiffBuilder;
54 import org.xmlunit.diff.DefaultNodeMatcher;
55 import org.xmlunit.diff.Diff;
56 import org.xmlunit.diff.ElementSelectors;
61 public class JsonUtilsTest {
63 private static final String EOL = "\n";
64 private static final String XML_REQ =
65 "<vnf-request xmlns=\"http://org.openecomp/mso/infra/vnf-request/v1\">" + EOL +
66 " <request-info>" + EOL +
67 " <request-id>DEV-VF-0021</request-id>" + EOL +
68 " <action>CREATE_VF_MODULE</action>" + EOL +
69 " <source>PORTAL</source>" + EOL +
70 " </request-info>" + EOL +
71 " <vnf-inputs>" + EOL +
72 " <vnf-id>a27ce5a9-29c4-4c22-a017-6615ac73c721</vnf-id>" + EOL +
73 " <vnf-name>STMTN5MMSC21</vnf-name>" + EOL +
74 " <vnf-type>asc_heat-int</vnf-type>" + EOL +
75 " <vf-module-name>STMTN5MMSC21-MMSC::module-0-0</vf-module-name>" + EOL +
76 " <vf-module-model-name>STMTN5MMSC21-MMSC::model-1-0</vf-module-model-name>" + EOL +
77 " <is-base-module>true</is-base-module>" + EOL +
78 " <persona-model-id>00000000-0000-0000-0000-000000000000</persona-model-id>" + EOL +
79 " <persona-model-version>1.0</persona-model-version>" + EOL +
80 " <vnf-persona-model-id>999999999-0000-0000-0000-000000000000</vnf-persona-model-id>" + EOL +
81 " <vnf-persona-model-version>1.5</vnf-persona-model-version>" + EOL +
82 " <service-id>00000000-0000-0000-0000-000000000000</service-id>" + EOL +
83 " <service-type>SDN-ETHERNET-INTERNET</service-type>" + EOL +
84 " <tenant-id>fba1bd1e195a404cacb9ce17a9b2b421</tenant-id>" + EOL +
85 " <orchestration-status>pending-delete</orchestration-status>" + EOL +
86 " <aic-cloud-region>RDM2WAGPLCP</aic-cloud-region>" + EOL +
87 " <asdc-service-model-version>1</asdc-service-model-version>" + EOL +
88 " </vnf-inputs>" + EOL +
89 " <vnf-params xmlns:tns=\"http://org.openecomp/mso/infra/vnf-request/v1\">" + EOL +
90 " <param name=\"network\">network1111</param>" + EOL +
91 " <param name=\"server\">server1111</param>" + EOL +
92 " </vnf-params> " + EOL +
93 "</vnf-request>" + EOL;
95 private static final String XML_REQ_NO_ATTRS =
96 "<vnf-request xmlns=\"http://org.openecomp/mso/infra/vnf-request/v1\">" + EOL +
97 " <request-info>" + EOL +
98 " <action>DELETE_VF_MODULE</action>" + EOL +
99 " <source>PORTAL</source>" + EOL +
100 " </request-info>" + EOL +
101 " <vnf-inputs>" + EOL +
102 " <vnf-id>a27ce5a9-29c4-4c22-a017-6615ac73c721</vnf-id>" + EOL +
103 " <vnf-name>STMTN5MMSC21</vnf-name>" + EOL +
104 " <vnf-type>asc_heat-int</vnf-type>" + EOL +
105 " <vf-module-id>973ed047-d251-4fb9-bf1a-65b8949e0a73</vf-module-id>" + EOL +
106 " <vf-module-name>STMTN5MMSC21-MMSC::module-0-0</vf-module-name>" + EOL +
107 " <service-id>00000000-0000-0000-0000-000000000000</service-id>" + EOL +
108 " <service-type>SDN-ETHERNET-INTERNET</service-type>" + EOL +
109 " <tenant-id>fba1bd1e195a404cacb9ce17a9b2b421</tenant-id>" + EOL +
110 " <orchestration-status>pending-delete</orchestration-status>" + EOL +
111 " <aic-cloud-region>RDM2WAGPLCP</aic-cloud-region>" + EOL +
112 " </vnf-inputs>" + EOL +
113 " <vnf-params xmlns:tns=\"http://org.openecomp/mso/infra/vnf-request/v1\"/>" + EOL +
114 "</vnf-request>" + EOL;
116 private static final String XML_ARRAY_REQ =
118 " <outOfBandManagementModem>BROADBAND</outOfBandManagementModem>" + EOL +
119 " <internetTopology>IVLAN</internetTopology>" + EOL +
120 " <ucpeAliasHostName>SHELLUCPE31</ucpeAliasHostName>" + EOL +
123 " <wanType>AVPN</wanType>" + EOL +
124 " <interfaceType>1000BASE-T</interfaceType>" + EOL +
125 " <transportProviderName>ATT</transportProviderName>" + EOL +
126 " <circuitId>BT/SLIR/70911</circuitId>" + EOL +
127 " <dualMode>Active</dualMode>" + EOL +
128 " <wanPortNumber>WAN1</wanPortNumber>" + EOL +
129 " <transportManagementOption>ATT</transportManagementOption>" + EOL +
130 " <transportVendorTotalBandwidth>100</transportVendorTotalBandwidth>" + EOL +
131 " <mediaType>ELECTRICAL</mediaType>" + EOL +
132 " </wanInfo>" + EOL +
134 " <wanType>AVPN</wanType>" + EOL +
135 " <interfaceType>10/100/1000BASE-T</interfaceType>" + EOL +
136 " <transportProviderName>ATT</transportProviderName>" + EOL +
137 " <circuitId>AS/KRFN/34611</circuitId>" + EOL +
138 " <dualMode>Active</dualMode>" + EOL +
139 " <wanPortNumber>WAN2</wanPortNumber>" + EOL +
140 " <transportManagementOption>ATT</transportManagementOption>" + EOL +
141 " <transportVendorTotalBandwidth>10000</transportVendorTotalBandwidth>" + EOL +
142 " <mediaType>MMF</mediaType>" + EOL +
143 " </wanInfo>" + EOL +
144 " </wanList>" + EOL +
145 " <ucpeActivationCode>ASD-987-M31</ucpeActivationCode>" + EOL +
146 " <ucpeHostName>USOSTCDALTX0101UJZZ31</ucpeHostName>" + EOL +
147 " <ucpePartNumber>FG-VM00*</ucpePartNumber>" + EOL +
150 // JSON request w/ embedded XML will be read from a file
151 private static String jsonReq;
152 private static String jsonReqArray;
155 public static void initialize() throws Exception {
156 jsonReq = readFileToString("src/test/resources/request.json");
157 jsonReqArray = readFileToString("src/test/resources/requestArray.json");
160 private static String readFileToString(String path) throws IOException {
161 File file = new File(path);
162 return new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
166 public void shouldConvertXmlToJsonAndBackToSameXml() throws Exception {
167 // Note: the current version of the JsonUtils.json2xml() method
168 // does not support converting the JSONObject representation
169 // of XML attributes (JSONArray) back to XML. So this test will
170 // only succeed if the original XML does not contain attributes
173 String xmlIn = XmlTool.removeNamespaces(XML_REQ_NO_ATTRS);
175 String json = JsonUtils.xml2json(XML_REQ_NO_ATTRS);
176 String xmlOut = JsonUtils.json2xml(json);
178 Diff diffXml = DiffBuilder.compare(xmlIn).withTest(xmlOut).ignoreWhitespace()
179 .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)).checkForSimilar().build();
181 assertThat(diffXml.hasDifferences()).withFailMessage(diffXml.toString()).isFalse();
185 public void shouldReadValuesForAbsoluteJsonPaths() throws Exception {
187 String json = JsonUtils.xml2json(XML_REQ);
189 assertThat(JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.vnf-name")).isEqualTo("STMTN5MMSC21");
190 assertThat(JsonUtils.getJsonValue(json, "vnf-request.request-info.action")).isEqualTo("CREATE_VF_MODULE");
191 assertThat(JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.persona-model-version")).isEqualTo("1");
192 assertThat(JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.vnf-persona-model-version")).isEqualTo("1.5");
193 assertThat(JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.is-base-module")).isEqualTo("true");
197 public void shouldReturnValueForJsonKey() throws Exception {
199 String json = JsonUtils.xml2json(XML_REQ);
201 assertThat(JsonUtils.getJsonValueForKey(json, "source")).isEqualTo("PORTAL");
205 public void shouldReturnNullForNonexistentJsonNode() throws Exception {
207 String json = JsonUtils.xml2json(XML_REQ);
209 assertThat(JsonUtils.getJsonValueForKey(json, "nonexistent-node")).isNull();
213 public void shouldReturnNullForNonExistentParameter() throws Exception {
215 String json = JsonUtils.xml2json(XML_REQ);
217 assertThat(JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.bad")).isNull();
221 public void shouldGetJasonParametersFromArray() throws Exception {
223 String json = JsonUtils.xml2json(XML_REQ);
225 assertThat(JsonUtils.getJsonParamValue(json, "vnf-request.vnf-params.param", "name")).isEqualTo("network");
226 assertThat(JsonUtils.getJsonParamValue(json, "vnf-request.vnf-params.param", "content"))
227 .isEqualTo("network1111");
228 assertThat(JsonUtils.getJsonParamValue(json, "vnf-request.vnf-params.param", "name", 1)).isEqualTo("server");
229 assertThat(JsonUtils.getJsonParamValue(json, "vnf-request.vnf-params.param", "content", 1))
230 .isEqualTo("server1111");
231 assertThat(JsonUtils.getJsonParamValue(json, "vnf-request.vnf-params.param", "badParam"))
232 .withFailMessage("Expected null for nonexistent param").isNull();
233 assertThat(JsonUtils.getJsonParamValue(json, "vnf-request.vnf-params.param", "name", 2))
234 .withFailMessage("Expected null for index out of bound").isNull();
238 public void shouldAddJsonValue() throws Exception {
240 String json = JsonUtils.xml2json(XML_REQ);
241 String key = "vnf-request.request-info.comment";
242 String value = "Some comment";
244 String jsonUpd = JsonUtils.addJsonValue(json, key, value);
246 String extractedValue = JsonUtils.getJsonValue(jsonUpd, key);
247 assertThat(extractedValue).isEqualTo(value);
251 public void shouldIgnoreAddIfFieldAlreadyExists() throws Exception {
253 String json = JsonUtils.xml2json(XML_REQ);
254 String key = "vnf-request.vnf-inputs.vnf-name";
255 String newValue = "STMTN5MMSC22";
256 String oldValue = JsonUtils.getJsonValue(json, key);
258 String jsonUpd = JsonUtils.addJsonValue(json, key, newValue);
260 String extractedValue = JsonUtils.getJsonValue(jsonUpd, key);
261 assertThat(extractedValue).isEqualTo(oldValue).isNotEqualTo(newValue);
265 public void shouldUpdateValueInJson() throws Exception {
267 String json = JsonUtils.xml2json(XML_REQ);
268 String key = "vnf-request.vnf-inputs.vnf-name";
269 String newValue = "STMTN5MMSC22";
270 String oldValue = JsonUtils.getJsonValue(json, key);
272 String jsonUpd = JsonUtils.updJsonValue(json, key, newValue);
274 String extractedValue = JsonUtils.getJsonValue(jsonUpd, key);
275 assertThat(extractedValue).isNotEqualTo(oldValue).isEqualTo(newValue);
279 public void shouldDeleteValue() throws Exception {
281 String json = JsonUtils.xml2json(XML_REQ);
282 String key = "vnf-request.vnf-inputs.vnf-name";
283 String oldValue = JsonUtils.getJsonValue(json, key);
285 String jsonUpd = JsonUtils.delJsonValue(json, key);
287 String extractedValue = JsonUtils.getJsonValue(jsonUpd, key);
288 assertThat(extractedValue).isNotEqualTo(oldValue).isNull();
292 public void shouldReturnOriginalJsonWhenTryingToRemoveNonexistentField() throws Exception {
294 String json = JsonUtils.xml2json(XML_REQ);
295 String key = "vnf-request.vnf-inputs.does-not-exist";
297 String jsonUpd = JsonUtils.delJsonValue(json, key);
299 assertThat(jsonUpd).isEqualTo(json);
303 public void shouldConvertXmlToJsonAndBackToSameXmlExtractedFromTheRequest() throws Exception {
305 String value = JsonUtils.getJsonValue(jsonReq, "variables.bpmnRequest.value");
306 String xmlReq = XmlTool.removeNamespaces(XmlTool.normalize(value));
308 String json = JsonUtils.xml2json(xmlReq);
309 String xmlOut = JsonUtils.json2xml(json);
311 Diff diffXml = DiffBuilder.compare(xmlReq).withTest(xmlOut).ignoreWhitespace()
312 .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)).checkForSimilar().build();
313 assertThat(diffXml.hasDifferences()).withFailMessage(diffXml.toString()).isFalse();
317 public void shouldConvertJsonContainingArrayToXml() throws Exception {
319 String jsonParm = JsonUtils.getJsonNodeValue(jsonReqArray, "requestDetails.requestParameters.ucpeInfo");
320 String xmlOut = JsonUtils.json2xml(jsonParm);
322 Diff diffXml = DiffBuilder.compare(XML_ARRAY_REQ).withTest(xmlOut).ignoreWhitespace()
323 .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)).checkForSimilar().build();
324 assertThat(diffXml.hasDifferences()).withFailMessage(diffXml.toString()).isFalse();