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 // include files
28cdf0e10cSrcweir //------------------------------------------------------------------------
29cdf0e10cSrcweir #include <sal/types.h>
30cdf0e10cSrcweir 
3129922ad4SDamjan Jovanovic #include <rtl/ustring.h>
3229922ad4SDamjan Jovanovic #include <rtl/ustring.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #ifndef _OSL_THREAD_HXX
35cdf0e10cSrcweir #include <osl/thread.hxx>
36cdf0e10cSrcweir #endif
37cdf0e10cSrcweir #include <osl/time.h>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <rtl/instance.hxx>
40cdf0e10cSrcweir 
4129922ad4SDamjan Jovanovic #include "gtest/gtest.h"
42cdf0e10cSrcweir 
43*a03c9fa9SDamjan Jovanovic #ifdef WNT
44*a03c9fa9SDamjan Jovanovic #define WIN32_LEAN_AND_MEAN
45*a03c9fa9SDamjan Jovanovic #include <windows.h>
46*a03c9fa9SDamjan Jovanovic #endif
47*a03c9fa9SDamjan Jovanovic 
48cdf0e10cSrcweir // -----------------------------------------------------------------------------
49cdf0e10cSrcweir #define CONST_TEST_STRING "gregorian"
50cdf0e10cSrcweir 
51cdf0e10cSrcweir namespace {
52cdf0e10cSrcweir struct Gregorian : public rtl::StaticWithInit<const ::rtl::OUString, Gregorian> {
operator ()__anon11dc95c60111::Gregorian53cdf0e10cSrcweir     const ::rtl::OUString operator () () {
54cdf0e10cSrcweir         return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( CONST_TEST_STRING ));
55cdf0e10cSrcweir     }
56cdf0e10cSrcweir };
57cdf0e10cSrcweir }
58cdf0e10cSrcweir 
printOUString(::rtl::OUString const & _suStr)59cdf0e10cSrcweir inline void printOUString( ::rtl::OUString const & _suStr )
60cdf0e10cSrcweir {
61cdf0e10cSrcweir     rtl::OString aString;
62cdf0e10cSrcweir 
6329922ad4SDamjan Jovanovic     printf( "OUString: " );
64cdf0e10cSrcweir     aString = ::rtl::OUStringToOString( _suStr, RTL_TEXTENCODING_ASCII_US );
6529922ad4SDamjan Jovanovic     printf( "'%s'\n", aString.getStr( ) );
66cdf0e10cSrcweir }
67cdf0e10cSrcweir 
68cdf0e10cSrcweir // -----------------------------------------------------------------------------
69cdf0e10cSrcweir namespace ThreadHelper
70cdf0e10cSrcweir {
71cdf0e10cSrcweir     // typedef enum {
72cdf0e10cSrcweir     //     QUIET=1,
73cdf0e10cSrcweir     //     VERBOSE
74cdf0e10cSrcweir     // } eSleepVerboseMode;
75cdf0e10cSrcweir 
thread_sleep_tenth_sec(sal_Int32 _nTenthSec)76cdf0e10cSrcweir     void thread_sleep_tenth_sec(sal_Int32 _nTenthSec/*, eSleepVerboseMode nVerbose = VERBOSE*/)
77cdf0e10cSrcweir     {
78cdf0e10cSrcweir         // if (nVerbose == VERBOSE)
79cdf0e10cSrcweir         // {
8029922ad4SDamjan Jovanovic         //     printf("wait %d tenth seconds. ", _nTenthSec );
81cdf0e10cSrcweir         //     fflush(stdout);
82cdf0e10cSrcweir         // }
83cdf0e10cSrcweir #ifdef WNT      //Windows
84cdf0e10cSrcweir         Sleep(_nTenthSec * 100 );
85cdf0e10cSrcweir #endif
86cdf0e10cSrcweir #if ( defined UNX ) || ( defined OS2 )  //Unix
87cdf0e10cSrcweir         TimeValue nTV;
88cdf0e10cSrcweir         nTV.Seconds = static_cast<sal_uInt32>( _nTenthSec/10 );
89cdf0e10cSrcweir         nTV.Nanosec = ( (_nTenthSec%10 ) * 100000000 );
90cdf0e10cSrcweir         osl_waitThread(&nTV);
91cdf0e10cSrcweir #endif
92cdf0e10cSrcweir         // if (nVerbose == VERBOSE)
93cdf0e10cSrcweir         // {
9429922ad4SDamjan Jovanovic         //     printf("done\n");
95cdf0e10cSrcweir         // }
96cdf0e10cSrcweir     }
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir // -----------------------------------------------------------------------------
100cdf0e10cSrcweir 
101cdf0e10cSrcweir /** Simple thread for testing Thread-create.
102cdf0e10cSrcweir  * Just add 1 of value 0, and after running, result is 1.
103cdf0e10cSrcweir  */
104cdf0e10cSrcweir class OGetThread : public osl::Thread
105cdf0e10cSrcweir {
106cdf0e10cSrcweir     sal_Int32 m_nOK;
107cdf0e10cSrcweir     sal_Int32 m_nFails;
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     rtl::OUString m_sConstStr;
110cdf0e10cSrcweir public:
OGetThread()111cdf0e10cSrcweir     OGetThread()
112cdf0e10cSrcweir             :m_nOK(0),
113cdf0e10cSrcweir              m_nFails(0)
114cdf0e10cSrcweir         {
115cdf0e10cSrcweir             m_sConstStr = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( CONST_TEST_STRING ));
116cdf0e10cSrcweir         }
117cdf0e10cSrcweir 
getOK()118cdf0e10cSrcweir     sal_Int32 getOK() { return m_nOK; }
getFails()119cdf0e10cSrcweir     sal_Int32 getFails() {return m_nFails;}
120cdf0e10cSrcweir 
121cdf0e10cSrcweir protected:
122cdf0e10cSrcweir 
123cdf0e10cSrcweir     /** guarded value which initialized 0
124cdf0e10cSrcweir 
125cdf0e10cSrcweir         @see ThreadSafeValue
126cdf0e10cSrcweir     */
run()127cdf0e10cSrcweir     void SAL_CALL run()
128cdf0e10cSrcweir         {
129cdf0e10cSrcweir             while(schedule())
130cdf0e10cSrcweir             {
131cdf0e10cSrcweir                 rtl::OUString aStr = Gregorian::get();
132cdf0e10cSrcweir                 // printOUString(aStr);
133cdf0e10cSrcweir                 // printOUString(m_sConstStr);
134cdf0e10cSrcweir                 if (aStr.equals(m_sConstStr))
135cdf0e10cSrcweir                 {
136cdf0e10cSrcweir                     m_nOK++;
137cdf0e10cSrcweir                 }
138cdf0e10cSrcweir                 else
139cdf0e10cSrcweir                 {
140cdf0e10cSrcweir                     m_nFails++;
141cdf0e10cSrcweir                 }
142cdf0e10cSrcweir                 ThreadHelper::thread_sleep_tenth_sec(1);
143cdf0e10cSrcweir             }
144cdf0e10cSrcweir         }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir public:
147cdf0e10cSrcweir 
suspend()148cdf0e10cSrcweir     virtual void SAL_CALL suspend()
149cdf0e10cSrcweir         {
150cdf0e10cSrcweir             ::osl::Thread::suspend();
151cdf0e10cSrcweir         }
152cdf0e10cSrcweir 
~OGetThread()153cdf0e10cSrcweir     ~OGetThread()
154cdf0e10cSrcweir         {
155cdf0e10cSrcweir             if (isRunning())
156cdf0e10cSrcweir             {
15729922ad4SDamjan Jovanovic                 printf("error: not terminated.\n");
158cdf0e10cSrcweir             }
159cdf0e10cSrcweir         }
160cdf0e10cSrcweir };
161cdf0e10cSrcweir 
162cdf0e10cSrcweir // -----------------------------------------------------------------------------
163cdf0e10cSrcweir namespace rtl_DoubleLocking
164cdf0e10cSrcweir {
165cdf0e10cSrcweir 
166cdf0e10cSrcweir /** Test of the osl::Thread::create method
167cdf0e10cSrcweir  */
168cdf0e10cSrcweir 
16929922ad4SDamjan Jovanovic     class getValue : public ::testing::Test
170cdf0e10cSrcweir     {
171cdf0e10cSrcweir     public:
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         // initialise your test code values here.
SetUp()17429922ad4SDamjan Jovanovic         void SetUp()
175cdf0e10cSrcweir             {
176cdf0e10cSrcweir             }
177cdf0e10cSrcweir 
TearDown()17829922ad4SDamjan Jovanovic         void TearDown()
179cdf0e10cSrcweir             {
180cdf0e10cSrcweir             }
18129922ad4SDamjan Jovanovic     }; // class create
182cdf0e10cSrcweir 
TEST_F(getValue,getValue_001)18329922ad4SDamjan Jovanovic     TEST_F(getValue, getValue_001)
18429922ad4SDamjan Jovanovic     {
18529922ad4SDamjan Jovanovic         rtl::OUString aStr = Gregorian::get();
18629922ad4SDamjan Jovanovic         printOUString(aStr);
187cdf0e10cSrcweir 
18829922ad4SDamjan Jovanovic         ASSERT_TRUE(aStr.getLength() != 0)
18929922ad4SDamjan Jovanovic             << "Gregorian::get() failed, wrong value expected.";
19029922ad4SDamjan Jovanovic     }
191cdf0e10cSrcweir 
19229922ad4SDamjan Jovanovic     /** check 2 threads.
193cdf0e10cSrcweir 
19429922ad4SDamjan Jovanovic         ALGORITHM:
19529922ad4SDamjan Jovanovic         Here the function should show, that 2 different threads,
19629922ad4SDamjan Jovanovic         which only increase a value, should run at the same time with same prio.
19729922ad4SDamjan Jovanovic         The test fails, if the difference between the two values is more than 5%
19829922ad4SDamjan Jovanovic         but IMHO this isn't a failure, it's only a feature of the OS.
19929922ad4SDamjan Jovanovic     */
TEST_F(getValue,getValue_002)20029922ad4SDamjan Jovanovic     TEST_F(getValue, getValue_002)
20129922ad4SDamjan Jovanovic     {
20229922ad4SDamjan Jovanovic         // initial 5 threads with different priorities
20329922ad4SDamjan Jovanovic         OGetThread* pThread = new OGetThread();
20429922ad4SDamjan Jovanovic         OGetThread* p2Thread = new OGetThread();
205cdf0e10cSrcweir 
20629922ad4SDamjan Jovanovic         //Create them and start running at the same time
20729922ad4SDamjan Jovanovic         pThread->create();
20829922ad4SDamjan Jovanovic         p2Thread->create();
209cdf0e10cSrcweir 
21029922ad4SDamjan Jovanovic         ThreadHelper::thread_sleep_tenth_sec(50);
211cdf0e10cSrcweir 
21229922ad4SDamjan Jovanovic         pThread->terminate();
21329922ad4SDamjan Jovanovic         p2Thread->terminate();
214cdf0e10cSrcweir 
21529922ad4SDamjan Jovanovic         sal_Int32 nValueOK = 0;
21629922ad4SDamjan Jovanovic         nValueOK = pThread->getOK();
217cdf0e10cSrcweir 
21829922ad4SDamjan Jovanovic         sal_Int32 nValueOK2 = 0;
21929922ad4SDamjan Jovanovic         nValueOK2 = p2Thread->getOK();
220cdf0e10cSrcweir 
22129922ad4SDamjan Jovanovic         printf("Value in Thread #1 is %d\n", nValueOK);
22229922ad4SDamjan Jovanovic         printf("Value in Thread #2 is %d\n", nValueOK2);
223cdf0e10cSrcweir 
22429922ad4SDamjan Jovanovic         sal_Int32 nValueFails = 0;
22529922ad4SDamjan Jovanovic         nValueFails = pThread->getFails();
226cdf0e10cSrcweir 
22729922ad4SDamjan Jovanovic         sal_Int32 nValueFails2 = 0;
22829922ad4SDamjan Jovanovic         nValueFails2 = p2Thread->getFails();
229cdf0e10cSrcweir 
23029922ad4SDamjan Jovanovic         printf("Fails in Thread #1 is %d\n", nValueFails);
23129922ad4SDamjan Jovanovic         printf("Fails in Thread #2 is %d\n", nValueFails2);
232cdf0e10cSrcweir 
23329922ad4SDamjan Jovanovic         // ThreadHelper::thread_sleep_tenth_sec(1);
23429922ad4SDamjan Jovanovic         pThread->join();
23529922ad4SDamjan Jovanovic         p2Thread->join();
236cdf0e10cSrcweir 
23729922ad4SDamjan Jovanovic         delete pThread;
23829922ad4SDamjan Jovanovic         delete p2Thread;
239cdf0e10cSrcweir 
24029922ad4SDamjan Jovanovic         ASSERT_TRUE(nValueOK != 0 && nValueFails == 0 && nValueFails2 == 0)
24129922ad4SDamjan Jovanovic             << "getValue() failed, wrong value expected.";
24229922ad4SDamjan Jovanovic     }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir } // namespace rtl_DoubleLocking
245cdf0e10cSrcweir 
main(int argc,char ** argv)24629922ad4SDamjan Jovanovic int main(int argc, char **argv)
24729922ad4SDamjan Jovanovic {
24829922ad4SDamjan Jovanovic     ::testing::InitGoogleTest(&argc, argv);
24929922ad4SDamjan Jovanovic     return RUN_ALL_TESTS();
25029922ad4SDamjan Jovanovic }
251