libt2n: (tomj) fixed call of virtual function close() from destructor, fixed return...
[libt2n] / test / reentrant.cpp
index bb9420a..7187ffe 100644 (file)
@@ -38,7 +38,7 @@ using namespace libt2n;
 namespace
 {
 
-command_server *global_server;
+command_server *global_server = NULL;
 
 string testfunc(const string& str)
 {
@@ -46,7 +46,8 @@ string testfunc(const string& str)
     ret=str+", testfunc() was here";
 
     // call handle, eventually reentrant
-    global_server->handle(1000);
+    if (global_server)
+        global_server->handle(10000);
 
     return ret;
 }
@@ -123,8 +124,6 @@ class test_reentrant : public TestFixture
 
     CPPUNIT_TEST_SUITE_END();
 
-    pid_t child_pid;
-
     public:
 
     void setUp()
@@ -135,7 +134,7 @@ class test_reentrant : public TestFixture
 
     void ReentrantServer()
     {
-        switch(child_pid=fork())
+        switch(fork())
         {
             case -1:
             {
@@ -146,24 +145,38 @@ class test_reentrant : public TestFixture
             // child
             {
                 // wait till server is up
-                sleep(1);
+                sleep(3);
 
                 // we want 8 identical childs hammering the server
                 fork();
                 fork();
                 fork();
 
-                for (int i=0; i < 100; i++)
+                try
                 {
-                    socket_client_connection sc("./socket");
-                    command_client cc(&sc);
-
-                    result_container rc;
-                    cc.send_command(new testfunc_cmd("hello"),rc);
-
-                    string ret=dynamic_cast<testfunc_res*>(rc.get_result())->get_data();
-
-                    CPPUNIT_ASSERT_EQUAL(string("hello, testfunc() was here"),ret);
+                    for (int i=0; i < 100; i++)
+                    {
+                        socket_client_connection sc("./socket");
+                        command_client cc(&sc);
+
+                        result_container rc;
+                        cc.send_command(new testfunc_cmd("hello"),rc);
+
+                        testfunc_res *res = dynamic_cast<testfunc_res*>(rc.get_result());
+                        if (res)
+                        {
+                            string ret = res->get_data();
+                            if (ret != "hello, testfunc() was here")
+                                std::cout << "ERROR reentrant server testfunc_res failed, res: " << ret << "\n";
+                        }
+                        else
+                        {
+                            std::cout << "ERROR result from reentrant server empty\n";
+                        }
+                    }
+                } catch (exception &e)
+                {
+                    cerr << "caught exception: " << e.what() << endl;
                 }
 
                 // don't call atexit and stuff
@@ -173,15 +186,30 @@ class test_reentrant : public TestFixture
             default:
             // parent
             {
+                // don't kill us on broken pipe
+                signal(SIGPIPE, SIG_IGN);
+
                 socket_server ss("./socket");
                 command_server cs(ss);
 
                 global_server=&cs;
 
                 // max 10 sec
-                long long maxtime=5000000;
+                long long maxtime=1000000;
                 while(maxtime > 0)
                     cs.handle(maxtime,&maxtime);
+
+                // max 10 sec
+                maxtime=1000000;
+                while(maxtime > 0)
+                    cs.handle(maxtime,&maxtime);
+
+                // max 10 sec
+                maxtime=1000000;
+                while(maxtime > 0)
+                    cs.handle(maxtime,&maxtime);
+
+                global_server = NULL;
             }
 
             // we are still alive, everything is ok