187d2adbcSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 387d2adbcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 487d2adbcSAndrew Rist * or more contributor license agreements. See the NOTICE file 587d2adbcSAndrew Rist * distributed with this work for additional information 687d2adbcSAndrew Rist * regarding copyright ownership. The ASF licenses this file 787d2adbcSAndrew Rist * to you under the Apache License, Version 2.0 (the 887d2adbcSAndrew Rist * "License"); you may not use this file except in compliance 987d2adbcSAndrew Rist * with the License. You may obtain a copy of the License at 1087d2adbcSAndrew Rist * 1187d2adbcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 1287d2adbcSAndrew Rist * 1387d2adbcSAndrew Rist * Unless required by applicable law or agreed to in writing, 1487d2adbcSAndrew Rist * software distributed under the License is distributed on an 1587d2adbcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1687d2adbcSAndrew Rist * KIND, either express or implied. See the License for the 1787d2adbcSAndrew Rist * specific language governing permissions and limitations 1887d2adbcSAndrew Rist * under the License. 1987d2adbcSAndrew Rist * 2087d2adbcSAndrew Rist *************************************************************/ 2187d2adbcSAndrew Rist 2287d2adbcSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sal.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir //------------------------------------------------------------------------ 28cdf0e10cSrcweir // include files 29cdf0e10cSrcweir //------------------------------------------------------------------------ 30cdf0e10cSrcweir #include <osl_Condition_Const.h> 31cdf0e10cSrcweir 325c3a7755SJuergen Schmidt #ifdef WNT 335c3a7755SJuergen Schmidt #include <Windows.h> 345c3a7755SJuergen Schmidt #endif 355c3a7755SJuergen Schmidt 361c576ccbSJuergen Schmidt #include "gtest/gtest.h" 371c576ccbSJuergen Schmidt 38cdf0e10cSrcweir using namespace osl; 39cdf0e10cSrcweir using namespace rtl; 40cdf0e10cSrcweir 41cdf0e10cSrcweir 42cdf0e10cSrcweir //------------------------------------------------------------------------ 43cdf0e10cSrcweir // helper functions and classes 44cdf0e10cSrcweir //------------------------------------------------------------------------ 45cdf0e10cSrcweir 46cdf0e10cSrcweir /** print Boolean value. 47cdf0e10cSrcweir */ 48cdf0e10cSrcweir inline void printBool( sal_Bool bOk ) 49cdf0e10cSrcweir { 501c576ccbSJuergen Schmidt printf("#printBool# " ); 511c576ccbSJuergen Schmidt ( sal_True == bOk ) ? printf("TRUE!\n" ): printf("FALSE!\n" ); 52cdf0e10cSrcweir } 53cdf0e10cSrcweir 54cdf0e10cSrcweir /** print a UNI_CODE String. 55cdf0e10cSrcweir */ 56cdf0e10cSrcweir inline void printUString( const ::rtl::OUString & str ) 57cdf0e10cSrcweir { 58cdf0e10cSrcweir rtl::OString aString; 59cdf0e10cSrcweir 601c576ccbSJuergen Schmidt printf("#printUString_u# " ); 61cdf0e10cSrcweir aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US ); 621c576ccbSJuergen Schmidt printf("%s\n", aString.getStr( ) ); 63cdf0e10cSrcweir } 64cdf0e10cSrcweir 65cdf0e10cSrcweir /** wait _nSec seconds. 66cdf0e10cSrcweir */ 67cdf0e10cSrcweir void thread_sleep( sal_Int32 _nSec ) 68cdf0e10cSrcweir { 69cdf0e10cSrcweir /// print statement in thread process must use fflush() to force display. 701c576ccbSJuergen Schmidt printf("# wait %d seconds. ", _nSec ); 71cdf0e10cSrcweir fflush( stdout ); 72cdf0e10cSrcweir 73cdf0e10cSrcweir #ifdef WNT //Windows 74cdf0e10cSrcweir Sleep( _nSec * 1000 ); 75cdf0e10cSrcweir #endif 76cdf0e10cSrcweir #if ( defined UNX ) || ( defined OS2 ) //Unix 77cdf0e10cSrcweir sleep( _nSec ); 78cdf0e10cSrcweir #endif 791c576ccbSJuergen Schmidt printf("# done\n" ); 80cdf0e10cSrcweir } 81cdf0e10cSrcweir 82cdf0e10cSrcweir enum ConditionType 83cdf0e10cSrcweir { 84cdf0e10cSrcweir thread_type_set, 85cdf0e10cSrcweir thread_type_reset, 86cdf0e10cSrcweir thread_type_wait, 87cdf0e10cSrcweir thread_type_check 88cdf0e10cSrcweir }; 89cdf0e10cSrcweir 90cdf0e10cSrcweir /** thread for testing Condition. 91cdf0e10cSrcweir */ 92cdf0e10cSrcweir class ConditionThread : public Thread 93cdf0e10cSrcweir { 94cdf0e10cSrcweir public: 95cdf0e10cSrcweir //get the Condition to operate 96cdf0e10cSrcweir ConditionThread( ::osl::Condition& Con, ConditionType tType): m_MyCon( Con ), m_MyType( tType ) { } 97cdf0e10cSrcweir 98cdf0e10cSrcweir ~ConditionThread( ) 99cdf0e10cSrcweir { 100cdf0e10cSrcweir // LLA: do not throw in DTors! 101cdf0e10cSrcweir // LLA: CPPUNIT_ASSERT_MESSAGE( "#ConditionThread does not shutdown properly.\n", sal_False == this -> isRunning( ) ); 102cdf0e10cSrcweir } 103cdf0e10cSrcweir protected: 104cdf0e10cSrcweir ::osl::Condition& m_MyCon; 105cdf0e10cSrcweir ConditionType m_MyType; 106cdf0e10cSrcweir 107cdf0e10cSrcweir void SAL_CALL run() 108cdf0e10cSrcweir { 109cdf0e10cSrcweir switch ( m_MyType ) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir case thread_type_wait: 112cdf0e10cSrcweir m_MyCon.wait(); break; 113cdf0e10cSrcweir case thread_type_set: 114cdf0e10cSrcweir m_MyCon.set(); break; 115cdf0e10cSrcweir case thread_type_reset: 116cdf0e10cSrcweir m_MyCon.reset(); break; 117cdf0e10cSrcweir default: 118cdf0e10cSrcweir break; 119cdf0e10cSrcweir } 120cdf0e10cSrcweir } 121cdf0e10cSrcweir }; 1221c576ccbSJuergen Schmidt 123cdf0e10cSrcweir 124cdf0e10cSrcweir //------------------------------------------------------------------------ 125cdf0e10cSrcweir // test code start here 126cdf0e10cSrcweir //------------------------------------------------------------------------ 127cdf0e10cSrcweir 128cdf0e10cSrcweir namespace osl_Condition 129cdf0e10cSrcweir { 130cdf0e10cSrcweir /** testing the method: 131cdf0e10cSrcweir Condition() 132cdf0e10cSrcweir */ 1331c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, ctors_001) { 1341c576ccbSJuergen Schmidt ::osl::Condition aCond; 1351c576ccbSJuergen Schmidt sal_Bool bRes = aCond.check( ); 136cdf0e10cSrcweir 1371c576ccbSJuergen Schmidt // #test comment#: create a condition its initial check state should be sal_False. 1381c576ccbSJuergen Schmidt ASSERT_TRUE( !bRes ); 1391c576ccbSJuergen Schmidt } 1401c576ccbSJuergen Schmidt 1411c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, ctors_002) { 1421c576ccbSJuergen Schmidt ::osl::Condition aCond; 1431c576ccbSJuergen Schmidt aCond.set( ); 1441c576ccbSJuergen Schmidt sal_Bool bRes = aCond.check( ); 145cdf0e10cSrcweir 1461c576ccbSJuergen Schmidt // #test comment#: create a condition and set it. 1471c576ccbSJuergen Schmidt ASSERT_TRUE( bRes ); 1481c576ccbSJuergen Schmidt } 149cdf0e10cSrcweir 150cdf0e10cSrcweir 151cdf0e10cSrcweir /** testing the method: 152cdf0e10cSrcweir void set() 153cdf0e10cSrcweir */ 1541c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, set_001) { 1551c576ccbSJuergen Schmidt ::osl::Condition aCond; 1561c576ccbSJuergen Schmidt aCond.set( ); 1571c576ccbSJuergen Schmidt sal_Bool bRes = aCond.check( ); 158cdf0e10cSrcweir 1591c576ccbSJuergen Schmidt // #test comment#: check state should be sal_True after set. 1601c576ccbSJuergen Schmidt ASSERT_TRUE( bRes ); 1611c576ccbSJuergen Schmidt } 1621c576ccbSJuergen Schmidt 1631c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, set_002) { 1641c576ccbSJuergen Schmidt ::osl::Condition aCond; 1651c576ccbSJuergen Schmidt ConditionThread myThread1( aCond, thread_type_wait ); 1661c576ccbSJuergen Schmidt myThread1.create(); 1671c576ccbSJuergen Schmidt sal_Bool bRes = myThread1.isRunning( ); 168cdf0e10cSrcweir 1691c576ccbSJuergen Schmidt ConditionThread myThread2( aCond, thread_type_set ); 1701c576ccbSJuergen Schmidt myThread2.create(); 1711c576ccbSJuergen Schmidt thread_sleep(1); 1721c576ccbSJuergen Schmidt sal_Bool bRes1 = myThread1.isRunning( ); 1731c576ccbSJuergen Schmidt sal_Bool bRes2 = aCond.check( ); 174cdf0e10cSrcweir 1751c576ccbSJuergen Schmidt myThread1.join( ); 1761c576ccbSJuergen Schmidt myThread2.join( ); 177cdf0e10cSrcweir 1781c576ccbSJuergen Schmidt // #test comment#: use one thread to set the condition in order to release another thread." 1791c576ccbSJuergen Schmidt ASSERT_TRUE( bRes && !bRes1 && bRes2 ); 1801c576ccbSJuergen Schmidt } 1811c576ccbSJuergen Schmidt 1821c576ccbSJuergen Schmidt 183cdf0e10cSrcweir /** testing the method: 184cdf0e10cSrcweir void reset() 185cdf0e10cSrcweir */ 1861c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, reset_001) { 1871c576ccbSJuergen Schmidt ::osl::Condition aCond; 1881c576ccbSJuergen Schmidt aCond.reset( ); 189cdf0e10cSrcweir 1901c576ccbSJuergen Schmidt ConditionThread myThread( aCond, thread_type_wait ); 1911c576ccbSJuergen Schmidt myThread.create(); 1921c576ccbSJuergen Schmidt sal_Bool bRes = myThread.isRunning( ); 1931c576ccbSJuergen Schmidt sal_Bool bRes2 = aCond.check( ); 194cdf0e10cSrcweir 1951c576ccbSJuergen Schmidt aCond.set( ); 1961c576ccbSJuergen Schmidt myThread.join( ); 1971c576ccbSJuergen Schmidt sal_Bool bRes1 = myThread.isRunning( ); 198cdf0e10cSrcweir 1991c576ccbSJuergen Schmidt // #test comment#: wait will cause a reset thread block, use set to release it. 2001c576ccbSJuergen Schmidt ASSERT_TRUE( bRes && !bRes1 && !bRes2 ); 2011c576ccbSJuergen Schmidt } 2021c576ccbSJuergen Schmidt 2031c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, reset_002) { 2041c576ccbSJuergen Schmidt ::osl::Condition aCond; 2051c576ccbSJuergen Schmidt aCond.reset( ); 2061c576ccbSJuergen Schmidt sal_Bool bRes = aCond.check( ); 2071c576ccbSJuergen Schmidt aCond.set( ); 2081c576ccbSJuergen Schmidt sal_Bool bRes1 = aCond.check( ); 2091c576ccbSJuergen Schmidt 2101c576ccbSJuergen Schmidt // #test comment#: create a condition and reset/set it. 2111c576ccbSJuergen Schmidt ASSERT_TRUE( sal_False == bRes && sal_True == bRes1 ); 2121c576ccbSJuergen Schmidt } 213cdf0e10cSrcweir 214cdf0e10cSrcweir 215cdf0e10cSrcweir /** testing the method: 216cdf0e10cSrcweir Result wait(const TimeValue *pTimeout = 0) 217cdf0e10cSrcweir */ 2181c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, wait_001) { 219*4a7db6b2SHerbert Dürr TimeValue tv1 = {1,0}; 220*4a7db6b2SHerbert Dürr 2211c576ccbSJuergen Schmidt ::osl::Condition cond1; 2221c576ccbSJuergen Schmidt ::osl::Condition cond2; 2231c576ccbSJuergen Schmidt ::osl::Condition cond3; 224*4a7db6b2SHerbert Dürr 2251c576ccbSJuergen Schmidt cond1.set(); 2261c576ccbSJuergen Schmidt cond2.set(); 227*4a7db6b2SHerbert Dürr 2281c576ccbSJuergen Schmidt osl::Condition::Result r1=cond1.wait(&tv1); 2291c576ccbSJuergen Schmidt osl::Condition::Result r2=cond2.wait(); 2301c576ccbSJuergen Schmidt osl::Condition::Result r3=cond3.wait(&tv1); 2311c576ccbSJuergen Schmidt fprintf(stderr,"%d %d %d\n",r1,r2,r3); 2321c576ccbSJuergen Schmidt 2331c576ccbSJuergen Schmidt // #test comment#: test three types of wait. 234*4a7db6b2SHerbert Dürr ASSERT_TRUE( cond1.wait(&tv1) == ::osl::Condition::result_ok ); 235*4a7db6b2SHerbert Dürr ASSERT_TRUE( cond2.wait() == ::osl::Condition::result_ok ); 236*4a7db6b2SHerbert Dürr ASSERT_TRUE( cond3.wait(&tv1) == ::osl::Condition::result_timeout ); 2371c576ccbSJuergen Schmidt } 2381c576ccbSJuergen Schmidt 2391c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, wait_002) { 240*4a7db6b2SHerbert Dürr TimeValue tv1 = {1,0}; 241*4a7db6b2SHerbert Dürr 2421c576ccbSJuergen Schmidt ::osl::Condition aCond; 2431c576ccbSJuergen Schmidt ::osl::Condition::Result wRes, wRes1; 244*4a7db6b2SHerbert Dürr 2451c576ccbSJuergen Schmidt aCond.reset( ); 2461c576ccbSJuergen Schmidt sal_Bool bRes = aCond.check( ); 2471c576ccbSJuergen Schmidt wRes = aCond.wait( &tv1 ); 248*4a7db6b2SHerbert Dürr 2491c576ccbSJuergen Schmidt aCond.set( ); 2501c576ccbSJuergen Schmidt wRes1 = aCond.wait( &tv1 ); 2511c576ccbSJuergen Schmidt sal_Bool bRes1 = aCond.check( ); 252cdf0e10cSrcweir 2531c576ccbSJuergen Schmidt // #test comment#: wait a condition after set/reset. 254*4a7db6b2SHerbert Dürr ASSERT_TRUE( !bRes ); 255*4a7db6b2SHerbert Dürr ASSERT_TRUE( bRes1 ); 256*4a7db6b2SHerbert Dürr ASSERT_TRUE( ::osl::Condition::result_timeout == wRes ); 257*4a7db6b2SHerbert Dürr ASSERT_TRUE( ::osl::Condition::result_ok == wRes1 ); 2581c576ccbSJuergen Schmidt } 259cdf0e10cSrcweir 260cdf0e10cSrcweir 261cdf0e10cSrcweir /** testing the method: 262cdf0e10cSrcweir sal_Bool check() 263cdf0e10cSrcweir */ 2641c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, check_001) { 2651c576ccbSJuergen Schmidt ::osl::Condition aCond; 2661c576ccbSJuergen Schmidt aCond.reset( ); 2671c576ccbSJuergen Schmidt sal_Bool bRes = aCond.check( ); 2681c576ccbSJuergen Schmidt aCond.set( ); 2691c576ccbSJuergen Schmidt sal_Bool bRes1 = aCond.check( ); 2701c576ccbSJuergen Schmidt 2711c576ccbSJuergen Schmidt // #test comment#: check the condition states. 2721c576ccbSJuergen Schmidt ASSERT_TRUE( !bRes && bRes1 ); 2731c576ccbSJuergen Schmidt } 2741c576ccbSJuergen Schmidt 2751c576ccbSJuergen Schmidt TEST(Sal_Test_Condition, check_002) { 2761c576ccbSJuergen Schmidt ::osl::Condition aCond; 2771c576ccbSJuergen Schmidt aCond.reset( ); 278cdf0e10cSrcweir 2791c576ccbSJuergen Schmidt ConditionThread myThread( aCond, thread_type_set ); 2801c576ccbSJuergen Schmidt myThread.create( ); 2811c576ccbSJuergen Schmidt myThread.join( ); 2821c576ccbSJuergen Schmidt sal_Bool bRes = aCond.check( ); 283cdf0e10cSrcweir 2841c576ccbSJuergen Schmidt ConditionThread myThread1( aCond, thread_type_reset ); 2851c576ccbSJuergen Schmidt myThread1.create( ); 2861c576ccbSJuergen Schmidt myThread1.join( ); 2871c576ccbSJuergen Schmidt sal_Bool bRes1 = aCond.check( ); 288cdf0e10cSrcweir 2891c576ccbSJuergen Schmidt // #test comment#: use threads to set/reset Condition and check it in main routine. 290*4a7db6b2SHerbert Dürr ASSERT_TRUE( bRes ); 291*4a7db6b2SHerbert Dürr ASSERT_TRUE( !bRes1 ); 2921c576ccbSJuergen Schmidt } 293cdf0e10cSrcweir 294cdf0e10cSrcweir } // namespace osl_Condition 295cdf0e10cSrcweir 296cdf0e10cSrcweir 2971c576ccbSJuergen Schmidt int main(int argc, char **argv) 2981c576ccbSJuergen Schmidt { 2991c576ccbSJuergen Schmidt ::testing::InitGoogleTest(&argc, argv); 3001c576ccbSJuergen Schmidt return RUN_ALL_TESTS(); 3011c576ccbSJuergen Schmidt } 302