/*- * ============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(); } } }