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;
51 callback_done.resize(__events_end);
56 callback_done.clear();
59 void callback_func(callback_event_type ev, int conn_id)
61 // we don't care for the conn_id, we just mark the callback as done
62 if (callback_done[ev])
63 throw runtime_error("callback already done for this event");
65 callback_done[ev]=true;
68 void ServerNewConnCallback()
76 CPPUNIT_FAIL("fork error");
83 // wait till server is up
87 socket_client_connection sc("./socket");
92 sc.fill_buffer(500000);
95 // close the connection
98 // don't call atexit and stuff
105 socket_server ss("./socket");
107 ss.add_callback(new_connection,bind(&test_callback::callback_func, boost::ref(*this), new_connection, _1));
110 for (int i=0; i < 3; i++)
112 ss.fill_buffer(1000000);
116 if(ss.get_packet(data,cid))
118 server_connection* con=ss.get_connection(cid);
122 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[new_connection]));
123 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_closed]));
124 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_deleted]));
129 void ServerConnClosedCallback()
137 CPPUNIT_FAIL("fork error");
144 // wait till server is up
148 socket_client_connection sc("./socket");
153 sc.fill_buffer(500000);
156 // close the connection
159 // don't call atexit and stuff
166 socket_server ss("./socket");
168 ss.add_callback(connection_closed,bind(&test_callback::callback_func, boost::ref(*this), connection_closed, _1));
171 for (int i=0; i < 3; i++)
173 ss.fill_buffer(1000000);
177 if(ss.get_packet(data,cid))
179 server_connection* con=ss.get_connection(cid);
183 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[new_connection]));
184 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_closed]));
185 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_deleted]));
190 void ServerConnDeletedCallback()
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()
262 CPPUNIT_FAIL("fork error");
269 // wait till server is up
273 socket_client_connection sc("./socket");
278 sc.fill_buffer(500000);
283 // close the connection
286 // don't call atexit and stuff
293 socket_server ss("./socket");
295 ss.add_callback(connection_closed,bind(&test_callback::callback_func, boost::ref(*this), connection_closed, _1));
296 ss.add_callback(connection_deleted,bind(&test_callback::callback_func, boost::ref(*this), connection_deleted, _1));
300 for (int i=0; i < 4; i++)
302 ss.fill_buffer(500000);
306 if(!got_1 && ss.get_packet(data,cid))
308 server_connection* con=ss.get_connection(cid);
311 // don't call get_packet anymore
317 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_closed]));
318 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_deleted]));
320 for (int i=0; i < 4; i++)
322 ss.fill_buffer(500000);
326 ss.get_packet(data,cid);
331 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_closed]));
332 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_deleted]));
337 void ClientConnClosedCallback()
345 CPPUNIT_FAIL("fork error");
351 socket_server ss("./socket");
354 for (int i=0; i < 3; i++)
356 ss.fill_buffer(1000000);
360 if(ss.get_packet(data,cid))
363 // don't call atexit and stuff
371 // wait till server is up
374 socket_client_connection sc("./socket");
376 sc.add_callback(connection_closed,bind(&test_callback::callback_func, boost::ref(*this), connection_closed, 0));
381 sc.fill_buffer(500000);
384 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[new_connection]));
385 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_closed]));
386 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_deleted]));
391 void ClientConnDeletedCallback()
399 CPPUNIT_FAIL("fork error");
405 socket_server ss("./socket");
408 for (int i=0; i < 3; i++)
410 ss.fill_buffer(1000000);
414 if(ss.get_packet(data,cid))
417 // don't call atexit and stuff
425 // wait till server is up
429 socket_client_connection sc("./socket");
431 sc.add_callback(connection_deleted,bind(&test_callback::callback_func, boost::ref(*this), connection_deleted, 0));
436 sc.fill_buffer(500000);
440 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[new_connection]));
441 CPPUNIT_ASSERT_EQUAL(false,static_cast<bool>(callback_done[connection_closed]));
442 CPPUNIT_ASSERT_EQUAL(true,static_cast<bool>(callback_done[connection_deleted]));
448 CPPUNIT_TEST_SUITE_REGISTRATION(test_callback);