X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=test%2Fcallback.cpp;h=9d4c7d1f791d2f5f000eb0900591501051fed6e7;hp=beb0c777db059f3dd9a054d8342e9eac1f04072e;hb=fe41e3c5d9c602adb0cbb8f996deb7a5e3eab57a;hpb=6cda58a6dad87ff6efe2277db2155be60edb8d48 diff --git a/test/callback.cpp b/test/callback.cpp index beb0c77..9d4c7d1 100644 --- a/test/callback.cpp +++ b/test/callback.cpp @@ -33,10 +33,12 @@ class test_callback : public TestFixture { CPPUNIT_TEST_SUITE(test_callback); - CPPUNIT_TEST(NewConnCallback); - CPPUNIT_TEST(ConnClosedCallback); - CPPUNIT_TEST(ConnDeletedCallback); - CPPUNIT_TEST(CallbackOrder); + CPPUNIT_TEST(ServerNewConnCallback); + CPPUNIT_TEST(ServerConnClosedCallback); + CPPUNIT_TEST(ServerConnDeletedCallback); + CPPUNIT_TEST(ServerCallbackOrder); + CPPUNIT_TEST(ClientConnClosedCallback); + CPPUNIT_TEST(ClientConnDeletedCallback); CPPUNIT_TEST_SUITE_END(); @@ -63,7 +65,7 @@ class test_callback : public TestFixture callback_done[ev]=true; } - void NewConnCallback() + void ServerNewConnCallback() { pid_t pid; @@ -124,7 +126,7 @@ class test_callback : public TestFixture } } - void ConnClosedCallback() + void ServerConnClosedCallback() { pid_t pid; @@ -185,7 +187,7 @@ class test_callback : public TestFixture } } - void ConnDeletedCallback() + void ServerConnDeletedCallback() { pid_t pid; @@ -249,7 +251,7 @@ class test_callback : public TestFixture } } - void CallbackOrder() + void ServerCallbackOrder() { pid_t pid; @@ -332,6 +334,115 @@ class test_callback : public TestFixture } } + void ClientConnClosedCallback() + { + pid_t pid; + + switch(pid=fork()) + { + case -1: + { + CPPUNIT_FAIL("fork error"); + break; + } + case 0: + // child + { + socket_server ss("./socket"); + + // max 3 sec + for (int i=0; i < 3; i++) + { + ss.fill_buffer(1000000); + + string data; + unsigned int cid; + if(ss.get_packet(data,cid)) + break; + } + // don't call atexit and stuff + _exit(0); + } + + default: + // parent + { + string data; + // wait till server is up + sleep(1); + + socket_client_connection sc("./socket"); + + sc.add_callback(connection_closed,bind(&test_callback::callback_func, boost::ref(*this), connection_closed, 0)); + + sc.write("ABC"); + + // wait half a sec + sc.fill_buffer(500000); + sc.get_packet(data); + + CPPUNIT_ASSERT_EQUAL(false,static_cast(callback_done[new_connection])); + CPPUNIT_ASSERT_EQUAL(true,static_cast(callback_done[connection_closed])); + CPPUNIT_ASSERT_EQUAL(false,static_cast(callback_done[connection_deleted])); + } + } + } + + void ClientConnDeletedCallback() + { + pid_t pid; + + switch(pid=fork()) + { + case -1: + { + CPPUNIT_FAIL("fork error"); + break; + } + case 0: + // child + { + socket_server ss("./socket"); + + // max 3 sec + for (int i=0; i < 3; i++) + { + ss.fill_buffer(1000000); + + string data; + unsigned int cid; + if(ss.get_packet(data,cid)) + break; + } + // don't call atexit and stuff + _exit(0); + } + + default: + // parent + { + string data; + // wait till server is up + sleep(1); + + { + socket_client_connection sc("./socket"); + + sc.add_callback(connection_deleted,bind(&test_callback::callback_func, boost::ref(*this), connection_deleted, 0)); + + sc.write("ABC"); + + // wait half a sec + sc.fill_buffer(500000); + sc.get_packet(data); + } + + CPPUNIT_ASSERT_EQUAL(false,static_cast(callback_done[new_connection])); + CPPUNIT_ASSERT_EQUAL(false,static_cast(callback_done[connection_closed])); + CPPUNIT_ASSERT_EQUAL(true,static_cast(callback_done[connection_deleted])); + } + } + } }; CPPUNIT_TEST_SUITE_REGISTRATION(test_callback);