2 Copyright (C) 2004 by Intra2net AG
4 The software in this package is distributed under the GNU General
5 Public License version 2 (with a special exception described below).
7 A copy of GNU General Public License (GPL) is included in this distribution,
8 in the file COPYING.GPL.
10 As a special exception, if other files instantiate templates or use macros
11 or inline functions from this file, or you compile this file and link it
12 with other works to produce a work based on this file, this file
13 does not by itself cause the resulting work to be covered
14 by the GNU General Public License.
16 However the source code for this file must still be made available
17 in accordance with section (3) of the GNU General Public License.
19 This exception does not invalidate any other reasons why a work based
20 on this file might be covered by the GNU General Public License.
22 #include <sys/types.h>
33 #define BOOST_TEST_DYN_LINK
34 #include <boost/test/unit_test.hpp>
36 #include <boost/archive/binary_oarchive.hpp>
37 #include <boost/archive/binary_iarchive.hpp>
38 #include <boost/archive/xml_oarchive.hpp>
39 #include <boost/archive/xml_iarchive.hpp>
40 #include <boost/serialization/serialization.hpp>
41 #include <boost/serialization/export.hpp>
43 #include <container.hxx>
44 #include <socket_client.hxx>
45 #include <socket_server.hxx>
46 #include <command_client.hxx>
47 #include <command_server.hxx>
49 #include "test_fixtures.hxx"
52 using namespace libt2n;
54 string testfunc4(const string& str)
57 throw libt2n::t2n_runtime_error("throw me around");
59 ret+=", testfunc() was here";
63 class testfunc4_res : public libt2n::result
68 friend class boost::serialization::access;
69 template<class Archive>
70 void serialize(Archive & ar, const unsigned int version)
72 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(libt2n::result);
73 ar & BOOST_SERIALIZATION_NVP(res);
80 testfunc4_res(const string& str)
91 class cmd_group_a : public command
94 friend class boost::serialization::access;
95 template<class Archive>
96 void serialize(Archive & ar, const unsigned int version)
98 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(libt2n::command);
102 class cmd_group_b : public command
105 friend class boost::serialization::access;
106 template<class Archive>
107 void serialize(Archive & ar, const unsigned int version)
109 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(libt2n::command);
113 class testfunc4a_cmd : public cmd_group_a
118 friend class boost::serialization::access;
119 template<class Archive>
120 void serialize(Archive & ar, const unsigned int version)
122 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(cmd_group_a);
123 ar & BOOST_SERIALIZATION_NVP(param);
130 testfunc4a_cmd(const string& str)
135 libt2n::result* operator()()
137 return new testfunc4_res(testfunc4(param));
141 class testfunc4b_cmd : public cmd_group_b
146 friend class boost::serialization::access;
147 template<class Archive>
148 void serialize(Archive & ar, const unsigned int version)
150 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(cmd_group_b);
151 ar & BOOST_SERIALIZATION_NVP(param);
158 testfunc4b_cmd(const string& str)
163 libt2n::result* operator()()
165 return new testfunc4_res(testfunc4(param));
170 BOOST_CLASS_EXPORT(testfunc4_res)
171 BOOST_CLASS_EXPORT(cmd_group_a)
172 BOOST_CLASS_EXPORT(cmd_group_b)
173 BOOST_CLASS_EXPORT(testfunc4a_cmd)
174 BOOST_CLASS_EXPORT(testfunc4b_cmd)
177 BOOST_FIXTURE_TEST_SUITE(test_cmdgroup, KillChildOnShutdownFixture)
179 BOOST_AUTO_TEST_CASE(GroupOk)
181 switch(child_pid=fork())
185 BOOST_FAIL("fork error");
193 socket_server ss("./socket");
194 group_command_server<cmd_group_a> cs(ss);
197 for (int i=0; i < 10; i++)
201 std::cerr << "exception in child. ignoring\n";
204 // don't call atexit and stuff
211 // wait till server is up
213 socket_client_connection sc("./socket");
214 command_client cc(&sc);
217 cc.send_command(new testfunc4a_cmd("hello"),rc);
219 string ret=dynamic_cast<testfunc4_res*>(rc.get_result())->get_data();
221 BOOST_CHECK_EQUAL(string("hello, testfunc() was here"),ret);
226 BOOST_AUTO_TEST_CASE(WrongGroup)
228 switch(child_pid=fork())
232 BOOST_FAIL("fork error");
240 socket_server ss("./socket");
241 group_command_server<cmd_group_b> cs(ss);
244 for (int i=0; i < 10; i++)
248 std::cerr << "exception in child. ignoring\n";
251 // don't call atexit and stuff
258 // wait till server is up
260 socket_client_connection sc("./socket");
261 command_client cc(&sc);
264 cc.send_command(new testfunc4a_cmd("hello"),rc);
270 ret=dynamic_cast<testfunc4_res*>(rc.get_result())->get_data();
272 catch(t2n_command_error &e)
275 string expected_what="illegal command of type ";
277 BOOST_CHECK_EQUAL(expected_what,ret.substr(0,expected_what.size()));
282 BOOST_AUTO_TEST_SUITE_END()