xref: /AOO41X/main/sal/qa/osl/condition/osl_Condition.cxx (revision 87d2adbc9cadf14644c3679b041b9226f7630199)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sal.hxx"
26 
27 //------------------------------------------------------------------------
28 // include files
29 //------------------------------------------------------------------------
30 #include <osl_Condition_Const.h>
31 
32 using namespace osl;
33 using namespace rtl;
34 
35 
36 //------------------------------------------------------------------------
37 // helper functions and classes
38 //------------------------------------------------------------------------
39 
40 /** print Boolean value.
41 */
printBool(sal_Bool bOk)42 inline void printBool( sal_Bool bOk )
43 {
44     t_print("#printBool# " );
45     ( sal_True == bOk ) ? t_print("TRUE!\n" ): t_print("FALSE!\n" );
46 }
47 
48 /** print a UNI_CODE String.
49 */
printUString(const::rtl::OUString & str)50 inline void printUString( const ::rtl::OUString & str )
51 {
52     rtl::OString aString;
53 
54     t_print("#printUString_u# " );
55     aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
56     t_print("%s\n", aString.getStr( ) );
57 }
58 
59 /** wait _nSec seconds.
60 */
thread_sleep(sal_Int32 _nSec)61 void thread_sleep( sal_Int32 _nSec )
62 {
63     /// print statement in thread process must use fflush() to force display.
64     t_print("# wait %d seconds. ", _nSec );
65     fflush( stdout );
66 
67 #ifdef WNT                               //Windows
68     Sleep( _nSec * 1000 );
69 #endif
70 #if ( defined UNX ) || ( defined OS2 )   //Unix
71     sleep( _nSec );
72 #endif
73     t_print("# done\n" );
74 }
75 
76 enum ConditionType
77 {
78     thread_type_set,
79     thread_type_reset,
80     thread_type_wait,
81     thread_type_check
82 };
83 
84 /** thread for testing Condition.
85  */
86 class ConditionThread : public Thread
87 {
88 public:
89     //get the Condition to operate
ConditionThread(::osl::Condition & Con,ConditionType tType)90     ConditionThread( ::osl::Condition& Con, ConditionType tType): m_MyCon( Con ), m_MyType( tType ) { }
91 
~ConditionThread()92     ~ConditionThread( )
93     {
94         // LLA: do not throw in DTors!
95         // LLA: CPPUNIT_ASSERT_MESSAGE( "#ConditionThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
96     }
97 protected:
98     ::osl::Condition& m_MyCon;
99     ConditionType m_MyType;
100 
run()101     void SAL_CALL run()
102     {
103         switch ( m_MyType )
104         {
105             case thread_type_wait:
106                 m_MyCon.wait(); break;
107             case thread_type_set:
108                 m_MyCon.set(); break;
109             case thread_type_reset:
110                 m_MyCon.reset(); break;
111             default:
112                 break;
113         }
114     }
115 };
116 
117 
118 //------------------------------------------------------------------------
119 // test code start here
120 //------------------------------------------------------------------------
121 
122 namespace osl_Condition
123 {
124 
125     /** testing the method:
126         Condition()
127     */
128     class ctors : public CppUnit::TestFixture
129     {
130     public:
131         sal_Bool bRes, bRes1;
132 
ctors_001()133         void ctors_001( )
134         {
135             ::osl::Condition aCond;
136             bRes = aCond.check( );
137 
138             CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition its initial check state should be sal_False.",
139                                     sal_False == bRes );
140         }
141 
ctors_002()142         void ctors_002( )
143         {
144             ::osl::Condition aCond;
145             aCond.set( );
146             bRes = aCond.check( );
147 
148             CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition and set it.",
149                                     sal_True == bRes );
150         }
151 
152         CPPUNIT_TEST_SUITE( ctors );
153         CPPUNIT_TEST( ctors_001 );
154         CPPUNIT_TEST( ctors_002 );
155         CPPUNIT_TEST_SUITE_END( );
156     }; // class ctors
157 
158 
159     /** testing the method:
160         void set()
161     */
162     class set : public CppUnit::TestFixture
163     {
164     public:
165         sal_Bool bRes, bRes1, bRes2;
166 
set_001()167         void set_001( )
168         {
169             ::osl::Condition aCond;
170             aCond.set( );
171             bRes = aCond.check( );
172 
173             CPPUNIT_ASSERT_MESSAGE( "#test comment#: check state should be sal_True after set.",
174                                     sal_True == bRes );
175         }
176 
set_002()177         void set_002( )
178         {
179             ::osl::Condition aCond;
180             ConditionThread myThread1( aCond, thread_type_wait );
181             myThread1.create();
182             bRes = myThread1.isRunning( );
183 
184             ConditionThread myThread2( aCond, thread_type_set );
185             myThread2.create();
186             thread_sleep(1);
187             bRes1 = myThread1.isRunning( );
188             bRes2 = aCond.check( );
189 
190             myThread1.join( );
191             myThread2.join( );
192 
193             CPPUNIT_ASSERT_MESSAGE( "#test comment#: use one thread to set the condition in order to release another thread.",
194                                     sal_True == bRes && sal_False == bRes1 && sal_True == bRes2 );
195         }
196 
197 
198         CPPUNIT_TEST_SUITE( set );
199         CPPUNIT_TEST( set_001 );
200         CPPUNIT_TEST( set_002 );
201         CPPUNIT_TEST_SUITE_END( );
202     }; // class set
203 
204 
205     /** testing the method:
206         void reset()
207     */
208     class reset : public CppUnit::TestFixture
209     {
210     public:
211         sal_Bool bRes, bRes1, bRes2;
212 
reset_001()213         void reset_001( )
214         {
215             ::osl::Condition aCond;
216             aCond.reset( );
217 
218             ConditionThread myThread( aCond, thread_type_wait );
219             myThread.create();
220             bRes = myThread.isRunning( );
221             bRes2 = aCond.check( );
222 
223             aCond.set( );
224             myThread.join( );
225             bRes1 = myThread.isRunning( );
226 
227             CPPUNIT_ASSERT_MESSAGE( "#test comment#: wait will cause a reset thread block, use set to release it.",
228                                     sal_True == bRes && sal_False == bRes1 && sal_False == bRes2 );
229         }
230 
reset_002()231         void reset_002( )
232         {
233             ::osl::Condition aCond;
234             aCond.reset( );
235             bRes = aCond.check( );
236             aCond.set( );
237             bRes1 = aCond.check( );
238 
239             CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition and reset/set it.",
240                                     ( sal_False == bRes && sal_True == bRes1 ) );
241         }
242 
243         CPPUNIT_TEST_SUITE( reset );
244         CPPUNIT_TEST( reset_001 );
245         CPPUNIT_TEST( reset_002 );
246         CPPUNIT_TEST_SUITE_END( );
247     }; // class reset
248 
249 
250     /** testing the method:
251         Result wait(const TimeValue *pTimeout = 0)
252     */
253     class wait : public CppUnit::TestFixture
254     {
255     public:
256         sal_Bool bRes, bRes1, bRes2;
257         TimeValue *tv1;
258 
setUp()259         void setUp( )
260         {
261             tv1 = (TimeValue*)malloc(sizeof(TimeValue));
262             tv1->Seconds = 1;
263 
264         }
265 
tearDown()266         void tearDown( )
267         {
268             free( tv1 );
269         }
270 
271 
wait_001()272         void wait_001( )
273         {
274             ::osl::Condition cond1;
275             ::osl::Condition cond2;
276             ::osl::Condition cond3;
277 
278             cond1.set();
279             cond2.set();
280 
281 osl::Condition::Result r1=cond1.wait(tv1);
282 osl::Condition::Result r2=cond2.wait();
283 osl::Condition::Result r3=cond3.wait(tv1);
284 fprintf(stderr,"%d %d %d\n",r1,r2,r3);
285             CPPUNIT_ASSERT_MESSAGE( "#test comment#: test three types of wait.",
286                                     (cond1.wait(tv1) == ::osl::Condition::result_ok) &&
287                                     (cond2.wait() == ::osl::Condition::result_ok) &&
288                                     (cond3.wait(tv1) == ::osl::Condition::result_timeout) );
289 
290         }
291 
wait_002()292         void wait_002( )
293         {
294             ::osl::Condition aCond;
295             ::osl::Condition::Result wRes, wRes1;
296 
297             aCond.reset( );
298             bRes = aCond.check( );
299             wRes = aCond.wait( tv1 );
300 
301             aCond.set( );
302             wRes1 = aCond.wait( tv1 );
303             bRes1 = aCond.check( );
304 
305             CPPUNIT_ASSERT_MESSAGE( "#test comment#: wait a condition after set/reset.",
306                                     ( sal_False == bRes ) && ( sal_True == bRes1 ) &&
307                                     ( ::osl::Condition::result_timeout == wRes ) &&
308                                     ( ::osl::Condition::result_ok == wRes1 ) );
309         }
310 
311         CPPUNIT_TEST_SUITE( wait );
312         CPPUNIT_TEST( wait_001 );
313         CPPUNIT_TEST( wait_002 );
314         CPPUNIT_TEST_SUITE_END( );
315     }; // class wait
316 
317 
318     /** testing the method:
319         sal_Bool check()
320     */
321     class check : public CppUnit::TestFixture
322     {
323     public:
324         sal_Bool bRes, bRes1, bRes2;
325 
check_001()326         void check_001( )
327         {
328             ::osl::Condition aCond;
329 
330             aCond.reset( );
331             bRes = aCond.check( );
332             aCond.set( );
333             bRes1 = aCond.check( );
334 
335             CPPUNIT_ASSERT_MESSAGE( "#test comment#: check the condition states.",
336                                     ( sal_False == bRes && sal_True == bRes1 ) );
337         }
338 
check_002()339         void check_002( )
340         {
341             ::osl::Condition aCond;
342             aCond.reset( );
343 
344             ConditionThread myThread( aCond, thread_type_set );
345             myThread.create( );
346             myThread.join( );
347             bRes = aCond.check( );
348 
349             ConditionThread myThread1( aCond, thread_type_reset );
350             myThread1.create( );
351             myThread1.join( );
352             bRes1 = aCond.check( );
353 
354             CPPUNIT_ASSERT_MESSAGE( "#test comment#: use threads to set/reset Condition and check it in main routine.",
355                                     ( sal_True == bRes && sal_False == bRes1 ) );
356         }
357 
358         CPPUNIT_TEST_SUITE( check );
359         CPPUNIT_TEST( check_001 );
360         CPPUNIT_TEST( check_002 );
361         CPPUNIT_TEST_SUITE_END( );
362     }; // class check
363 
364 
365 // -----------------------------------------------------------------------------
366 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::ctors, "osl_Condition");
367 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::set, "osl_Condition");
368 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::reset, "osl_Condition");
369 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::wait, "osl_Condition");
370 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::check, "osl_Condition");
371 // -----------------------------------------------------------------------------
372 
373 } // namespace osl_Condition
374 
375 
376 // -----------------------------------------------------------------------------
377 
378 // this macro creates an empty function, which will called by the RegisterAllFunctions()
379 // to let the user the possibility to also register some functions by hand.
380 NOADDITIONAL;
381