/*-
* ============LICENSE_START=======================================================
* OPENECOMP - MSO
* ================================================================================
* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END=========================================================
*/
package org.openecomp.mso.bpmn.core;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.xml.sax.SAXException;
import org.custommonkey.xmlunit.Diff;
import org.openecomp.mso.bpmn.core.json.JsonUtils;
import org.openecomp.mso.bpmn.core.xml.XmlTool;
/**
* @version 1.0
*/
public class JsonUtilsTest {
private static final String EOL = "\n";
private String xmlReq =
"" + EOL +
" " + EOL +
" DEV-VF-0021" + EOL +
" CREATE_VF_MODULE" + EOL +
" PORTAL" + EOL +
" " + EOL +
" " + EOL +
" a27ce5a9-29c4-4c22-a017-6615ac73c721" + EOL +
" STMTN5MMSC21" + EOL +
" asc_heat-int" + EOL +
" STMTN5MMSC21-MMSC::module-0-0" + EOL +
" STMTN5MMSC21-MMSC::model-1-0" + EOL +
" true" + EOL +
" 00000000-0000-0000-0000-000000000000" + EOL +
" 1.0" + EOL +
" 999999999-0000-0000-0000-000000000000" + EOL +
" 1.5" + EOL +
" 00000000-0000-0000-0000-000000000000" + EOL +
" SDN-ETHERNET-INTERNET" + EOL +
" fba1bd1e195a404cacb9ce17a9b2b421" + EOL +
" pending-delete" + EOL +
" RDM2WAGPLCP" + EOL +
" 1" + EOL +
" " + EOL +
" " + EOL +
" network1111" + EOL +
" server1111" + EOL +
" " + EOL +
"" + EOL;
private String xmlReqNoAttrs =
"" + EOL +
" " + EOL +
" DELETE_VF_MODULE" + EOL +
" PORTAL" + EOL +
" " + EOL +
" " + EOL +
" a27ce5a9-29c4-4c22-a017-6615ac73c721" + EOL +
" STMTN5MMSC21" + EOL +
" asc_heat-int" + EOL +
" 973ed047-d251-4fb9-bf1a-65b8949e0a73" + EOL +
" STMTN5MMSC21-MMSC::module-0-0" + EOL +
" 00000000-0000-0000-0000-000000000000" + EOL +
" SDN-ETHERNET-INTERNET" + EOL +
" fba1bd1e195a404cacb9ce17a9b2b421" + EOL +
" pending-delete" + EOL +
" RDM2WAGPLCP" + EOL +
" " + EOL +
" " + EOL +
"" + EOL;
// JSON request w/ embedded XML will be read from a file
private String jsonReq = null;
@Before
public void initialize() {
File file = new File("src/test/resources/request.json");
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
jsonReq = br.readLine();
if (jsonReq != null) {
System.out.println("initialize(): json request: " + jsonReq);
} else {
System.out.println("initialize(): failed to read json request from src/test/resources/request.json");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
@After
public void cleanup(){
}
@Test
public void testConversion() {
// Note: the current version of the JsonUtils.json2xml() method
// does not support converting the JSONObject representation
// of XML attributes (JSONArray) back to XML. So this test will
// only succeed if the original XML does not contain attributes
// save a copy of the xml with the namespaces removed
String xmlIn = XmlTool.removeNamespaces(xmlReqNoAttrs);
// strip all the whitespace
xmlIn = xmlIn.replaceAll("\\s+","");
String json = JsonUtils.xml2json(xmlReqNoAttrs);
System.out.println("testConversion(): xml request to json: " + json);
String xmlOut = JsonUtils.json2xml(json);
System.out.println("testConversion(): json request back to xml: " + xmlOut);
// strip all the whitespace
xmlOut = xmlOut.replaceAll("\\s+","");
// System.out.println("testConversion(): xml in: " + xmlIn);
// System.out.println("testConversion(): xml out: " + xmlOut);
Diff diffXml;
try {
diffXml = new Diff(xmlIn, xmlOut);
Assert.assertTrue(diffXml.similar());
// Assert.assertTrue(diffXml.identical());
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testRetrieval() {
String json = JsonUtils.xml2json(xmlReq);
System.out.println("testRetrieval(): xml request to json: " + json);
// full JSON path
String value = JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.vnf-name");
Assert.assertEquals(value, "STMTN5MMSC21");
value = JsonUtils.getJsonValue(json, "vnf-request.request-info.action");
Assert.assertEquals(value, "CREATE_VF_MODULE");
// retrieving an integer
value = JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.persona-model-version");
Assert.assertEquals(value, "1");
// retrieving a float
value = JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.vnf-persona-model-version");
Assert.assertEquals(value, "1.5");
// retrieving a boolean
value = JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.is-base-module");
Assert.assertEquals(value, "true");
// attempt to retrieve a value for a non-existent field
value = JsonUtils.getJsonValue(json, "vnf-request.vnf-inputs.bad");
Assert.assertEquals(value, null);
// retrieving a parameter value (originally a XML attribute)
value = JsonUtils.getJsonParamValue(json, "vnf-request.vnf-params.param", "server");
// Assert.assertEquals(value, "[{\"content\":\"network1111\",\"name\":\"network\"},{\"content\":\"server1111\",\"name\":\"server\"}]");
Assert.assertEquals(value, "server1111");
value = JsonUtils.getJsonParamValue(json, "vnf-request.vnf-params.param", "badParam");
Assert.assertEquals(value, null);
// by field name/key
value = JsonUtils.getJsonValueForKey(json, "source");
Assert.assertEquals(value, "PORTAL");
value = JsonUtils.getJsonValueForKey(json, "vnf-module");
Assert.assertEquals(value, null);
}
@Test
public void testUpdate() {
String json = JsonUtils.xml2json(xmlReq);
System.out.println("testUpdate(): xml request to json: " + json);
// the add should be successful
String jsonUpd = JsonUtils.addJsonValue(json, "vnf-request.request-info.comment", "Some comment");
// System.out.println("testUpdate(): post add json request: " + jsonUpd);
String value = JsonUtils.getJsonValue(jsonUpd, "vnf-request.request-info.comment");
Assert.assertEquals(value, "Some comment");
// the add should be ignored as the field already exists
jsonUpd = JsonUtils.addJsonValue(jsonUpd, "vnf-request.vnf-inputs.vnf-name", "STMTN5MMSC22");
value = JsonUtils.getJsonValue(jsonUpd, "vnf-request.vnf-inputs.vnf-name");
Assert.assertEquals(value, "STMTN5MMSC21");
// the update should be successful
jsonUpd = JsonUtils.updJsonValue(jsonUpd, "vnf-request.vnf-inputs.vnf-name", "STMTN5MMSC22");
// System.out.println("testUpdate(): post update json request: " + jsonUpd);
value = JsonUtils.getJsonValue(jsonUpd, "vnf-request.vnf-inputs.vnf-name");
Assert.assertEquals(value, "STMTN5MMSC22");
// the delete should be successful
jsonUpd = JsonUtils.delJsonValue(jsonUpd, "vnf-request.request-info.comment");
// System.out.println("testUpdate(): post delete json request: " + jsonUpd);
value = JsonUtils.getJsonValue(jsonUpd, "vnf-request.request-info.comment");
Assert.assertEquals(value, null);
// the delete should fail as field 'vnf-model' does not exist
String jsonCur = jsonUpd;
jsonUpd = JsonUtils.delJsonValue(jsonUpd, "vnf-request.vnf-inputs.vnf-module");
Assert.assertEquals(jsonCur, jsonUpd);
}
@Test
public void testEmbededXmlRetrievalConversion() {
try {
// extract the embedded XML from the request
String value = JsonUtils.getJsonValue(jsonReq, "variables.bpmnRequest.value");
String xmlReq = XmlTool.removeNamespaces(XmlTool.normalize(value));
System.out.println("testEmbededXmlRetrievalConversion(): xml payload: " + xmlReq);
// strip all the whitespace
// xmlIn = xmlIn.replaceAll("\\s+","");
String json = JsonUtils.xml2json(xmlReq);
System.out.println("testEmbededXmlRetrievalConversion(): xml request to json: " + json);
String xmlOut = JsonUtils.json2xml(json);
System.out.println("testEmbededXmlRetrievalConversion(): json request back to xml: " + xmlOut);
Diff diffXml;
try {
// compare the XML before and after
diffXml = new Diff(xmlReq, xmlOut);
Assert.assertTrue(diffXml.similar());
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}