/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF 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. */ /* $Rev$ $Date$ */ /** * Test JSON data conversion functions. */ #include #include "stream.hpp" #include "string.hpp" #include "json.hpp" #include "perf.hpp" #include "json-test.hpp" namespace tuscany { namespace json { ostream* jsonWriter(const string& s, ostream* os) { (*os) << s; return os; } const string testCustomer("{" "\"customer\":{" "\"@name\":\"jdoe\"," "\"address\":{" "\"@city\":\"san francisco\"," "\"@state\":\"ca\"" "}," "\"account\":{" "\"id\":\"1234\"," "\"@balance\":1000" "}" "}" "}"); const string testCustomer2("{" "\"customer\":{" "\"@name\":\"jdoe\"," "\"account\":{" "\"id\":\"1234\"," "\"@balance\":1000" "}," "\"address\":{" "\"@city\":\"san francisco\"," "\"@state\":\"ca\"" "}" "}" "}"); const string testPhones("{" "\"phones\":[" "\"408-1234\"," "\"650-1234\"" "]," "\"lastName\":\"test\\ttab\"," "\"@firstName\":\"test1\"" "}"); const string testEcho("{" "\"ns1:echoString\":{" "\"@xmlns:ns1\":\"http://ws.apache.org/axis2/services/echo\"," "\"text\":\"Hello World!\"" "}" "}"); const string testArray("{" "\"fruit\":[" "\"Apple\"," "\"Orange\"" "]" "}"); const bool testJSON() { const gc_scoped_pool pool; { const list ad = mklist(mklist(attribute, "city", string("san francisco")), mklist(attribute, "state", string("ca"))); const list ac = mklist(mklist(element, "id", string("1234")), mklist(attribute, "balance", 1000)); const list cr = mklist(mklist (attribute, "name", string("jdoe")), cons(element, cons("address", ad)), cons(element, cons("account", ac))); const list c = mklist(cons(element, cons("customer", cr))); ostringstream os; writeElements(jsonWriter, &os, c); assert(str(os) == testCustomer); } { const list phones = mklist (string("408-1234"), string("650-1234")); const list l = mklist (mklist (element, "phones", phones), mklist (element, "lastName", string("test\ttab")), mklist (attribute, "firstName", string("test1"))); ostringstream os; writeElements(jsonWriter, &os, l); assert(str(os) == testPhones); istringstream is(str(os)); const list il = streamList(is); const list r = content(readElements(il)); assert(r == l); ostringstream wos; write(content(writeElements(r)), wos); assert(str(wos) == str(os)); } { const list l = mklist(nilListValue + "ns1:echoString" + (nilListValue + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + (nilListValue + "text" + string("Hello World!"))); ostringstream wos; write(content(writeElements(valuesToElements(l))), wos); assert(str(wos) == testEcho); istringstream is(str(wos)); const list il = streamList(is); const list r = elementsToValues(content(readElements(il))); assert(r == l); } { const list l = mklist((nilListValue + "fruit" + string("Apple")), (nilListValue + "fruit" + string("Orange"))); ostringstream wos; write(content(writeElements(valuesToElements(l))), wos); assert(str(wos) == testArray); istringstream is(str(wos)); const list il = streamList(is); const list r = elementsToValues(content(readElements(il))); const list l2 = mklist(nilListValue + "fruit" + (nilListValue + string("Apple") + string("Orange"))); assert(r == l2); } return true; } const string testItem("{" "\"id\":3," "\"result\":[" "{" "\"price\":\"$2.99\"," "\"name\":\"Apple\"" "}," "{" "\"price\":\"$3.55\"," "\"name\":\"Orange\"" "}," "{" "\"price\":\"$1.55\"," "\"name\":\"Pear\"" "}" "]" "}"); const string testResult("{" "\"id\":1," "\"result\":[" "\"Service.get\"," "\"Service.getTotal\"" "]" "}"); const string testFeed("{" "\"id\":1," "\"result\":[" "\"Sample Feed\"," "\"123456789\"," "[" "\"Item\"," "\"111\"," "{" "\"name\":\"Apple\"," "\"currencyCode\":\"USD\"," "\"currencySymbol\":\"$\"," "\"price\":2.99" "}" "]," "[" "\"Item\"," "\"222\"," "{" "\"name\":\"Orange\"," "\"currencyCode\":\"USD\"," "\"currencySymbol\":\"$\"," "\"price\":3.55" "}" "]," "[" "\"Item\"," "\"333\"," "{" "\"name\":\"Pear\"," "\"currencyCode\":\"USD\"," "\"currencySymbol\":\"$\"," "\"price\":1.55" "}" "]" "]" "}"); const string testFeed2("{" "\"id\":1," "\"result\":[" "\"Sample Feed\"," "\"123456789\"," "[" "\"Item\"," "\"111\"," "{" "\"name\":\"Apple\"," "\"price\":2.99," "\"currencyCode\":\"USD\"," "\"currencySymbol\":\"$\"" "}" "]," "[" "\"Item\"," "\"222\"," "{" "\"name\":\"Orange\"," "\"price\":3.55," "\"currencyCode\":\"USD\"," "\"currencySymbol\":\"$\"" "}" "]," "[" "\"Item\"," "\"333\"," "{" "\"name\":\"Pear\"," "\"price\":1.55," "\"currencyCode\":\"USD\"," "\"currencySymbol\":\"$\"" "}" "]" "]" "}"); const string testEchoreq("{" "\"id\":1," "\"method\":\"echo\"," "\"params\":[" "{" "\"ns1:echoString\":{" "\"@xmlns:ns1\":\"http://ws.apache.org/axis2/services/echo\"," "\"text\":\"Hello World!\"" "}" "}" "]" "}"); const string testEchores("{" "\"id\":1," "\"result\":{" "\"ns1:echoString\":{" "\"@xmlns:ns1\":\"http://ws.apache.org/axis2/c/samples\"," "\"text\":\"Hello World!\"" "}" "}" "}"); const bool testJSONRPC() { const gc_scoped_pool pool; { const string lm("{\"id\":1,\"method\":\"test\",\"params\":[]}"); const list e = content(readElements(mklist(lm))); const list v = elementsToValues(e); assert(assoc("id", v) == mklist("id", 1)); assert(assoc("method", v) == mklist("method", string("test"))); assert(assoc("params", v) == mklist("params", nilListValue)); } { const list e = content(readElements(mklist(testItem))); ostringstream os; write(content(writeElements(e)), os); assert(str(os) == testItem); const list v = elementsToValues(e); const list r = valuesToElements(v); assert(r == e); } { const list r = mklist(mklist("id", 1), mklist("result", mklist(string("Service.get"), string("Service.getTotal")))); const list e = valuesToElements(r); ostringstream os; write(content(writeElements(e)), os); assert(str(os) == testResult); } { const list r = content(readElements(mklist(testFeed))); const list v = elementsToValues(r); const list e = valuesToElements(v); ostringstream os; write(content(writeElements(e)), os); #ifndef __clang__ assert(str(os) == testFeed2); #endif } { const list arg = mklist(nilListValue + "ns1:echoString" + (nilListValue + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + (nilListValue + "text" + string("Hello World!"))); const failable > r = jsonRequest(1, "echo", mklist(arg)); ostringstream os; write(content(r), os); assert(str(os) == testEchoreq); istringstream is(str(os)); const list il = streamList(is); const list ir = elementsToValues(content(readElements(il))); assert(car(cadr(caddr(ir))) == arg); } { const list res = mklist(nilListValue + "ns1:echoString" + (nilListValue + "@xmlns:ns1" + string("http://ws.apache.org/axis2/c/samples")) + (nilListValue + "text" + string("Hello World!"))); const failable > r = jsonResult(1, res); ostringstream os; write(content(r), os); assert(str(os) == testEchores); istringstream is(str(os)); const list il = streamList(is); const list ir = elementsToValues(content(readElements(il))); assert(cdr(cadr(ir)) == res); } return true; } const bool readWrite() { const gc_scoped_pool pool; istringstream is(testCustomer); const list il = streamList(is); const list r = elementsToValues(content(readElements(il))); ostringstream os; writeElements(jsonWriter, &os, valuesToElements(r)); //assert(str(os) == testCustomer2); return true; } const bool testReadWritePerf() { const gc_scoped_pool pool; const blambda rwl = blambda(readWrite); cout << "JSON read + write test " << time(rwl, 5, 200) << " ms" << endl; return true; } const bool readWriteBigDoc() { const gc_scoped_pool pool; istringstream is(testBigDoc); const list il = streamList(is); const list r = elementsToValues(content(readElements(il))); ostringstream os; writeElements(jsonWriter, &os, valuesToElements(r)); //assert(str(os) == testBigDoc2); return true; } const bool testReadWriteBigDocPerf() { const gc_scoped_pool pool; const blambda rwl = blambda(readWriteBigDoc); cout << "JSON big doc read + write test " << time(rwl, 5, 200) << " ms" << endl; return true; } } } int main() { const tuscany::gc_scoped_pool p; tuscany::cout << "Testing..." << tuscany::endl; tuscany::json::testJSON(); tuscany::json::testJSONRPC(); tuscany::json::testReadWritePerf(); tuscany::json::testReadWriteBigDocPerf(); tuscany::cout << "OK" << tuscany::endl; return 0; }