Salome HOME
PR: merge from BR_DATACONV_PR tag "mergeto_trunk_25oct06"
[modules/yacs.git] / src / bases / Test / basesTest.cxx
1
2 #include "basesTest.hxx"
3
4 #include <sstream>
5
6 using namespace YACS::BASES;
7 using namespace YACS;
8 using namespace std;
9     
10 Mutex BasesTest::_m;
11 Semaphore BasesTest::_s1;
12 Semaphore BasesTest::_s2;
13 ostringstream BasesTest::_glob;
14 int BasesTest::_var=7;
15
16 const int BasesTest::THREAD_NUM=5;
17
18 const int BasesTest::LOOPS=4;
19
20 int BasesTest::_value=0;
21
22 void *BasesTest::th1_1(void *st)
23 {
24   char myName=*((char *) st);
25   _s1.wait();
26   _glob<< myName << _var;
27   _var+=2;
28   _s1.post();
29   _s2.post();
30 }
31
32 void *BasesTest::th1_2(void *st)
33 {
34   char myName=*((char *) st);
35   _s2.wait();
36   _glob<< myName << _var;
37   _s2.post();
38 }
39
40 void *BasesTest::th1_3(void *st)
41 {
42   char myName=*((char *) st);
43   _glob<< myName << _var++;
44   _s1.post();
45 }
46
47 void *BasesTest::th2_1(void *)
48 {
49   int i, tmp;
50   int rc = 0;      
51   for (i=0; i<LOOPS; ++i)
52     {
53       _m.lock();
54       tmp = _value;
55       tmp = tmp+1;
56       Thread::sleep(1000);
57       _value = tmp;
58       _m.unlock();
59       Thread::sleep(100000);
60     }
61 }
62
63
64 void BasesTest::setUp()
65 {
66 }
67
68 void BasesTest::tearDown()
69 {
70 }
71
72
73 void BasesTest::test1()
74 {
75   char t1Name='A'; char t2Name='B'; char t3Name='C';
76   Thread t1(th1_1,&t1Name);
77   Thread t2(th1_2,&t2Name);
78   Thread t3(th1_3,&t3Name);
79   t1.join();
80   t2.join();
81   t3.join();
82   CPPUNIT_ASSERT( _glob.str() == "C7A8B10" );
83 }
84
85 void BasesTest::test2()
86 {
87   int i;
88   Thread **ths=new Thread *[THREAD_NUM];
89   for (i=0; i<THREAD_NUM; ++i)
90     ths[i]=new Thread(th2_1,0);
91
92   for (i=0; i<THREAD_NUM; ++i)
93     {
94       ths[i]->join();
95       delete ths[i];
96     }
97   delete [] ths;
98   CPPUNIT_ASSERT( _value == THREAD_NUM*LOOPS );
99 }