X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=test%2Fgetsocket.cpp;fp=test%2Fgetsocket.cpp;h=96964cb8614f630ef179808e51695f884de90622;hp=0000000000000000000000000000000000000000;hb=1fdd03d219ebc40bf0ec17fdfea4bf1a20666e3a;hpb=673142e5d06e88b5fe4c9f6d839fa1658c850a07 diff --git a/test/getsocket.cpp b/test/getsocket.cpp new file mode 100644 index 0000000..96964cb --- /dev/null +++ b/test/getsocket.cpp @@ -0,0 +1,190 @@ +/* +Copyright (C) 2004 by Intra2net AG + +The software in this package is distributed under the GNU General +Public License version 2 (with a special exception described below). + +A copy of GNU General Public License (GPL) is included in this distribution, +in the file COPYING.GPL. + +As a special exception, if other files instantiate templates or use macros +or inline functions from this file, or you compile this file and link it +with other works to produce a work based on this file, this file +does not by itself cause the resulting work to be covered +by the GNU General Public License. + +However the source code for this file must still be made available +in accordance with section (3) of the GNU General Public License. + +This exception does not invalidate any other reasons why a work based +on this file might be covered by the GNU General Public License. +*/ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define BOOST_TEST_DYN_LINK +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "test_fixtures.hxx" + +using namespace std; + +set SocketSet; + +bool check_sockets(const int& test_socket) +{ + bool ret = false; + set::iterator it; + for (it = SocketSet.begin(); it != SocketSet.end(); it++) + { + if (test_socket == *it) + { + ret = true; + break; + } + } + return ret; +} + +class checkfunc_res : public libt2n::result +{ + private: + bool 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: + checkfunc_res() + { } + + checkfunc_res(const bool& value) + { + res=value; + } + + bool get_data() + { + return res; + } +}; + + +class checkfunc_cmd : public libt2n::command +{ + private: + int 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: + checkfunc_cmd() + {} + + checkfunc_cmd(const int& value) + { + param=value; + } + + libt2n::result* operator()() + { + return new checkfunc_res(check_sockets(param)); + } +}; + +#include + +BOOST_CLASS_EXPORT(checkfunc_cmd) +BOOST_CLASS_EXPORT(checkfunc_res) + +using namespace libt2n; + +BOOST_FIXTURE_TEST_SUITE(test_getsocket, KillChildOnShutdownFixture) + +BOOST_AUTO_TEST_CASE(SocketCheck) +{ + switch(child_pid=fork()) + { + case -1: + { + BOOST_FAIL("fork error"); + break; + } + case 0: + // child + { + try + { + socket_server ss("./socket"); + command_server cs(ss); + + // max 10 sec + for (int i=0; i < 10; i++) + { + SocketSet = ss.get_sockets_set(); + cs.handle(1000000); + } + } catch(...) + { + std::cerr << "exception in child. ignoring\n"; + } + + // 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; + int socket_fd = sc.get_socket(); + // Next line causes problem + cc.send_command(new checkfunc_cmd(socket_fd),rc); + + bool ret=dynamic_cast(rc.get_result())->get_data(); + + BOOST_CHECK(ret); + } + } +} + + +BOOST_AUTO_TEST_SUITE_END()