Salome HOME
PR: first version from Antony GEAY, with directory restructuration
[modules/yacs.git] / src / bases / Test / test1.cxx
1 #include "Mutex.hxx"
2 #include "Thread.hxx"
3 #include "Semaphore.hxx"
4 //
5 #include <cppunit/extensions/HelperMacros.h>
6 #include <cppunit/ui/text/TestRunner.h>
7 #include <sstream>
8 //
9
10 using namespace YACS::BASES;
11
12 class ThreadMechanismTest : public CppUnit::TestFixture
13 {
14   CPPUNIT_TEST_SUITE( ThreadMechanismTest );
15   CPPUNIT_TEST( test1 );
16   CPPUNIT_TEST( test2 );
17   CPPUNIT_TEST_SUITE_END();
18 public: 
19   void setUp();
20   void tearDown();
21   void test1();
22   void test2();
23 private:
24   static void *th1_1(void *);
25   static void *th1_2(void *);
26   static void *th1_3(void *);
27   static void *th2_1(void *);
28 private:
29   static int _var;
30   static std::ostringstream _glob;
31   static Mutex _m;
32   static Semaphore _s1;
33   static Semaphore _s2;
34   //
35   static const int THREAD_NUM;
36   static const int LOOPS;
37   static int _value;
38 };
39
40 Mutex ThreadMechanismTest::_m;
41
42 Semaphore ThreadMechanismTest::_s1;
43
44 Semaphore ThreadMechanismTest::_s2;
45
46 std::ostringstream ThreadMechanismTest::_glob;
47
48 int ThreadMechanismTest::_var=7;
49
50 const int ThreadMechanismTest::THREAD_NUM=5;
51
52 const int ThreadMechanismTest::LOOPS=4;
53
54 int ThreadMechanismTest::_value=0;
55
56 void ThreadMechanismTest::setUp()
57 {
58 }
59
60 void ThreadMechanismTest::tearDown()
61 {
62 }
63
64 void ThreadMechanismTest::test1()
65 {
66   char t1Name='A'; char t2Name='B'; char t3Name='C';
67   Thread t1(th1_1,&t1Name);
68   Thread t2(th1_2,&t2Name);
69   Thread t3(th1_3,&t3Name);
70   t1.join();
71   t2.join();
72   t3.join();
73   CPPUNIT_ASSERT( _glob.str() == "C7A8B10" );
74 }
75
76 void ThreadMechanismTest::test2()
77 {
78   int i;
79   Thread **ths=new Thread *[THREAD_NUM];
80   for (i=0; i<THREAD_NUM; ++i)
81     ths[i]=new Thread(th2_1,0);
82
83   for (i=0; i<THREAD_NUM; ++i)
84     {
85       ths[i]->join();
86       delete ths[i];
87     }
88   delete [] ths;
89   CPPUNIT_ASSERT( _value == THREAD_NUM*LOOPS );
90 }
91
92 void *ThreadMechanismTest::th1_1(void *st)
93 {
94   char myName=*((char *) st);
95   _s1.wait();
96   _glob<< myName << _var;
97   _var+=2;
98   _s1.post();
99   _s2.post();
100 }
101
102 void *ThreadMechanismTest::th1_2(void *st)
103 {
104   char myName=*((char *) st);
105   _s2.wait();
106   _glob<< myName << _var;
107   _s2.post();
108 }
109
110 void *ThreadMechanismTest::th1_3(void *st)
111 {
112   char myName=*((char *) st);
113   _glob<< myName << _var++;
114   _s1.post();
115 }
116
117 void *ThreadMechanismTest::th2_1(void *)
118 {
119   int i, tmp;
120   int rc = 0;      
121   for (i=0; i<LOOPS; ++i)
122     {
123       _m.lock();
124       tmp = _value;
125       tmp = tmp+1;
126       Thread::sleep(1000);
127       _value = tmp;
128       _m.unlock();
129       Thread::sleep(100000);
130     }
131 }
132
133 int main()
134 {
135   CppUnit::TextUi::TestRunner runner;
136   runner.addTest( ThreadMechanismTest::suite() );
137   runner.run();
138   return 0;
139 }