1 /***************************************************************************
2 * Copyright (C) 2004 by Intra2net AG *
5 ***************************************************************************/
19 #include <boost/bind.hpp>
21 #include <cppunit/extensions/TestFactoryRegistry.h>
22 #include <cppunit/ui/text/TestRunner.h>
23 #include <cppunit/extensions/HelperMacros.h>
25 #include <socket_client.hxx>
26 #include <socket_server.hxx>
29 using namespace libt2n;
30 using namespace CppUnit;
32 class test_callback : public TestFixture
34 CPPUNIT_TEST_SUITE(test_callback);
36 CPPUNIT_TEST(ServerNewConnCallback);
37 CPPUNIT_TEST(ServerConnClosedCallback);
38 CPPUNIT_TEST(ServerConnDeletedCallback);
39 CPPUNIT_TEST(ServerCallbackOrder);
40 CPPUNIT_TEST(ClientConnClosedCallback);
41 CPPUNIT_TEST(ClientConnDeletedCallback);
43 CPPUNIT_TEST_SUITE_END();
45 std::vector<bool> callback_done;
53 callback_done.resize(__events_end);
58 callback_done.clear();
60 // make sure the server-child is dead before the next test runs
61 kill(child_pid,SIGKILL);
65 void callback_func(callback_event_type ev, int conn_id)
67 // we don't care for the conn_id, we just mark the callback as done
68 if (callback_done[ev])
69 throw runtime_error("callback already done for this event");
71 callback_done[ev]=true;
74 void ServerNewConnCallback()
76 switch(child_pid=fork())
80 CPPUNIT_FAIL("fork error");
87 // wait till server is up
91 socket_client_connection sc("./socket");
96 sc.fill_buffer(500000);
99 // close the connection
102 // don't call atexit and stuff
109 socket_server ss("./socket");
111 ss.add_callback(new_connection,bind(&test_callback::callback_func, boost::ref(*this), new_connection, _1));
114 for (int i=0; i < 3; i++)
116 ss.fill_buffer(1000000);
120 if(ss.get_packet(data,cid))
122 server_connection* con=ss.get_connection(cid);
126 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[new_connection]));
127 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_closed]));
128 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_deleted]));
133 void ServerConnClosedCallback()
135 switch(child_pid=fork())
139 CPPUNIT_FAIL("fork error");
146 // wait till server is up
150 socket_client_connection sc("./socket");
155 sc.fill_buffer(500000);
158 // close the connection
161 // don't call atexit and stuff
168 socket_server ss("./socket");
170 ss.add_callback(connection_closed,bind(&test_callback::callback_func, boost::ref(*this), connection_closed, _1));
173 for (int i=0; i < 3; i++)
175 ss.fill_buffer(1000000);
179 if(ss.get_packet(data,cid))
181 server_connection* con=ss.get_connection(cid);
185 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[new_connection]));
186 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_closed]));
187 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_deleted]));
192 void ServerConnDeletedCallback()
194 switch(child_pid=fork())
198 CPPUNIT_FAIL("fork error");
205 // wait till server is up
209 socket_client_connection sc("./socket");
214 sc.fill_buffer(500000);
217 // close the connection
220 // don't call atexit and stuff
227 socket_server ss("./socket");
229 ss.add_callback(connection_deleted,bind(&test_callback::callback_func, boost::ref(*this), connection_deleted, _1));
232 for (int i=0; i < 3; i++)
234 ss.fill_buffer(1000000);
238 if(ss.get_packet(data,cid))
240 server_connection* con=ss.get_connection(cid);
247 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[new_connection]));
248 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_closed]));
249 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_deleted]));
254 void ServerCallbackOrder()
256 switch(child_pid=fork())
260 CPPUNIT_FAIL("fork error");
267 // wait till server is up
271 socket_client_connection sc("./socket");
276 sc.fill_buffer(500000);
281 // close the connection
284 // don't call atexit and stuff
291 socket_server ss("./socket");
293 ss.add_callback(connection_closed,bind(&test_callback::callback_func, boost::ref(*this), connection_closed, _1));
294 ss.add_callback(connection_deleted,bind(&test_callback::callback_func, boost::ref(*this), connection_deleted, _1));
298 for (int i=0; i < 5; i++)
300 ss.fill_buffer(500000);
304 if(!got_1 && ss.get_packet(data,cid))
306 server_connection* con=ss.get_connection(cid);
309 // don't call get_packet anymore
315 CPPUNIT_ASSERT_EQUAL_MESSAGE("closed done",true,static_cast<bool>(callback_done[connection_closed]));
316 CPPUNIT_ASSERT_EQUAL_MESSAGE("not deleted yet",false,static_cast<bool>(callback_done[connection_deleted]));
318 for (int i=0; i < 4; i++)
320 ss.fill_buffer(500000);
324 ss.get_packet(data,cid);
329 CPPUNIT_ASSERT_EQUAL_MESSAGE("closed done (2)",true,static_cast<bool>(callback_done[connection_closed]));
330 CPPUNIT_ASSERT_EQUAL_MESSAGE("deleted done",true,static_cast<bool>(callback_done[connection_deleted]));
335 void ClientConnClosedCallback()
337 switch(child_pid=fork())
341 CPPUNIT_FAIL("fork error");
347 socket_server ss("./socket");
350 for (int i=0; i < 3; i++)
352 ss.fill_buffer(1000000);
356 if(ss.get_packet(data,cid))
359 // don't call atexit and stuff
367 // wait till server is up
370 socket_client_connection sc("./socket");
372 sc.add_callback(connection_closed,bind(&test_callback::callback_func, boost::ref(*this), connection_closed, 0));
377 sc.fill_buffer(500000);
380 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[new_connection]));
381 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_closed]));
382 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_deleted]));
387 void ClientConnDeletedCallback()
389 switch(child_pid=fork())
393 CPPUNIT_FAIL("fork error");
399 socket_server ss("./socket");
402 for (int i=0; i < 3; i++)
404 ss.fill_buffer(1000000);
408 if(ss.get_packet(data,cid))
411 // don't call atexit and stuff
419 // wait till server is up
423 socket_client_connection sc("./socket");
425 sc.add_callback(connection_deleted,bind(&test_callback::callback_func, boost::ref(*this), connection_deleted, 0));
430 sc.fill_buffer(500000);
434 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[new_connection]));
435 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_closed]));
436 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_deleted]));
442 CPPUNIT_TEST_SUITE_REGISTRATION(test_callback);