2 #include "basesTest.hxx"
7 using namespace YACS::BASES;
12 #include "YacsTrace.hxx"
15 Semaphore BasesTest::_s1;
16 Semaphore BasesTest::_s2;
17 Condition BasesTest::_cond;
18 ostringstream BasesTest::_glob;
19 int BasesTest::_var=7;
21 const int BasesTest::THREAD_NUM=5;
23 const int BasesTest::LOOPS=4;
25 const int BasesTest::MAX_RESOURCE=7;
27 int BasesTest::_value=0;
28 int BasesTest::_waiting=0;
29 int BasesTest::_resources=BasesTest::MAX_RESOURCE;
30 int BasesTest::_ownedResources[THREAD_NUM];
32 void *BasesTest::th1_1(void *st)
34 char myName=*((char *) st);
36 _glob<< myName << _var;
42 void *BasesTest::th1_2(void *st)
44 char myName=*((char *) st);
46 _glob<< myName << _var;
50 void *BasesTest::th1_3(void *st)
52 char myName=*((char *) st);
53 _glob<< myName << _var++;
57 void *BasesTest::th2_1(void *)
61 for (i=0; i<LOOPS; ++i)
69 Thread::sleep(100000);
73 void *BasesTest::myFunc(void *n)
77 for (int i=3; i>0; i--)
79 DEBTRACE("thread " << id << " asks for " << i << " resources");
81 DEBTRACE("thread " << id << " has got " << i << " resources");
82 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
84 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
85 DEBTRACE("thread " << id << " frees " << i << " resources");
86 free_resources(id, i);
90 void BasesTest::get_resources(int id, int amount)
93 while (_resources < amount)
96 _cond.wait(_m); // _m is unlocked during the wait
99 _ownedResources[id] = amount;
103 void BasesTest::free_resources(int id, int amount)
106 _resources += amount;
107 _ownedResources[id] = 0;
116 int BasesTest::count_resources()
122 resources = _resources;
123 for (int i=0; i<THREAD_NUM; i++)
125 totOwned += _ownedResources[i];
129 int total = resources + totOwned;
130 DEBTRACE("resources:: owned by threads: " << totOwned << " remaining: " << resources << " total: " << total);
134 void BasesTest::setUp()
138 void BasesTest::tearDown()
143 void BasesTest::test1()
145 char t1Name='A'; char t2Name='B'; char t3Name='C';
146 Thread t1(th1_1,&t1Name);
147 Thread t2(th1_2,&t2Name);
148 Thread t3(th1_3,&t3Name);
152 CPPUNIT_ASSERT( _glob.str() == "C7A8B10" );
155 void BasesTest::test2()
158 Thread **ths=new Thread *[THREAD_NUM];
159 for (i=0; i<THREAD_NUM; ++i)
161 ths[i]=new Thread(th2_1,0);
163 for (i=0; i<THREAD_NUM; ++i)
169 CPPUNIT_ASSERT( _value == THREAD_NUM*LOOPS );
172 void BasesTest::test3()
176 Thread **ths=new Thread *[THREAD_NUM];
179 for (i=0; i<THREAD_NUM; i++)
182 _ownedResources[i] = 0;
185 for (i=0; i<THREAD_NUM; i++)
187 ths[i] = new Thread(myFunc, &id[i]);
188 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
191 for (i=0; i<THREAD_NUM; i++)
195 DEBTRACE("thread " << id[i] << " is finished");
196 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
200 typedef double (*FctPt)(double);
202 void BasesTest::testDL()
204 DynLibLoader *loader=new DynLibLoader(".libs/libYACSDLTest");
205 void *symb=loader->getHandleOnSymbolWithName("myYacsFct");
206 FctPt f=(FctPt) symb;
208 CPPUNIT_ASSERT_DOUBLES_EQUAL( 20.23, res, 1e-13);
210 CPPUNIT_ASSERT_DOUBLES_EQUAL( 37.03, res, 1e-13);