/*************************************************************************** * Copyright (C) 2004 by Intra2net AG * * info@intra2net.com * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace CppUnit; string testfunc(const string& str) { string ret; if (str=="throw") throw libt2n::t2n_runtime_error("throw me around"); if (str=="big") ret.insert(0,100*1024,'x'); else ret=str+", testfunc() was here"; return ret; } class testfunc_res : public libt2n::result { private: string res; friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(libt2n::result); ar & BOOST_SERIALIZATION_NVP(res); } public: testfunc_res() { } testfunc_res(const string& str) { res=str; } string get_data() { return res; } }; class testfunc_cmd : public libt2n::command { private: string param; friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(libt2n::command); ar & BOOST_SERIALIZATION_NVP(param); } public: testfunc_cmd() { } testfunc_cmd(const string& str) { param=str; } libt2n::result* operator()() { return new testfunc_res(testfunc(param)); } }; #include BOOST_CLASS_EXPORT(testfunc_cmd) BOOST_CLASS_EXPORT(testfunc_res) using namespace libt2n; class test_simplecmd : public TestFixture { CPPUNIT_TEST_SUITE(test_simplecmd); CPPUNIT_TEST(SimpleCmd); CPPUNIT_TEST(SimpleException); CPPUNIT_TEST(BigReturn); CPPUNIT_TEST(BigParameter); CPPUNIT_TEST_SUITE_END(); public: void setUp() { } void tearDown() { } void SimpleCmd() { pid_t pid; switch(pid=fork()) { case -1: { CPPUNIT_FAIL("fork error"); break; } case 0: // child { socket_server ss("./socket"); command_server cs(ss); // max 10 sec for (int i=0; i < 10; i++) cs.handle(1000000); // don't call atexit and stuff _exit(0); } default: // parent { // wait till server is up sleep(1); socket_client_connection sc("./socket"); sc.set_logging(&cerr,debug); command_client cc(sc); result_container rc; cc.send_command(new testfunc_cmd("hello"),rc); string ret=dynamic_cast(rc.get_result())->get_data(); CPPUNIT_ASSERT_EQUAL(string("hello, testfunc() was here"),ret); } } } void SimpleException() { pid_t pid; switch(pid=fork()) { case -1: { CPPUNIT_FAIL("fork error"); break; } case 0: // child { socket_server ss("./socket"); command_server cs(ss); // max 10 sec for (int i=0; i < 10; i++) cs.handle(1000000); // don't call atexit and stuff _exit(0); } default: // parent { // wait till server is up sleep(1); socket_client_connection sc("./socket"); sc.set_logging(&cerr,debug); command_client cc(sc); result_container rc; cc.send_command(new testfunc_cmd("throw"),rc); string ret; try { ret=dynamic_cast(rc.get_result())->get_data(); } catch(t2n_runtime_error &e) { ret=e.what(); } catch(...) { throw; } CPPUNIT_ASSERT_EQUAL(string("throw me around"),ret); } } } void BigReturn() { pid_t pid; switch(pid=fork()) { case -1: { CPPUNIT_FAIL("fork error"); break; } case 0: // child { socket_server ss("./socket"); command_server cs(ss); // max 10 sec for (int i=0; i < 10; i++) cs.handle(1000000); // don't call atexit and stuff _exit(0); } default: // parent { // wait till server is up sleep(1); socket_client_connection sc("./socket"); command_client cc(sc); result_container rc; cc.send_command(new testfunc_cmd("big"),rc); string ret=dynamic_cast(rc.get_result())->get_data(); CPPUNIT_ASSERT_EQUAL(string().insert(0,100*1024,'x'),ret); } } } void BigParameter() { pid_t pid; switch(pid=fork()) { case -1: { CPPUNIT_FAIL("fork error"); break; } case 0: // child { socket_server ss("./socket"); command_server cs(ss); // max 10 sec for (int i=0; i < 10; i++) cs.handle(1000000); // don't call atexit and stuff _exit(0); } default: // parent { // wait till server is up sleep(1); socket_client_connection sc("./socket"); command_client cc(sc); result_container rc; cc.send_command(new testfunc_cmd(string().insert(0,100*1024,'y')),rc); string ret=dynamic_cast(rc.get_result())->get_data(); CPPUNIT_ASSERT_EQUAL(string().insert(0,100*1024,'y')+", testfunc() was here",ret); } } } }; CPPUNIT_TEST_SUITE_REGISTRATION(test_simplecmd);