Prepare libt2n 0.7 release
[libt2n] / test / reentrant.cpp
index c60baae..204e741 100644 (file)
@@ -1,9 +1,24 @@
-/***************************************************************************
- *   Copyright (C) 2004 by Intra2net AG                                    *
- *   info@intra2net.com                                                    *
- *                                                                         *
- ***************************************************************************/
+/*
+Copyright (C) 2004 by Intra2net AG
 
+The software in this package is distributed under the GNU General
+Public License version 2 (with a special exception described below).
+
+A copy of GNU General Public License (GPL) is included in this distribution,
+in the file COPYING.GPL.
+
+As a special exception, if other files instantiate templates or use macros
+or inline functions from this file, or you compile this file and link it
+with other works to produce a work based on this file, this file
+does not by itself cause the resulting work to be covered
+by the GNU General Public License.
+
+However the source code for this file must still be made available
+in accordance with section (3) of the GNU General Public License.
+
+This exception does not invalidate any other reasons why a work based
+on this file might be covered by the GNU General Public License.
+*/
 #include <sys/types.h>
 #include <unistd.h>
 #include <errno.h>
@@ -15,9 +30,8 @@
 #include <sstream>
 #include <stdexcept>
 
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-#include <cppunit/extensions/HelperMacros.h>
+#define BOOST_TEST_DYN_LINK
+#include <boost/test/unit_test.hpp>
 
 #include <boost/archive/binary_oarchive.hpp>
 #include <boost/archive/binary_iarchive.hpp>
 #include <command_server.hxx>
 
 using namespace std;
-using namespace CppUnit;
 using namespace libt2n;
 
-namespace
+namespace reentrant
 {
 
 command_server *global_server = NULL;
@@ -124,111 +137,99 @@ class testfunc_cmd : public libt2n::command
 
 #include <boost/serialization/export.hpp>
 
-BOOST_CLASS_EXPORT(testfunc_cmd)
-BOOST_CLASS_EXPORT(testfunc_res)
-
-class test_reentrant : public TestFixture
-{
-    CPPUNIT_TEST_SUITE(test_reentrant);
-
-    CPPUNIT_TEST(ReentrantServer);
-
-    CPPUNIT_TEST_SUITE_END();
-
-    public:
+BOOST_CLASS_EXPORT(reentrant::testfunc_cmd)
+BOOST_CLASS_EXPORT(reentrant::testfunc_res)
 
-    void setUp()
-    { }
+using namespace reentrant;
 
-    void tearDown()
-    { }
+BOOST_AUTO_TEST_SUITE(test_reentrant)
 
-    void ReentrantServer()
+BOOST_AUTO_TEST_CASE(ReentrantServer)
+{
+    switch(fork())
     {
-        switch(fork())
+        case -1:
         {
-            case -1:
-            {
-                CPPUNIT_FAIL("fork error");
-                break;
-            }
-            case 0:
-            // child
-            {
-                // wait till server is up
-                sleep(2);
+            BOOST_FAIL("fork error");
+            break;
+        }
+        case 0:
+        // child
+        {
+            // wait till server is up
+            sleep(2);
 
-                // hammer the server
-                for (int i = 0; i < fork_count; i++)
-                    fork();
+            // hammer the server
+            for (int i = 0; i < fork_count; i++)
+                fork();
 
-                try
+            try
+            {
+                for (int i=0; i < requests_per_child; i++)
                 {
-                    for (int i=0; i < requests_per_child; i++)
+                    socket_client_connection sc("./socket");
+                    // sc.set_logging(&cerr,debug);
+                    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)
                     {
-                        socket_client_connection sc("./socket");
-                        // sc.set_logging(&cerr,debug);
-                        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 (" << rc.get_result() << ")\n";
-                        }
+                        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 (" << rc.get_result() << ")\n";
                     }
-                } catch (exception &e)
-                {
-                    cerr << "caught exception: " << e.what() << endl;
                 }
-
-                // don't call atexit and stuff
-                _exit(0);
+            } catch (exception &e)
+            {
+                cerr << "caught exception: " << e.what() << endl;
+            } catch(...)
+            {
+                std::cerr << "exception in child. ignoring\n";
             }
 
-            default:
-            // parent
-            {
-                // don't kill us on broken pipe
-                signal(SIGPIPE, SIG_IGN);
+            // don't call atexit and stuff
+            _exit(0);
+        }
 
-                socket_server ss("./socket");
-                command_server cs(ss);
+        default:
+        // parent
+        {
+            // don't kill us on broken pipe
+            signal(SIGPIPE, SIG_IGN);
 
-                global_server=&cs;
+            socket_server ss("./socket");
+            command_server cs(ss);
 
-                // Wait until all requests have successed
-                int safety_check = 0;
-                while (seen_client_requests < all_requests)
-                {
-                    ++safety_check;
-                    if (safety_check > 10) {
-                        std::cerr << "reached safety check, aborting.\n";
-                        break;
-                    }
+            global_server=&cs;
 
-                    long long maxtime=1000000;
-                    while(maxtime > 0)
-                        cs.handle(maxtime,&maxtime);
+            // Wait until all requests have successed
+            int safety_check = 0;
+            while (seen_client_requests < all_requests)
+            {
+                ++safety_check;
+                if (safety_check > 10) {
+                    std::cerr << "reached safety check, aborting.\n";
+                    break;
                 }
 
-                global_server = NULL;
+                long long maxtime=1000000;
+                while(maxtime > 0)
+                    cs.handle(maxtime,&maxtime);
             }
 
-            // we are still alive, everything is ok
-            CPPUNIT_ASSERT_EQUAL(all_requests, seen_client_requests);
+            global_server = NULL;
         }
-    }
-
-};
 
+        // we are still alive, everything is ok
+        BOOST_CHECK_EQUAL(all_requests, seen_client_requests);
+    }
+}
 
-CPPUNIT_TEST_SUITE_REGISTRATION(test_reentrant);
+BOOST_AUTO_TEST_SUITE_END()