⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.cpp

📁 一个很好用的解析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <string>#include <iostream>#include <iomanip>#include <vector>#include <sstream>#include <memory>#include <time.h>#include "xmlrpc-c/girerr.hpp"using girerr::error;#include "transport_config.h"#include "xmlrpc-c/base.hpp"#include "xmlrpc-c/oldcppwrapper.hpp"#include "xmlrpc-c/registry.hpp"#include "testclient.hpp"#include "server_abyss.hpp"#include "tools.hpp"using namespace xmlrpc_c;using namespace std;//=========================================================================//  Test Harness//=========================================================================// //  There are two styles of test in here.  The older ones are vaguely//  inspired by Kent Beck's book on eXtreme Programming (XP) and use//  the TEST...() macros.////  But this style is not really appropriate for C++.  It's based on//  code that explicitly tests for errors, as one would do in C.  In C++,//  it is cumbersome to catch exceptions on every call, so we don't in//  the new style.//  And there's not much point in trying to count test successes and//  failures.  Any failure is a problem, so in the new style, we just//  quit after we recognize one (again, more in line with regular exception//  throwing).  With exception throwing, you can't count what _didn't_//  cause an exception, so there's no meaningful count of test successes.////  To run the tests, type './cpptest'.//  To check for memory leaks, install RedHat's 'memprof' utility, and//  type 'memprof cpptest'.////  If you add new tests to this file, please deallocate any data//  structures you use in the appropriate fashion. This allows us to test//  various destructor code for memory leaks.class sampleAddMethod : public method {public:    sampleAddMethod() {        this->_signature = "i:ii";        this->_help = "This method adds two integers together";    }    void    execute(xmlrpc_c::paramList const& paramList,            value *             const  retvalP) {                int const addend(paramList.getInt(0));        int const adder(paramList.getInt(1));                paramList.verifyEnd(2);                *retvalP = value_int(addend + adder);    }};class nameMethod : public defaultMethod {    void    execute(string              const& methodName,            xmlrpc_c::paramList const& ,  // paramList            value *             const  retvalP) {                *retvalP = value_string(string("no such method: ") + methodName);    }};//=========================================================================//  Test Suites//=========================================================================void test_fault (void) {    // Create a new fault and perform basic operations.    XmlRpcFault fault1 = XmlRpcFault(6, "Sample fault");    TEST(fault1.getFaultCode() == 6);    TEST(fault1.getFaultString() == "Sample fault");    // Extract and examine the underlying xmlrpc_env struct.    xmlrpc_env *env1 = fault1.getFaultEnv();    TEST(env1 != NULL);    TEST(env1->fault_occurred);    TEST(env1->fault_code == 6);    TEST(strcmp(env1->fault_string, "Sample fault") == 0);    // Test our copy constructor.    XmlRpcFault fault2 = fault1;    TEST(fault2.getFaultCode() == 6);    TEST(fault2.getFaultString() == "Sample fault");        // Construct a fault from a pre-existing xmlrpc_env structure.    xmlrpc_env env3;    xmlrpc_env_init(&env3);    xmlrpc_env_set_fault(&env3, 7, "Another fault");    XmlRpcFault fault3 = XmlRpcFault(&env3);    xmlrpc_env_clean(&env3);    TEST(fault3.getFaultCode() == 7);    TEST(fault3.getFaultString() == "Another fault");        // Attempt to construct a fault from a fault-free xmlrpc_env.    xmlrpc_env env4;    xmlrpc_env_init(&env4);    try {        XmlRpcFault fault4 = XmlRpcFault(&env4);        TEST_FAILED("Constructed invalid XmlRpcFault");    } catch (XmlRpcFault const& fault) {        TEST_PASSED();        TEST(fault.getFaultCode() == XMLRPC_INTERNAL_ERROR);    }    xmlrpc_env_clean(&env4);}void test_env (void) {    // Declare these here to prevent silly compiler warnings about    // potentially uninitialized variables.    XmlRpcEnv env1;    XmlRpcEnv env2;    // Perform simple environment tests.    TEST(!env1.hasFaultOccurred());    xmlrpc_env_set_fault(env1, 8, "Fault 8");    TEST(env1.hasFaultOccurred());    XmlRpcFault fault1 = env1.getFault();    TEST(fault1.getFaultCode() == 8);    TEST(fault1.getFaultString() == "Fault 8");    // Test throwIfFaultOccurred.    try {        env2.throwIfFaultOccurred();        TEST_PASSED();    } catch (XmlRpcFault const& fault) {        TEST_FAILED("We threw a fault when one hadn't occurred");    }     xmlrpc_env_set_fault(env2, 9, "Fault 9");    try {        env2.throwIfFaultOccurred();        TEST_FAILED("A fault occurred, and we didn't throw it");    } catch (XmlRpcFault const& fault) {        TEST_PASSED();        TEST(fault.getFaultCode() == 9);        TEST(fault.getFaultString() == "Fault 9");    }         // Make sure we can't get a fault if one hasn't occurred.    XmlRpcEnv env3;    try {        XmlRpcFault fault3 = env3.getFault();        TEST_FAILED("We retrieved a non-existant fault");    } catch (XmlRpcFault const& fault) {        TEST_PASSED();        TEST(fault.getFaultCode() == XMLRPC_INTERNAL_ERROR);    }}void test_value (void) {    XmlRpcEnv env;    // Test basic reference counting behavior.    xmlrpc_value *v = xmlrpc_build_value(env, "i", (xmlrpc_int32) 1);    env.throwIfFaultOccurred();    XmlRpcValue val1 = XmlRpcValue(v, XmlRpcValue::CONSUME_REFERENCE);    v = xmlrpc_build_value(env, "i", (xmlrpc_int32) 2);    env.throwIfFaultOccurred();    XmlRpcValue val2 = v;    xmlrpc_DECREF(v);    // Borrow a reference.    v = xmlrpc_build_value(env, "i", (xmlrpc_int32) 3);    env.throwIfFaultOccurred();    XmlRpcValue val3 = XmlRpcValue(v, XmlRpcValue::CONSUME_REFERENCE);    xmlrpc_value *borrowed = val3.borrowReference();    TEST(borrowed == v);    // Make a reference.    v = xmlrpc_build_value(env, "i", (xmlrpc_int32) 4);    env.throwIfFaultOccurred();    XmlRpcValue val4 = XmlRpcValue(v, XmlRpcValue::CONSUME_REFERENCE);    xmlrpc_value *made = val4.makeReference();    TEST(made == v);    xmlrpc_DECREF(made);    // Test our default constructor.    XmlRpcValue val5;    TEST(val5.getBool() == false);    // Test our type introspection.    TEST(XmlRpcValue::makeInt(0).getType() == XMLRPC_TYPE_INT);        // Test our basic data types.    TEST(XmlRpcValue::makeInt(30).getInt() == 30);    TEST(XmlRpcValue::makeInt(-30).getInt() == -30);    TEST(XmlRpcValue::makeBool(true).getBool() == true);    TEST(XmlRpcValue::makeBool(false).getBool() == false);    TEST(XmlRpcValue::makeDateTime("19980717T14:08:55").getRawDateTime() ==         "19980717T14:08:55");    TEST(XmlRpcValue::makeString("foo").getString() == "foo");    TEST(XmlRpcValue::makeString("bar", 3).getString() == "bar");    TEST(XmlRpcValue::makeString("bar", 3).getString() == "bar");    TEST(XmlRpcValue::makeString("a\0b").getString() == string("a\0b"));    XmlRpcValue::makeArray().getArray();    XmlRpcValue::makeStruct().getStruct();    // Test Base64 values.    const unsigned char *b64_data;    size_t b64_len;    XmlRpcValue val6 = XmlRpcValue::makeBase64((unsigned char*) "a\0\0b", 4);    val6.getBase64(b64_data, b64_len);    TEST(b64_len == 4);    TEST(memcmp(b64_data, "a\0\0b", 4) == 0);    // Test arrays.    XmlRpcValue array = XmlRpcValue::makeArray();    TEST(array.arraySize() == 0);    array.arrayAppendItem(XmlRpcValue::makeString("foo"));    TEST(array.arraySize() == 1);    array.arrayAppendItem(XmlRpcValue::makeString("bar"));    TEST(array.arraySize() == 2);    TEST(array.arrayGetItem(0).getString() == "foo");    TEST(array.arrayGetItem(1).getString() == "bar");    // Test structs.    XmlRpcValue strct = XmlRpcValue::makeStruct();    TEST(strct.structSize() == 0);    strct.structSetValue("foo", XmlRpcValue::makeString("fooval"));    TEST(strct.structSize() == 1);    strct.structSetValue("bar", XmlRpcValue::makeString("barval"));    TEST(strct.structSize() == 2);    TEST(strct.structHasKey("bar"));    TEST(!strct.structHasKey("nosuch"));    for (size_t i = 0; i < strct.structSize(); i++) {        string key;        XmlRpcValue value;        strct.structGetKeyAndValue(i, key, value);        TEST(key + "val" == value.getString());    }}static voidtestXmlRpcCpp() {/*----------------------------------------------------------------------------   Test the legacy XmlRpcCpp.cpp library-----------------------------------------------------------------------------*/    cout << "Testing XmlRpcCpp library..." << endl;    test_fault();    test_env();    test_value();}class intTestSuite : public testSuite {public:    virtual string suiteName() {        return "intTestSuite";    }    virtual void runtests(unsigned int const) {        value_int int1(7);        TEST(static_cast<int>(int1) == 7);        value_int int2(-7);        TEST(static_cast<int>(int2) == -7);        value val1(int1);        TEST(val1.type() == value::TYPE_INT);        value_int int3(val1);        TEST(static_cast<int>(int3) == 7);        try {            value_int int4(value_double(3.7));            TEST_FAILED("invalid cast double-int suceeded");        } catch (error) {}    }};class doubleTestSuite : public testSuite {public:    virtual string suiteName() {        return "doubleTestSuite";    }    virtual void runtests(unsigned int const) {        value_double double1(3.14);        TEST(static_cast<double>(double1) == 3.14);        value val1(double1);        TEST(val1.type() == value::TYPE_DOUBLE);        value_double double2(val1);        TEST(static_cast<double>(double2) == 3.14);        try {            value_double double4(value_int(4));            TEST_FAILED("invalid cast int-double suceeded");        } catch (error) {}    }};class booleanTestSuite : public testSuite {public:    virtual string suiteName() {        return "booleanTestSuite";    }    virtual void runtests(unsigned int const) {        value_boolean boolean1(true);         TEST(static_cast<bool>(boolean1) == true);        value_boolean boolean2(false);        TEST(static_cast<bool>(boolean2) == false);        value val1(boolean1);        TEST(val1.type() == value::TYPE_BOOLEAN);        value_boolean boolean3(val1);        TEST(static_cast<bool>(boolean3) == true);        try {            value_boolean boolean4(value_int(4));            TEST_FAILED("invalid cast int-boolean suceeded");        } catch (error) {}    }};class datetimeTestSuite : public testSuite {public:    virtual string suiteName() {        return "datetimeTestSuite";    }    virtual void runtests(unsigned int const) {        time_t const testTime(900684535);        value_datetime datetime1("19980717T14:08:55");        TEST(static_cast<time_t>(datetime1) == testTime);        value_datetime datetime2(testTime);        TEST(static_cast<time_t>(datetime2) == testTime);        value val1(datetime1);        TEST(val1.type() == value::TYPE_DATETIME);        value_datetime datetime3(val1);        TEST(static_cast<time_t>(datetime3) == testTime);        try {            value_datetime datetime4(value_int(4));            TEST_FAILED("invalid cast int-datetime suceeded");        } catch (error) {}    }};class stringTestSuite : public testSuite {public:    virtual string suiteName() {        return "stringTestSuite";    }    virtual void runtests(unsigned int const) {        value_string string1("hello world");        TEST(static_cast<string>(string1) == "hello world");        value_string string2("embedded\0null");        TEST(static_cast<string>(string2) == "embedded\0null");        value val1(string1);        TEST(val1.type() == value::TYPE_STRING);        value_string string3(val1);        TEST(static_cast<string>(string3) == "hello world");        try {            value_string string4(value_int(4));            TEST_FAILED("invalid cast int-string suceeded");        } catch (error) {}    }};class bytestringTestSuite : public testSuite {public:    virtual string suiteName() {        return "bytestringTestSuite";    }    virtual void runtests(unsigned int const) {        unsigned char bytestringArray[] = {0x10, 0x11, 0x12, 0x13, 0x14};        vector<unsigned char>             bytestringData(&bytestringArray[0], &bytestringArray[4]);        value_bytestring bytestring1(bytestringData);        vector<unsigned char> const dataReadBack1(            bytestring1.vectorUcharValue());        TEST(dataReadBack1 == bytestringData);        value val1(bytestring1);        TEST(val1.type() == value::TYPE_BYTESTRING);        value_bytestring bytestring2(val1);        vector<unsigned char> const dataReadBack2(            bytestring2.vectorUcharValue());        TEST(dataReadBack2 == bytestringData);        try {            value_bytestring bytestring4(value_int(4));            TEST_FAILED("invalid cast int-bytestring suceeded");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -