/** * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you 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. */ package org.apache.synapse.commons.json; import junit.framework.TestCase; import org.apache.axis2.AxisFault; import org.apache.axis2.transport.MessageFormatter; import org.apache.axis2.context.MessageContext; import javax.xml.stream.XMLStreamException; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.OutputStream; public class JsonFormatterTest extends TestCase { private static final String xmlInput = "<pizza>\n" + " <name>Meat Sizzler</name>\n" + " <price>500.0</price>\n" + " <toppings>\n" + " <topping>\n" + " <id>9999</id>\n" + " <name>Steak</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " <topping>\n" + " <id>9998</id>\n" + " <name>Sun Dried Tomato</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>VEGETARIAN</category>\n" + " </topping>\n" + " <topping>\n" + " <id>9997</id>\n" + " <name>Mixed Peppers</name>\n" + " <extraPrice>3.00</extraPrice>\n" + " <category>VEGETARIAN</category>\n" + " </topping>\n" + " <topping>\n" + " <id>9996</id>\n" + " <name>Cajun Chicken</name>\n" + " <extraPrice>3.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " <topping>\n" + " <id>9995</id>\n" + " <name>Chorizo Sausage</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " </toppings>\n" + "</pizza>"; public static final String jsonOut = "{\"pizza\":{\"name\":\"Meat Sizzler\",\"price\":500.0,\"toppings\":{\"topping\":[{\"id\":9999,\"name\":\"Steak\",\"extraPrice\":4.00,\"category\":\"NONVEG\"},{\"id\":9998,\"name\":\"Sun Dried Tomato\",\"extraPrice\":4.00,\"category\":\"VEGETARIAN\"},{\"id\":9997,\"name\":\"Mixed Peppers\",\"extraPrice\":3.00,\"category\":\"VEGETARIAN\"},{\"id\":9996,\"name\":\"Cajun Chicken\",\"extraPrice\":3.00,\"category\":\"NONVEG\"},{\"id\":9995,\"name\":\"Chorizo Sausage\",\"extraPrice\":4.00,\"category\":\"NONVEG\"}]}}}"; public static final String xmlInput_1 = "<pizza>\n" + " <name>Meat Sizzler</name>\n" + " <price>500.0</price>\n" + " <toppings>\n" + " <topping>\n" + " <id>9999</id>\n" + " <name>Steak</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " </toppings>\n" + "</pizza>"; public static final String jsonOut_1 = "{\"pizza\":{\"name\":\"Meat Sizzler\",\"price\":500.0,\"toppings\":{\"topping\":{\"id\":9999,\"name\":\"Steak\",\"extraPrice\":4.00,\"category\":\"NONVEG\"}}}}"; public static final String xmlInput_2 = "<pizza>\n" + " <name>Meat Sizzler</name>\n" + " <price>500.0</price>\n" + " <toppings>\n" + " <topping>\n" + " <id>9999</id>\n" + " <name>Steak</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " <topping/>\n" + " </toppings>\n" + "</pizza>"; public static final String jsonOut_2 = "{\"pizza\":{\"name\":\"Meat Sizzler\",\"price\":500.0,\"toppings\":{\"topping\":[{\"id\":9999,\"name\":\"Steak\",\"extraPrice\":4.00,\"category\":\"NONVEG\"},null]}}}"; public static final String xmlInput_3 = "<pizza>\n" + " <name>Meat Sizzler</name>\n" + " <price>500.0</price>\n" + " <toppings>\n" + " <topping>\n" + " <id>9999</id>\n" + " <name>Steak</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " <topping></topping>\n" + " </toppings>\n" + "</pizza>"; public static final String xmlInput_4 = "<jsonObject>\n" + " <pizza>\n" + " <name>Meat Sizzler</name>\n" + " <price>500.0</price>\n" + " <toppings>\n" + " <topping>\n" + " <id>9999</id>\n" + " <name>Steak</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " </toppings>\n" + " </pizza>\n" + "</jsonObject>"; public static final String xmlInput_5 = "<jsonArray>\n" + " <jsonElement>\n" + " <pizza>\n" + " <name>Meat Sizzler</name>\n" + " <price>500.0</price>\n" + " <toppings>\n" + " <topping>\n" + " <id>9999</id>\n" + " <name>Steak</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " </toppings>\n" + " </pizza>\n" + " </jsonElement>\n" + "</jsonArray>"; public static final String xmlInput_6 = "<jsonArray>\n" + " <jsonElement>\n" + " <pizza>\n" + " <name>Meat Sizzler</name>\n" + " <price>500.0</price>\n" + " <toppings>\n" + " <topping>\n" + " <id>9999</id>\n" + " <name>Steak</name>\n" + " <extraPrice>4.00</extraPrice>\n" + " <category>NONVEG</category>\n" + " </topping>\n" + " </toppings>\n" + " </pizza>\n" + " </jsonElement>\n" + " <jsonElement/>\n" + "</jsonArray>"; public static final String jsonOut_6 = "[{\"pizza\":{\"name\":\"Meat Sizzler\",\"price\":500.0,\"toppings\":{\"topping\":{\"id\":9999,\"name\":\"Steak\",\"extraPrice\":4.00,\"category\":\"NONVEG\"}}}},null]"; /** * NOTE: Under this test class, we cannot test the creation of JSON arrays by giving xml processing instructions to the * xml input string object. The reason is that when doing stringToOm and setting the SOAP child with addChild() method, * the addChild() method throws an exception saying that it does not support the xml PI node type. */ public void testCase() { try { InputStream inputStream = Util.getJson(0); MessageFormatter formatter = Util.newJsonFormatter(); MessageContext messageContext = Util.newMessageContext(); JsonUtil.getNewJsonPayload(messageContext, inputStream, false, false); OutputStream out = Util.newOutputStream(); formatter.writeTo(messageContext, null, out, false); assertTrue(JsonDataSourceTest.expectedJSON.equals(out.toString())); } catch (FileNotFoundException e) { e.printStackTrace(); assertTrue(false); } catch (AxisFault axisFault) { axisFault.printStackTrace(); assertTrue(false); } } public void testCase2() { try { InputStream inputStream = Util.getJson(0); runTest(xmlInput, jsonOut, inputStream); } catch (FileNotFoundException e) { e.printStackTrace(); assertTrue(false); } } public void testCase3() { runTest(xmlInput_1, jsonOut_1, null); } public void testCase4() { runTest(xmlInput_2, jsonOut_2, null); } public void testCase5() { runTest(xmlInput_3, jsonOut_2, null); } public void testCase6() { runTest(xmlInput_4, jsonOut_1, null); } public void testCase7() { runTest(xmlInput_5, jsonOut_1, null); } public void testCase8() { runTest(xmlInput_6, jsonOut_6, null); } private void runTest(String xmlInput, String jsonOut, InputStream inputStream) { try { MessageFormatter formatter = Util.newJsonFormatter(); MessageContext messageContext = Util.newMessageContext(xmlInput); JsonUtil.getNewJsonPayload(messageContext, inputStream, false, false); OutputStream out = Util.newOutputStream(); formatter.writeTo(messageContext, null, out, false); assertTrue(jsonOut.equals(out.toString())); } catch (AxisFault axisFault) { axisFault.printStackTrace(); assertTrue(false); } catch (XMLStreamException e) { e.printStackTrace(); assertTrue(false); } catch (Exception e) { System.out.println(e); assertTrue(false); } } }