Go to the documentation of this file.00001 
00008 
00009 
00010 
00011 
00012 #include <iostream>
00013 #include <ecl/config/ecl.hpp>
00014 #if defined(ECL_IS_POSIX)
00015 
00016 
00017 
00018 
00019 
00020 #include <gtest/gtest.h>
00021 #include <ecl/config/ecl.hpp>
00022 #include <ecl/exceptions/standard_exception.hpp>
00023 #include <ecl/utilities/function_objects.hpp>
00024 #include <ecl/utilities/references.hpp>
00025 #include "../../include/ecl/threads/thread.hpp"
00026 
00027 
00028 
00029 
00034 
00035 
00036 
00037 
00038 using ecl::StandardException;
00039 using ecl::Thread;
00040 using ecl::generateFunctionObject;
00041 using ecl::ref;
00042 
00043 
00044 
00045 
00046 
00047 
00048 static const bool output = false;
00049 
00050 
00051 
00052 
00053 
00054 
00055 namespace ecl {
00056 namespace threads {
00057 namespace tests {
00058 
00059 
00060 
00061 
00062 
00063 class ThreadMemberFunctions {
00064 public:
00065         void f() {
00066                 if ( output ) {
00067                         std::cout << "A::f()" << std::endl;
00068                 }
00069         }
00070         void g(const int &i) {
00071                 if ( output ) {
00072                         std::cout << "A::g(" << i << ")" << std::endl;
00073                 }
00074         }
00075 };
00076 
00077 class NullaryFunction {
00078 public:
00079         NullaryFunction() : i(0) {};
00080         typedef void result_type;
00081         void operator()() {
00082                 for (int j = 0; j < 3; ++j ) {
00083                         if ( output ) {
00084                                 std::cout << "  Nullary Function Object: " << i << std::endl;
00085                         }
00086                         sleep(1);
00087                         ++i;
00088                 }
00089                 if ( output ) {
00090                         std::cout << "  Nullary Function Object: finished." << std::endl;
00091                 }
00092         }
00093         int i;
00094 };
00095 
00096 
00097 
00098 
00099 
00100 void d() {
00101         for (int i = 0; i < 5; ++i ) {
00102                 sleep(1);
00103                 if ( output ) {
00104                         std::cout << "  d(): " << i << std::endl;
00105                 }
00106         }
00107         if ( output ) {
00108                 std::cout << "  d(): finished" << std::endl;
00109         }
00110 }
00111 void d_cb() {
00112         if ( output ) {
00113                 std::cout << "  d(): callback function" << std::endl;
00114         }
00115 }
00116 
00117 void f() {
00118         for (int i = 0; i < 3; ++i) {
00119                 if ( output ) {
00120                         std::cout << "f(): " << i << std::endl;
00121                 }
00122         }
00123 }
00124 
00125 void g(const int &i) {
00126         for (int j = 0; j < 3; ++j) {
00127                 if ( output ) {
00128                         std::cout << "g(" << i << ")" << std::endl;
00129                 }
00130         }
00131 }
00132 
00133 void deconstructThread() {
00134         Thread thread_deconstruct(d);
00135 }
00136 
00137 } 
00138 } 
00139 } 
00140 
00141 
00142 
00143 
00144 
00145 using namespace ecl::threads::tests;
00146 
00147 
00148 
00149 
00150 
00155 
00156 
00157 
00158 
00159 TEST(ThreadTests,threadFunctionTypes) {
00160     ThreadMemberFunctions a;
00161     Thread thread_f1(f);
00162     Thread thread_f2(&ThreadMemberFunctions::f,a);
00163     Thread thread_f3(generateFunctionObject(f));
00164     Thread thread_f4(generateFunctionObject(g,1));
00165     Thread thread_f5(generateFunctionObject(&ThreadMemberFunctions::f,a));
00166     Thread thread_f6(generateFunctionObject(&ThreadMemberFunctions::g,a,2));
00167     thread_f1.join();
00168     thread_f2.join();
00169     thread_f3.join();
00170     thread_f4.join();
00171     thread_f5.join();
00172     thread_f6.join();
00173     SUCCEED();
00174 }
00175 
00176 TEST(ThreadTests,cancelThread) {
00177         Thread thread(generateFunctionObject(d));
00178         sleep(3);
00179         EXPECT_TRUE(thread.isRunning());
00180 
00181         thread.cancel();
00182         EXPECT_FALSE(thread.isRunning());
00183     thread.join();
00184         EXPECT_FALSE(thread.isRunning());
00185 }
00186 
00187 TEST(ThreadTests,deconstruct) {
00188     deconstructThread();
00189     sleep(6);
00190     SUCCEED();
00191 }
00192 
00193 TEST(ThreadTests,nullaryFunctionObjects) {
00194     NullaryFunction function_object;
00195     Thread thread_f8(function_object); 
00196     sleep(4);
00197     Thread thread_f9(ref(function_object));
00198         sleep(4);
00199     thread_f8.join();
00200     thread_f9.join();
00201         SUCCEED();
00202 }
00203 
00204 TEST(ThreadTests,stackSize) {
00205     Thread thread(f,ecl::DefaultPriority,1024*1024);
00206     thread.join();
00207     SUCCEED();
00208 }
00209 
00210 TEST(ThreadTests,delayedStart) {
00211 
00212         NullaryFunction function_object;
00213         ThreadMemberFunctions a;
00214         Thread thread1, thread2, thread3, thread4;
00215         thread1.start(f);
00216         thread2.start(function_object);
00217         thread3.start(&ThreadMemberFunctions::f,a);
00218         thread4.start(generateFunctionObject(&ThreadMemberFunctions::g,a,2));
00219         thread1.join();
00220         thread2.join();
00221         thread3.join();
00222         thread4.join();
00223     SUCCEED();
00224 }
00225 
00226 
00227 
00228 
00229 
00230 int main(int argc, char **argv) {
00231 
00232     testing::InitGoogleTest(&argc,argv);
00233     return RUN_ALL_TESTS();
00234 }
00235 
00236 #else
00237 
00238 
00239 
00240 
00241 
00242 int main(int argc, char **argv) {
00243 
00244         std::cout << "Currently not supported on your platform." << std::endl;
00245 }
00246 
00247 #endif 
00248