Fix Metaproxy stops logging after check config failed MP-590
[metaproxy-moved-to-github.git] / src / test_boost_threads.cpp
index 8a26cab..bb51287 100644 (file)
+/* This file is part of Metaproxy.
+   Copyright (C) Index Data
 
+Metaproxy is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#include "config.hpp"
 #include <boost/thread/mutex.hpp>
 #include <boost/thread/thread.hpp>
-#include <iostream>
 
-boost::mutex io_mutex; // The iostreams are not guaranteed to be thread-safe!
+#define BOOST_AUTO_TEST_MAIN
+#define BOOST_TEST_DYN_LINK
+#include <boost/test/auto_unit_test.hpp>
+
+#include <list>
+#include <iostream>
 
 class counter
 {
    public:
       counter() : count(0) { }
-      
-      int increment() {
-         boost::mutex::scoped_lock scoped_lock(mutex);
-         return ++count;
-      }
-      
-   private:
-      boost::mutex mutex;
-      int count;
+
+    int increment() {
+        boost::mutex::scoped_lock scoped_lock(mutex);
+        return ++count;
+    }
+
+private:
+    boost::mutex mutex;
+    int count;
 };
 
+
 counter c;
 
-void change_count()
+class worker {
+public:
+    void operator() (void) {
+        c.increment();
+    }
+};
+
+#define USE_GROUP 1
+
+
+BOOST_AUTO_TEST_CASE( thread_group )
 {
-   int i = c.increment();
-   boost::mutex::scoped_lock scoped_lock(io_mutex);
-   std::cout << "count == " << i << std::endl;
-}
+    try
+    {
+        const int num_threads = 4;
+        boost::thread_group thrds;
 
+        for (int i=0; i < num_threads; ++i)
+        {
+            worker w;
+            thrds.add_thread(new boost::thread(w));
+        }
+        thrds.join_all();
+    }
+    catch (...)
+    {
+        BOOST_CHECK(false);
+    }
+    BOOST_CHECK(c.increment() == 5);
+}
 
 
-int main(int, char*[])
+BOOST_AUTO_TEST_CASE( thread_list )
 {
-   try 
-   {
-      const int num_threads = 4;
-      boost::thread_group thrds;
-      for (int i=0; i < num_threads; ++i)
-         thrds.create_thread(&change_count);
-      
-      thrds.join_all();
-      
-   }
-   catch (std::exception &e) 
-   {
-      std::cout << e.what() << "\n";
-      exit(1);
-   }
-   exit(0);
+    try
+    {
+        const int num_threads = 4;
+        std::list<boost::thread *> thread_list;
+
+        for (int i=0; i < num_threads; ++i)
+        {
+            worker w;
+            thread_list.push_back(new boost::thread(w));
+        }
+        std::list<boost::thread *>::iterator it;
+        for (it = thread_list.begin(); it != thread_list.end(); it++)
+        {
+            (*it)->join();
+            delete *it;
+        }
+
+    }
+    catch (...)
+    {
+        BOOST_CHECK(false);
+    }
+    BOOST_CHECK(c.increment() == 10);
 }
 
+
+
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab
  */
+