#include #include #include #include #include #include #include #include #include "xmlrpc-c/girerr.hpp" using girerr::error; #include "xmlrpc-c/base.hpp" #include "xmlrpc-c/oldcppwrapper.hpp" #include "xmlrpc-c/registry.hpp" #include "c_util.h" #include "tools.hpp" #include "value.hpp" using namespace xmlrpc_c; using namespace std; namespace { class intTestSuite : public testSuite { public: virtual string suiteName() { return "intTestSuite"; } virtual void runtests(unsigned int const) { value_int int1(7); TEST(static_cast(int1) == 7); value_int int2(-7); TEST(static_cast(int2) == -7); value val1(int1); TEST(val1.type() == value::TYPE_INT); value_int int3(val1); TEST(static_cast(int3) == 7); try { value_int int4(value_double(3.7)); TEST_FAILED("invalid cast double-int suceeded"); } catch (error const&) {} value const int1x(toValue(7)); TEST(int1x.type() == value::TYPE_INT); TEST(static_cast(value_int(int1x)) == 7); int test1x; fromValue(test1x, int1x); TEST(test1x == 7); } }; class doubleTestSuite : public testSuite { public: virtual string suiteName() { return "doubleTestSuite"; } virtual void runtests(unsigned int const) { value_double double1(3.14); TEST(static_cast(double1) == 3.14); value val1(double1); TEST(val1.type() == value::TYPE_DOUBLE); value_double double2(val1); TEST(static_cast(double2) == 3.14); try { value_double double4(value_int(4)); TEST_FAILED("invalid cast int-double suceeded"); } catch (error const&) {} value const double1x(toValue(3.14)); TEST(double1x.type() == value::TYPE_DOUBLE); TEST(static_cast(value_double(double1x)) == 3.14); double test1x; fromValue(test1x, double1x); TEST(test1x == 3.14); } }; class booleanTestSuite : public testSuite { public: virtual string suiteName() { return "booleanTestSuite"; } virtual void runtests(unsigned int const) { value_boolean boolean1(true); TEST(static_cast(boolean1) == true); value_boolean boolean2(false); TEST(static_cast(boolean2) == false); value val1(boolean1); TEST(val1.type() == value::TYPE_BOOLEAN); value_boolean boolean3(val1); TEST(static_cast(boolean3) == true); try { value_boolean boolean4(value_int(4)); TEST_FAILED("invalid cast int-boolean suceeded"); } catch (error const&) {} value const boolean1x(toValue(true)); TEST(boolean1x.type() == value::TYPE_BOOLEAN); TEST(static_cast(value_boolean(boolean1x)) == true); bool test1x; fromValue(test1x, boolean1x); TEST(test1x == true); } }; #if XMLRPC_HAVE_TIMEVAL static struct timeval makeTv(time_t const secs, unsigned int const usecs) { struct timeval retval; retval.tv_sec = secs; retval.tv_usec = usecs; return retval; } static bool tvIsEqual(struct timeval const comparand, struct timeval const comparator) { return comparand.tv_sec == comparator.tv_sec && comparand.tv_usec == comparator.tv_usec; } #endif #if XMLRPC_HAVE_TIMESPEC static struct timespec makeTs(time_t const secs, unsigned int const usecs) { struct timespec retval; retval.tv_sec = secs; retval.tv_nsec = usecs * 1000; return retval; } static bool tsIsEqual(struct timespec const comparand, struct timespec const comparator) { return comparand.tv_sec == comparator.tv_sec && comparand.tv_nsec == comparator.tv_nsec; } #endif static xmlrpc_datetime const makeXd(time_t const secs, unsigned int const usecs) { struct tm const tm = *gmtime(&secs); xmlrpc_datetime retval; retval.Y = 1900 + tm.tm_year; retval.M = 1 + tm.tm_mon; retval.D = tm.tm_mday; retval.h = tm.tm_hour; retval.m = tm.tm_min; retval.s = tm.tm_sec; retval.u = usecs; return retval; } static bool xdIsEqual(xmlrpc_datetime const comparand, xmlrpc_datetime const comparator) { return comparand.Y == comparator.Y && comparand.M == comparator.M && comparand.D == comparator.D && comparand.h == comparator.h && comparand.m == comparator.m && comparand.s == comparator.s && comparand.u == comparator.u; } class datetimeTestSuite : public testSuite { public: virtual string suiteName() { return "datetimeTestSuite"; } virtual void runtests(unsigned int const) { time_t const testTime(900684535); string const testTime8601("19980717T140855,000000Z"); value_datetime datetime1("19980717T14:08:55"); TEST(static_cast(datetime1) == testTime); value_datetime datetime2(testTime); TEST(static_cast(datetime2) == testTime); value val1(datetime1); TEST(val1.type() == value::TYPE_DATETIME); value_datetime datetime3(val1); TEST(static_cast(datetime3) == testTime); #if XMLRPC_HAVE_TIMEVAL struct timeval const testTimeTv(makeTv(testTime, 0)); value_datetime datetime4(testTimeTv); TEST(static_cast(datetime4) == testTime); TEST(tvIsEqual(static_cast(datetime4), testTimeTv)); #endif #if XMLRPC_HAVE_TIMESPEC struct timespec const testTimeTs(makeTs(testTime, 0)); value_datetime datetime5(testTimeTs); TEST(static_cast(datetime5) == testTime); TEST(tsIsEqual(static_cast(datetime5), testTimeTs)); #endif xmlrpc_datetime const testTimeXd(makeXd(testTime, 5)); value_datetime datetime6(testTimeXd); TEST(static_cast(datetime6) == testTime); TEST(xdIsEqual(static_cast(datetime6), testTimeXd)); string const iso8601Value(datetime1.iso8601Value()); TEST(iso8601Value == testTime8601); try { value_datetime datetime4(value_int(4)); TEST_FAILED("invalid cast int-datetime suceeded"); } catch (error const&) {} } }; class stringTestSuite : public testSuite { public: virtual string suiteName() { return "stringTestSuite"; } virtual void runtests(unsigned int const) { value_string string1("hello world"); TEST(static_cast(string1) == "hello world"); value_string string2("embedded\0null"); TEST(static_cast(string2) == "embedded\0null"); value val1(string1); TEST(val1.type() == value::TYPE_STRING); value_string string3(val1); TEST(static_cast(string3) == "hello world"); try { value_string string4(value_int(4)); TEST_FAILED("invalid cast int-string succeeded"); } catch (error const&) {} value_string string5("hello world", value_string::nlCode_all); TEST(static_cast(string5) == "hello world"); value_string string6("hello\nthere\rworld\r\n\n", value_string::nlCode_all); TEST(static_cast(string6) == "hello\nthere\nworld\n\n"); TEST(string6.crlfValue() == "hello\r\nthere\r\nworld\r\n\r\n"); value_string string7("hello\nthere\rworld\r\n\n", value_string::nlCode_lf); TEST(static_cast(string7) == "hello\nthere\rworld\r\n\n"); value const string1x(toValue("hello world")); TEST(string1x.type() == value::TYPE_STRING); TEST(static_cast(value_string(string1x)) == "hello world"); string test1x; fromValue(test1x, string1x); TEST(test1x == "hello world"); value const string2x(toValue(string("hello world"))); TEST(string2x.type() == value::TYPE_STRING); TEST(static_cast(value_string(string2x)) == "hello world"); string1.validate(); value_string badString("hello \x18 there"); try { badString.validate(); TEST_FAILED("'validate' of string containging a control " "character succeeded"); } catch (error const&) {} } }; class bytestringTestSuite : public testSuite { public: virtual string suiteName() { return "bytestringTestSuite"; } virtual void runtests(unsigned int const) { unsigned char bytestringArray[] = {0x10, 0x11, 0x12, 0x13, 0x14}; cbytestring bytestringData(&bytestringArray[0], &bytestringArray[4]); value_bytestring bytestring1(bytestringData); cbytestring const dataReadBack1(bytestring1.vectorUcharValue()); TEST(dataReadBack1 == bytestringData); value val1(bytestring1); TEST(val1.type() == value::TYPE_BYTESTRING); value_bytestring bytestring2(val1); vector const dataReadBack2( bytestring2.vectorUcharValue()); TEST(dataReadBack2 == bytestringData); try { value_bytestring bytestring4(value_int(4)); TEST_FAILED("invalid cast int-bytestring suceeded"); } catch (error const&) {} value const bytestring1x(toValue(bytestringData)); TEST(bytestring1x.type() == value::TYPE_BYTESTRING); vector const dataReadBack1x( value_bytestring(bytestring1x).vectorUcharValue()); TEST(dataReadBack1x == bytestringData); vector test1x; fromValue(test1x, bytestring1x); TEST(test1x == bytestringData); } }; class nilTestSuite : public testSuite { public: virtual string suiteName() { return "nilTestSuite"; } virtual void runtests(unsigned int const) { value_nil nil1; value val1(nil1); TEST(val1.type() == value::TYPE_NIL); value_nil nil2(val1); try { value_nil nil4(value_int(4)); TEST_FAILED("invalid cast int-nil suceeded"); } catch (error const&) {} } }; class i8TestSuite : public testSuite { public: virtual string suiteName() { return "i8TestSuite"; } virtual void runtests(unsigned int const) { value_i8 int1(7); TEST(static_cast(int1) == 7); value_i8 int2(-7); TEST(static_cast(int2) == -7); value_i8 int5(1ull << 40); TEST(static_cast(int5) == (1ull << 40)); value val1(int1); TEST(val1.type() == value::TYPE_I8); value_i8 int3(val1); TEST(static_cast(int3) == 7); try { value_i8 int4(value_double(3.7)); TEST_FAILED("invalid cast double-i8 suceeded"); } catch (error const&) {} value const int1x(toValue((xmlrpc_int64)7)); TEST(int1x.type() == value::TYPE_I8); TEST(static_cast(value_i8(int1x)) == 7); xmlrpc_int64 test1x; fromValue(test1x, int1x); TEST(test1x == 7); } }; class structTestSuite : public testSuite { public: virtual string suiteName() { return "structTestSuite"; } virtual void runtests(unsigned int const) { cstruct structData; pair member("the_integer", value_int(9)); structData.insert(member); value_struct struct1(structData); map dataReadBack(struct1); TEST(static_cast(value_int(dataReadBack["the_integer"])) == 9); value val1(struct1); TEST(val1.type() == value::TYPE_STRUCT); value_struct struct2(val1); try { value_struct struct4(value_int(4)); TEST_FAILED("invalid cast int-struct suceeded"); } catch (error const&) {} map structDatax; structDatax["one"] = 1; structDatax["two"] = 2; value const struct5(toValue(structDatax)); TEST(struct5.type() == value::TYPE_STRUCT); map dataReadBackx; dataReadBackx = value_struct(struct5); TEST(static_cast(value_int(dataReadBackx["two"])) == 2); map test5x; fromValue(test5x, struct5); TEST(test5x["two"] == 2); } }; class arrayTestSuite : public testSuite { public: virtual string suiteName() { return "arrayTestSuite"; } virtual void runtests(unsigned int const) { carray arrayData; arrayData.push_back(value_int(7)); arrayData.push_back(value_double(2.78)); arrayData.push_back(value_string("hello world")); value_array array1(arrayData); TEST(array1.size() == 3); vector dataReadBack1(array1.vectorValueValue()); TEST(dataReadBack1[0].type() == value::TYPE_INT); TEST(static_cast(value_int(dataReadBack1[0])) == 7); TEST(dataReadBack1[1].type() == value::TYPE_DOUBLE); TEST(static_cast(value_double(dataReadBack1[1])) == 2.78); TEST(dataReadBack1[2].type() == value::TYPE_STRING); TEST(static_cast(value_string(dataReadBack1[2])) == "hello world"); value val1(array1); TEST(val1.type() == value::TYPE_ARRAY); value_array array2(val1); TEST(array2.size() == 3); try { value_array array4(value_int(4)); TEST_FAILED("invalid cast int-array suceeded"); } catch (error const&) {} int const arrayDatax[] = {7, 4}; value const array5( arrayValueArray(arrayDatax, ARRAY_SIZE(arrayDatax))); TEST(array5.type() == value::TYPE_ARRAY); TEST(value_array(array5).size() == 2); vector dataReadBackx(value_array(array5).vectorValueValue()); TEST(dataReadBackx.size() == 2); TEST(static_cast(value_int(dataReadBackx[0])) == 7); vector test5x; fromValue(test5x, array5); TEST(test5x[1] == 4); vector arrayDataVec; arrayDataVec.push_back("hello world"); value const array6(toValue(arrayDataVec)); TEST(array6.type() == value::TYPE_ARRAY); TEST(value_array(array6).size() == 1); } }; } // unnamed namespace string valueTestSuite::suiteName() { return "valueTestSuite"; } void valueTestSuite::runtests(unsigned int const indentation) { intTestSuite().run(indentation+1); doubleTestSuite().run(indentation+1); booleanTestSuite().run(indentation+1); datetimeTestSuite().run(indentation+1); stringTestSuite().run(indentation+1); bytestringTestSuite().run(indentation+1); nilTestSuite().run(indentation+1); i8TestSuite().run(indentation+1); structTestSuite().run(indentation+1); arrayTestSuite().run(indentation+1); }