xref: /aoo42x/main/sal/qa/osl/process/osl_Thread.cxx (revision 30acf5e8)
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 
31cdf0e10cSrcweir #ifndef _RTL_USTRING_HXX_
32cdf0e10cSrcweir #include <rtl/string.hxx>
33cdf0e10cSrcweir #endif
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #ifndef _RTL_USTRING_HXX_
36cdf0e10cSrcweir #include <rtl/strbuf.hxx>
37cdf0e10cSrcweir #endif
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #ifndef _OSL_THREAD_HXX
40cdf0e10cSrcweir #include <osl/thread.hxx>
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #ifndef _OSL_MUTEX_HXX
44cdf0e10cSrcweir #include <osl/mutex.hxx>
45cdf0e10cSrcweir #endif
46cdf0e10cSrcweir #include <osl/time.h>
47cdf0e10cSrcweir 
4844e8df1fSDamjan Jovanovic #include "gtest/gtest.h"
49cdf0e10cSrcweir 
50cdf0e10cSrcweir using namespace osl;
51cdf0e10cSrcweir using namespace rtl;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #ifdef UNX
54cdf0e10cSrcweir #include <unistd.h>
55cdf0e10cSrcweir #include <time.h>
56cdf0e10cSrcweir #endif
57cdf0e10cSrcweir // -----------------------------------------------------------------------------
58cdf0e10cSrcweir // Kleine Stopuhr
59cdf0e10cSrcweir class StopWatch {
60cdf0e10cSrcweir     TimeValue t1,t2;                                // Start und Stopzeit
61cdf0e10cSrcweir 
62cdf0e10cSrcweir protected:
63cdf0e10cSrcweir     sal_Int32 m_nNanoSec;
64cdf0e10cSrcweir     sal_Int32 m_nSeconds;
65cdf0e10cSrcweir 
66cdf0e10cSrcweir     bool m_bIsValid;                                   // TRUE, wenn gestartet und gestoppt
67cdf0e10cSrcweir     bool m_bIsRunning;                                 // TRUE, wenn gestartet.
68cdf0e10cSrcweir 
69cdf0e10cSrcweir public:
70cdf0e10cSrcweir     StopWatch();
~StopWatch()71cdf0e10cSrcweir     ~StopWatch() {}
72cdf0e10cSrcweir 
73cdf0e10cSrcweir     void start();                                 // Startet Timer
74cdf0e10cSrcweir     void stop();                                  // Stoppt Timer
75cdf0e10cSrcweir 
76cdf0e10cSrcweir     double getSeconds() const;
77cdf0e10cSrcweir     double getTenthSec() const;
78cdf0e10cSrcweir };
79cdf0e10cSrcweir 
80cdf0e10cSrcweir // ================================= Stop Watch =================================
81cdf0e10cSrcweir 
82cdf0e10cSrcweir // Eine kleine Stop-Uhr fuer den internen Gebrauch.
83cdf0e10cSrcweir // (c) Lars Langhans 29.12.1996 22:10
84cdf0e10cSrcweir 
StopWatch()85cdf0e10cSrcweir StopWatch::StopWatch():m_bIsValid(false),m_bIsRunning(false) {}
86cdf0e10cSrcweir 
start()87cdf0e10cSrcweir void StopWatch::start()
88cdf0e10cSrcweir {
89cdf0e10cSrcweir // pre: %
90cdf0e10cSrcweir // post: Start Timer
91cdf0e10cSrcweir 
92cdf0e10cSrcweir     m_bIsValid = false;
93cdf0e10cSrcweir     m_bIsRunning = true;
94cdf0e10cSrcweir     osl_getSystemTime( &t1 );
9544e8df1fSDamjan Jovanovic     printf("# %d %d nsecs\n", t1.Seconds, t1.Nanosec);
96cdf0e10cSrcweir     // gettimeofday(&t1, 0);
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
stop()99cdf0e10cSrcweir void StopWatch::stop()
100cdf0e10cSrcweir {
101cdf0e10cSrcweir // pre: Timer should be started
102cdf0e10cSrcweir // post: Timer will stopped
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     // gettimeofday(&t2, 0);                         // Timer ausfragen
105cdf0e10cSrcweir     osl_getSystemTime( &t2 );
10644e8df1fSDamjan Jovanovic     printf("# %d %d nsecs\n", t2.Seconds, t2.Nanosec);
107cdf0e10cSrcweir 
108cdf0e10cSrcweir     if (m_bIsRunning)
109cdf0e10cSrcweir     {                                // check ob gestartet.
110cdf0e10cSrcweir // LLA: old         m_nNanoSec = static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
111cdf0e10cSrcweir // LLA: old         m_nSeconds = static_cast<sal_Int32>(t2.Seconds) - static_cast<sal_Int32>(t1.Seconds);
112cdf0e10cSrcweir // LLA: old         if (m_nNanoSec < 0)
113cdf0e10cSrcweir // LLA: old         {
114cdf0e10cSrcweir // LLA: old             m_nNanoSec += 1000000000;
115cdf0e10cSrcweir // LLA: old             m_nSeconds -= 1;
116cdf0e10cSrcweir // LLA: old         }
117cdf0e10cSrcweir         //m_nNanoSec = t2.Nanosec - t1.Nanosec;
118cdf0e10cSrcweir         m_nSeconds = static_cast<sal_Int32>(t2.Seconds) - static_cast<sal_Int32>(t1.Seconds);
119cdf0e10cSrcweir         if ( t2.Nanosec > t1.Nanosec )
120cdf0e10cSrcweir        		m_nNanoSec = static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
121cdf0e10cSrcweir        	else
122cdf0e10cSrcweir        	{
123cdf0e10cSrcweir 		m_nNanoSec = 1000000000 + static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
124cdf0e10cSrcweir             	m_nSeconds -= 1;
125cdf0e10cSrcweir 	}
12644e8df1fSDamjan Jovanovic 	printf("# %d %d nsecs\n", m_nSeconds, m_nNanoSec );
127cdf0e10cSrcweir         //if (m_nNanoSec < 0)
128cdf0e10cSrcweir         //{
129cdf0e10cSrcweir             //m_nNanoSec += 1000000000;
130cdf0e10cSrcweir             //m_nSeconds -= 1;
131cdf0e10cSrcweir         //}
132cdf0e10cSrcweir         m_bIsValid = true;
133cdf0e10cSrcweir         m_bIsRunning = false;
134cdf0e10cSrcweir     }
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
getSeconds() const137cdf0e10cSrcweir double StopWatch::getSeconds() const
138cdf0e10cSrcweir {
139cdf0e10cSrcweir // pre: gueltig = TRUE
140cdf0e10cSrcweir // BACK: Zeit in Sekunden.
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     double nValue = 0.0;
143cdf0e10cSrcweir     if (m_bIsValid)
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         nValue = double(m_nNanoSec) / 1000000000.0 + m_nSeconds; // milli micro nano
146cdf0e10cSrcweir     }
147cdf0e10cSrcweir     return nValue;
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
getTenthSec() const150cdf0e10cSrcweir double StopWatch::getTenthSec() const
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     double nValue = 0.0;
153cdf0e10cSrcweir     if (m_bIsValid)
154cdf0e10cSrcweir     {
155cdf0e10cSrcweir         nValue = double(m_nNanoSec) / 100000000.0 + m_nSeconds * 10;
156cdf0e10cSrcweir     }
157cdf0e10cSrcweir     return nValue ;
158cdf0e10cSrcweir }
159cdf0e10cSrcweir 
160cdf0e10cSrcweir // -----------------------------------------------------------------------------
161cdf0e10cSrcweir template <class T>
162cdf0e10cSrcweir class ThreadSafeValue
163cdf0e10cSrcweir {
164cdf0e10cSrcweir     T   m_nFlag;
165cdf0e10cSrcweir     Mutex   m_aMutex;
166cdf0e10cSrcweir public:
ThreadSafeValue(T n=0)167cdf0e10cSrcweir     ThreadSafeValue(T n = 0): m_nFlag(n) {}
getValue()168cdf0e10cSrcweir     T getValue()
169cdf0e10cSrcweir         {
170cdf0e10cSrcweir             //block if already acquired by another thread.
171cdf0e10cSrcweir             osl::MutexGuard g(m_aMutex);
172cdf0e10cSrcweir             return m_nFlag;
173cdf0e10cSrcweir         }
addValue(T n)174cdf0e10cSrcweir     void addValue(T n)
175cdf0e10cSrcweir         {
176cdf0e10cSrcweir             //only one thread operate on the flag.
177cdf0e10cSrcweir             osl::MutexGuard g(m_aMutex);
178cdf0e10cSrcweir             m_nFlag += n;
179cdf0e10cSrcweir         }
acquire()180cdf0e10cSrcweir     void acquire() {m_aMutex.acquire();}
release()181cdf0e10cSrcweir     void release() {m_aMutex.release();}
182cdf0e10cSrcweir };
183cdf0e10cSrcweir 
184cdf0e10cSrcweir // -----------------------------------------------------------------------------
185cdf0e10cSrcweir namespace ThreadHelper
186cdf0e10cSrcweir {
187cdf0e10cSrcweir     // typedef enum {
188cdf0e10cSrcweir     //     QUIET=1,
189cdf0e10cSrcweir     //     VERBOSE
190cdf0e10cSrcweir     // } eSleepVerboseMode;
191cdf0e10cSrcweir 
thread_sleep_tenth_sec(sal_Int32 _nTenthSec)192cdf0e10cSrcweir     void thread_sleep_tenth_sec(sal_Int32 _nTenthSec/*, eSleepVerboseMode nVerbose = VERBOSE*/)
193cdf0e10cSrcweir     {
194cdf0e10cSrcweir         // if (nVerbose == VERBOSE)
195cdf0e10cSrcweir         // {
19644e8df1fSDamjan Jovanovic         //     printf("wait %d tenth seconds. ", _nTenthSec );
197cdf0e10cSrcweir         //     fflush(stdout);
198cdf0e10cSrcweir         // }
199cdf0e10cSrcweir #ifdef WNT      //Windows
200cdf0e10cSrcweir         Sleep(_nTenthSec * 100 );
201cdf0e10cSrcweir #endif
202cdf0e10cSrcweir #if ( defined UNX ) || ( defined OS2 )  //Unix
203cdf0e10cSrcweir         TimeValue nTV;
204cdf0e10cSrcweir         nTV.Seconds = static_cast<sal_uInt32>( _nTenthSec/10 );
205cdf0e10cSrcweir         nTV.Nanosec = ( (_nTenthSec%10 ) * 100000000 );
206cdf0e10cSrcweir         osl_waitThread(&nTV);
207cdf0e10cSrcweir #endif
208cdf0e10cSrcweir         // if (nVerbose == VERBOSE)
209cdf0e10cSrcweir         // {
21044e8df1fSDamjan Jovanovic         //     printf("done\n");
211cdf0e10cSrcweir         // }
212cdf0e10cSrcweir     }
213cdf0e10cSrcweir 
outputPriority(oslThreadPriority const & _aPriority)214cdf0e10cSrcweir     void outputPriority(oslThreadPriority const& _aPriority)
215cdf0e10cSrcweir     {
216cdf0e10cSrcweir         // LLA: output the priority
217cdf0e10cSrcweir         if (_aPriority == osl_Thread_PriorityHighest)
218cdf0e10cSrcweir         {
21944e8df1fSDamjan Jovanovic             printf("Prio is High\n");
220cdf0e10cSrcweir         }
221cdf0e10cSrcweir         else if (_aPriority == osl_Thread_PriorityAboveNormal)
222cdf0e10cSrcweir         {
22344e8df1fSDamjan Jovanovic             printf("Prio is above normal\n");
224cdf0e10cSrcweir         }
225cdf0e10cSrcweir         else if (_aPriority == osl_Thread_PriorityNormal)
226cdf0e10cSrcweir         {
22744e8df1fSDamjan Jovanovic             printf("Prio is normal\n");
228cdf0e10cSrcweir         }
229cdf0e10cSrcweir         else if (_aPriority == osl_Thread_PriorityBelowNormal)
230cdf0e10cSrcweir         {
23144e8df1fSDamjan Jovanovic             printf("Prio is below normal\n");
232cdf0e10cSrcweir         }
233cdf0e10cSrcweir         else if (_aPriority == osl_Thread_PriorityLowest)
234cdf0e10cSrcweir         {
23544e8df1fSDamjan Jovanovic             printf("Prio is lowest\n");
236cdf0e10cSrcweir         }
237cdf0e10cSrcweir         else
238cdf0e10cSrcweir         {
23944e8df1fSDamjan Jovanovic             printf("Prio is unknown\n");
240cdf0e10cSrcweir         }
241cdf0e10cSrcweir     }
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir /** Simple thread for testing Thread-create.
245cdf0e10cSrcweir 
246cdf0e10cSrcweir     Just add 1 of value 0, and after running, result is 1.
247cdf0e10cSrcweir  */
248cdf0e10cSrcweir class myThread : public Thread
249cdf0e10cSrcweir {
250cdf0e10cSrcweir     ThreadSafeValue<sal_Int32> m_aFlag;
251cdf0e10cSrcweir public:
getValue()252cdf0e10cSrcweir     sal_Int32 getValue() { return m_aFlag.getValue(); }
253cdf0e10cSrcweir protected:
254cdf0e10cSrcweir     /** guarded value which initialized 0
255cdf0e10cSrcweir 
256cdf0e10cSrcweir         @see ThreadSafeValue
257cdf0e10cSrcweir     */
run()258cdf0e10cSrcweir     void SAL_CALL run()
259cdf0e10cSrcweir         {
260cdf0e10cSrcweir             while(schedule())
261cdf0e10cSrcweir             {
262cdf0e10cSrcweir                 m_aFlag.addValue(1);
263cdf0e10cSrcweir                 ThreadHelper::thread_sleep_tenth_sec(1);
264cdf0e10cSrcweir             }
265cdf0e10cSrcweir         }
266cdf0e10cSrcweir 
267cdf0e10cSrcweir public:
268cdf0e10cSrcweir 
suspend()269cdf0e10cSrcweir     virtual void SAL_CALL suspend()
270cdf0e10cSrcweir         {
271cdf0e10cSrcweir             m_aFlag.acquire();
272cdf0e10cSrcweir             ::osl::Thread::suspend();
273cdf0e10cSrcweir             m_aFlag.release();
274cdf0e10cSrcweir         }
275cdf0e10cSrcweir 
~myThread()276cdf0e10cSrcweir     ~myThread()
277cdf0e10cSrcweir         {
278cdf0e10cSrcweir             if (isRunning())
279cdf0e10cSrcweir             {
28044e8df1fSDamjan Jovanovic                 printf("error: not terminated.\n");
281cdf0e10cSrcweir             }
282cdf0e10cSrcweir         }
283cdf0e10cSrcweir 
284cdf0e10cSrcweir };
285cdf0e10cSrcweir 
286cdf0e10cSrcweir // -----------------------------------------------------------------------------
287cdf0e10cSrcweir /** Thread which has a flag add 1 every second until 20
288cdf0e10cSrcweir  */
289cdf0e10cSrcweir class OCountThread : public Thread
290cdf0e10cSrcweir {
291cdf0e10cSrcweir     ThreadSafeValue<sal_Int32> m_aFlag;
292cdf0e10cSrcweir public:
OCountThread()293cdf0e10cSrcweir     OCountThread()
294cdf0e10cSrcweir         {
295cdf0e10cSrcweir             m_nWaitSec = 0;
29644e8df1fSDamjan Jovanovic             printf("new OCountThread thread %d!\n", getIdentifier());
297cdf0e10cSrcweir         }
getValue()298cdf0e10cSrcweir     sal_Int32 getValue() { return m_aFlag.getValue(); }
299cdf0e10cSrcweir 
setWait(sal_Int32 nSec)300cdf0e10cSrcweir     void setWait(sal_Int32 nSec)
301cdf0e10cSrcweir         {
302cdf0e10cSrcweir             m_nWaitSec = nSec;
303cdf0e10cSrcweir             //m_bWait = sal_True;
304cdf0e10cSrcweir         }
305cdf0e10cSrcweir 
suspend()306cdf0e10cSrcweir     virtual void SAL_CALL suspend()
307cdf0e10cSrcweir         {
308cdf0e10cSrcweir             m_aFlag.acquire();
309cdf0e10cSrcweir             ::osl::Thread::suspend();
310cdf0e10cSrcweir             m_aFlag.release();
311cdf0e10cSrcweir         }
312cdf0e10cSrcweir 
313cdf0e10cSrcweir protected:
314cdf0e10cSrcweir     //sal_Bool m_bWait;
315cdf0e10cSrcweir     sal_Int32 m_nWaitSec;
316cdf0e10cSrcweir 
run()317cdf0e10cSrcweir     void SAL_CALL run()
318cdf0e10cSrcweir         {
319cdf0e10cSrcweir             /// if the thread should terminate, schedule return false
320cdf0e10cSrcweir             while (m_aFlag.getValue() < 20 && schedule() == sal_True)
321cdf0e10cSrcweir             {
322cdf0e10cSrcweir                 m_aFlag.addValue(1);
323cdf0e10cSrcweir                 ThreadHelper::thread_sleep_tenth_sec(1);
324cdf0e10cSrcweir                 // TimeValue nTV;
325cdf0e10cSrcweir                 // nTV.Seconds = 1;
326cdf0e10cSrcweir                 // nTV.Nanosec = 0;
327cdf0e10cSrcweir                 // wait(nTV);
328cdf0e10cSrcweir 
329cdf0e10cSrcweir                 if (m_nWaitSec != 0)
330cdf0e10cSrcweir                 {
331cdf0e10cSrcweir                     //ThreadHelper::thread_sleep_tenth_sec(m_nWaitSec * 10);
332cdf0e10cSrcweir                     TimeValue nTV;
333cdf0e10cSrcweir                     nTV.Seconds = m_nWaitSec / 10 ;
334cdf0e10cSrcweir                     nTV.Nanosec = ( m_nWaitSec%10 ) * 100000000 ;
335cdf0e10cSrcweir                     wait( nTV );
336cdf0e10cSrcweir                     m_nWaitSec = 0;
337cdf0e10cSrcweir                 }
338cdf0e10cSrcweir             }
339cdf0e10cSrcweir         }
onTerminated()340cdf0e10cSrcweir     void SAL_CALL onTerminated()
341cdf0e10cSrcweir         {
34244e8df1fSDamjan Jovanovic             printf("normally terminate this thread %d!\n", getIdentifier());
343cdf0e10cSrcweir         }
344cdf0e10cSrcweir public:
345cdf0e10cSrcweir 
~OCountThread()346cdf0e10cSrcweir     ~OCountThread()
347cdf0e10cSrcweir         {
348cdf0e10cSrcweir             if (isRunning())
349cdf0e10cSrcweir             {
35044e8df1fSDamjan Jovanovic                 printf("error: not terminated.\n");
351cdf0e10cSrcweir             }
352cdf0e10cSrcweir         }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir };
355cdf0e10cSrcweir 
356cdf0e10cSrcweir /** call suspend in the run method
357cdf0e10cSrcweir */
358cdf0e10cSrcweir class OSuspendThread : public Thread
359cdf0e10cSrcweir {
360cdf0e10cSrcweir     ThreadSafeValue<sal_Int32> m_aFlag;
361cdf0e10cSrcweir public:
OSuspendThread()362cdf0e10cSrcweir     OSuspendThread(){ m_bSuspend = sal_False; }
getValue()363cdf0e10cSrcweir     sal_Int32 getValue() { return m_aFlag.getValue(); }
setSuspend()364cdf0e10cSrcweir     void setSuspend()
365cdf0e10cSrcweir         {
366cdf0e10cSrcweir             m_bSuspend = sal_True;
367cdf0e10cSrcweir         }
suspend()368cdf0e10cSrcweir     virtual void SAL_CALL suspend()
369cdf0e10cSrcweir         {
370cdf0e10cSrcweir             m_aFlag.acquire();
371cdf0e10cSrcweir             ::osl::Thread::suspend();
372cdf0e10cSrcweir             m_aFlag.release();
373cdf0e10cSrcweir         }
374cdf0e10cSrcweir protected:
375cdf0e10cSrcweir     sal_Bool m_bSuspend;
run()376cdf0e10cSrcweir     void SAL_CALL run()
377cdf0e10cSrcweir         {
378cdf0e10cSrcweir             //if the thread should terminate, schedule return false
379cdf0e10cSrcweir             while (schedule() == sal_True)
380cdf0e10cSrcweir             {
381cdf0e10cSrcweir                 m_aFlag.addValue(1);
382cdf0e10cSrcweir 
383cdf0e10cSrcweir                 ThreadHelper::thread_sleep_tenth_sec(1);
384cdf0e10cSrcweir                 // m_bWait =    sal_False;
385cdf0e10cSrcweir                 // TimeValue nTV;
386cdf0e10cSrcweir                 // nTV.Seconds = 1;
387cdf0e10cSrcweir                 // nTV.Nanosec = 0;
388cdf0e10cSrcweir                 // wait(nTV);
389cdf0e10cSrcweir                 if (m_bSuspend == sal_True)
390cdf0e10cSrcweir                 {
391cdf0e10cSrcweir                     suspend();
392cdf0e10cSrcweir                     m_bSuspend  = sal_False;
393cdf0e10cSrcweir                 }
394cdf0e10cSrcweir             }
395cdf0e10cSrcweir         }
396cdf0e10cSrcweir public:
397cdf0e10cSrcweir 
~OSuspendThread()398cdf0e10cSrcweir     ~OSuspendThread()
399cdf0e10cSrcweir         {
400cdf0e10cSrcweir             if (isRunning())
401cdf0e10cSrcweir             {
40244e8df1fSDamjan Jovanovic                 printf("error: not terminated.\n");
403cdf0e10cSrcweir             }
404cdf0e10cSrcweir         }
405cdf0e10cSrcweir 
406cdf0e10cSrcweir };
407cdf0e10cSrcweir 
408cdf0e10cSrcweir /** no call schedule in the run method
409cdf0e10cSrcweir */
410cdf0e10cSrcweir class ONoScheduleThread : public Thread
411cdf0e10cSrcweir {
412cdf0e10cSrcweir     ThreadSafeValue<sal_Int32> m_aFlag;
413cdf0e10cSrcweir public:
getValue()414cdf0e10cSrcweir     sal_Int32 getValue() { return m_aFlag.getValue(); }
415cdf0e10cSrcweir 
suspend()416cdf0e10cSrcweir     virtual void SAL_CALL suspend()
417cdf0e10cSrcweir         {
418cdf0e10cSrcweir             m_aFlag.acquire();
419cdf0e10cSrcweir             ::osl::Thread::suspend();
420cdf0e10cSrcweir             m_aFlag.release();
421cdf0e10cSrcweir         }
422cdf0e10cSrcweir protected:
run()423cdf0e10cSrcweir     void SAL_CALL run()
424cdf0e10cSrcweir         {
425cdf0e10cSrcweir             while (m_aFlag.getValue() < 10)
426cdf0e10cSrcweir             {
427cdf0e10cSrcweir                 m_aFlag.addValue(1);
428cdf0e10cSrcweir                 ThreadHelper::thread_sleep_tenth_sec(1);
429cdf0e10cSrcweir                 // TimeValue nTV;
430cdf0e10cSrcweir                 // nTV.Seconds = 1;
431cdf0e10cSrcweir                 // nTV.Nanosec = 0;
432cdf0e10cSrcweir                 // wait(nTV);
433cdf0e10cSrcweir             }
434cdf0e10cSrcweir         }
onTerminated()435cdf0e10cSrcweir     void SAL_CALL onTerminated()
436cdf0e10cSrcweir         {
43744e8df1fSDamjan Jovanovic             printf("normally terminate this thread %d!\n", getIdentifier());
438cdf0e10cSrcweir         }
439cdf0e10cSrcweir public:
ONoScheduleThread()440cdf0e10cSrcweir     ONoScheduleThread()
441cdf0e10cSrcweir         {
44244e8df1fSDamjan Jovanovic                 printf("new thread id %d!\n", getIdentifier());
443cdf0e10cSrcweir         }
~ONoScheduleThread()444cdf0e10cSrcweir     ~ONoScheduleThread()
445cdf0e10cSrcweir         {
446cdf0e10cSrcweir             if (isRunning())
447cdf0e10cSrcweir             {
44844e8df1fSDamjan Jovanovic                 printf("error: not terminated.\n");
449cdf0e10cSrcweir             }
450cdf0e10cSrcweir         }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir };
453cdf0e10cSrcweir 
454cdf0e10cSrcweir /**
455cdf0e10cSrcweir */
456cdf0e10cSrcweir class OAddThread : public Thread
457cdf0e10cSrcweir {
458cdf0e10cSrcweir     ThreadSafeValue<sal_Int32> m_aFlag;
459cdf0e10cSrcweir public:
460cdf0e10cSrcweir     //oslThreadIdentifier m_id, m_CurId;
OAddThread()461cdf0e10cSrcweir     OAddThread(){}
getValue()462cdf0e10cSrcweir     sal_Int32 getValue() { return m_aFlag.getValue(); }
463cdf0e10cSrcweir 
suspend()464cdf0e10cSrcweir     virtual void SAL_CALL suspend()
465cdf0e10cSrcweir         {
466cdf0e10cSrcweir             m_aFlag.acquire();
467cdf0e10cSrcweir             ::osl::Thread::suspend();
468cdf0e10cSrcweir             m_aFlag.release();
469cdf0e10cSrcweir         }
470cdf0e10cSrcweir protected:
run()471cdf0e10cSrcweir     void SAL_CALL run()
472cdf0e10cSrcweir         {
473cdf0e10cSrcweir             //if the thread should terminate, schedule return false
474cdf0e10cSrcweir             while (schedule() == sal_True)
475cdf0e10cSrcweir             {
476cdf0e10cSrcweir                 m_aFlag.addValue(1);
477cdf0e10cSrcweir             }
478cdf0e10cSrcweir         }
onTerminated()479cdf0e10cSrcweir     void SAL_CALL onTerminated()
480cdf0e10cSrcweir         {
48144e8df1fSDamjan Jovanovic             // printf("normally terminate this thread %d!\n", getIdentifier());
482cdf0e10cSrcweir         }
483cdf0e10cSrcweir public:
484cdf0e10cSrcweir 
~OAddThread()485cdf0e10cSrcweir     ~OAddThread()
486cdf0e10cSrcweir         {
487cdf0e10cSrcweir             if (isRunning())
488cdf0e10cSrcweir             {
48944e8df1fSDamjan Jovanovic                 // printf("error: not terminated.\n");
490cdf0e10cSrcweir             }
491cdf0e10cSrcweir         }
492cdf0e10cSrcweir 
493cdf0e10cSrcweir };
494cdf0e10cSrcweir 
495cdf0e10cSrcweir namespace osl_Thread
496cdf0e10cSrcweir {
497cdf0e10cSrcweir 
resumeAndWaitThread(Thread * _pThread)498cdf0e10cSrcweir     void resumeAndWaitThread(Thread* _pThread)
499cdf0e10cSrcweir     {
500cdf0e10cSrcweir         // This functions starts a thread, wait a second and suspends the thread
501cdf0e10cSrcweir         // Due to the fact, that a suspend and never run thread never really exists.
502cdf0e10cSrcweir 
503cdf0e10cSrcweir         // Note: on UNX, after createSuspended, and then terminate the thread, it performs well;
504cdf0e10cSrcweir         // while on Windows, after createSuspended, the thread can not terminate, wait endlessly,
505cdf0e10cSrcweir         // so here call resume at first, then call terminate.
506cdf0e10cSrcweir #ifdef WNT
50744e8df1fSDamjan Jovanovic         printf("resumeAndWaitThread\n");
508cdf0e10cSrcweir         _pThread->resume();
509cdf0e10cSrcweir         ThreadHelper::thread_sleep_tenth_sec(1);
510cdf0e10cSrcweir #else
511cdf0e10cSrcweir         _pThread->resume();
512cdf0e10cSrcweir #endif
513cdf0e10cSrcweir         // ThreadHelper::thread_sleep_tenth_sec(1);
514cdf0e10cSrcweir         // _pThread->suspend();
515cdf0e10cSrcweir         // ThreadHelper::thread_sleep_tenth_sec(1);
516cdf0e10cSrcweir     }
517cdf0e10cSrcweir 
518cdf0e10cSrcweir     // kill a running thread and join it, if it has terminated, do nothing
termAndJoinThread(Thread * _pThread)519cdf0e10cSrcweir     void termAndJoinThread(Thread* _pThread)
520cdf0e10cSrcweir     {
521cdf0e10cSrcweir         _pThread->terminate();
522cdf0e10cSrcweir 
523cdf0e10cSrcweir // LLA: Windows feature???, a suspended thread can not terminated, so we have to weak it up
524cdf0e10cSrcweir #ifdef WNT
525cdf0e10cSrcweir         _pThread->resume();
526cdf0e10cSrcweir         ThreadHelper::thread_sleep_tenth_sec(1);
527cdf0e10cSrcweir #endif
52844e8df1fSDamjan Jovanovic         printf("#wait for join.\n");
529cdf0e10cSrcweir         _pThread->join();
530cdf0e10cSrcweir     }
531cdf0e10cSrcweir /** Test of the osl::Thread::create method
532cdf0e10cSrcweir  */
533cdf0e10cSrcweir 
53444e8df1fSDamjan Jovanovic     class create : public ::testing::Test
535cdf0e10cSrcweir     {
536cdf0e10cSrcweir     public:
537cdf0e10cSrcweir 
538cdf0e10cSrcweir         // initialise your test code values here.
SetUp()53944e8df1fSDamjan Jovanovic         void SetUp()
540cdf0e10cSrcweir             {
541cdf0e10cSrcweir             }
542cdf0e10cSrcweir 
TearDown()54344e8df1fSDamjan Jovanovic         void TearDown()
544cdf0e10cSrcweir             {
545cdf0e10cSrcweir             }
54644e8df1fSDamjan Jovanovic     }; // class create
547cdf0e10cSrcweir 
548cdf0e10cSrcweir 
54944e8df1fSDamjan Jovanovic     /** Simple create a thread.
550cdf0e10cSrcweir 
55144e8df1fSDamjan Jovanovic         Create a simple thread, it just does add 1 to value(which initialized 0),
55244e8df1fSDamjan Jovanovic         if the thread run, the value should be 1.
55344e8df1fSDamjan Jovanovic     */
TEST_F(create,create_001)55444e8df1fSDamjan Jovanovic     TEST_F(create, create_001)
55544e8df1fSDamjan Jovanovic         {
55644e8df1fSDamjan Jovanovic             myThread* newthread = new myThread();
55744e8df1fSDamjan Jovanovic             sal_Bool bRes = newthread->create();
55844e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can not creates a new thread!\n";
559cdf0e10cSrcweir 
56044e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(1);        // wait short
56144e8df1fSDamjan Jovanovic             sal_Bool isRunning = newthread->isRunning();    // check if thread is running
56244e8df1fSDamjan Jovanovic             /// wait for the new thread to assure it has run
56344e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
56444e8df1fSDamjan Jovanovic             sal_Int32 nValue = newthread->getValue();
56544e8df1fSDamjan Jovanovic             /// to assure the new thread has terminated
56644e8df1fSDamjan Jovanovic             termAndJoinThread(newthread);
56744e8df1fSDamjan Jovanovic             delete newthread;
568cdf0e10cSrcweir 
56944e8df1fSDamjan Jovanovic             printf("   nValue = %d\n", nValue);
57044e8df1fSDamjan Jovanovic             printf("isRunning = %d\n", isRunning);
571cdf0e10cSrcweir 
57244e8df1fSDamjan Jovanovic             ASSERT_TRUE(nValue >= 1 && isRunning == sal_True) << "Creates a new thread";
573cdf0e10cSrcweir 
57444e8df1fSDamjan Jovanovic         }
57544e8df1fSDamjan Jovanovic 
57644e8df1fSDamjan Jovanovic     /** only one running thread per instance, return false if create secondly
57744e8df1fSDamjan Jovanovic      */
TEST_F(create,create_002)57844e8df1fSDamjan Jovanovic     TEST_F(create, create_002)
57944e8df1fSDamjan Jovanovic         {
58044e8df1fSDamjan Jovanovic             myThread* newthread = new myThread();
58144e8df1fSDamjan Jovanovic             sal_Bool res1 = newthread->create();
58244e8df1fSDamjan Jovanovic             sal_Bool res2 = newthread->create();
583*30acf5e8Spfg             printf("In non pro, an assertion should occurred. This behaviour is right.\n");
58444e8df1fSDamjan Jovanovic             termAndJoinThread(newthread);
58544e8df1fSDamjan Jovanovic             delete newthread;
58644e8df1fSDamjan Jovanovic 
58744e8df1fSDamjan Jovanovic             ASSERT_TRUE(res1 && !res2) << "Creates a new thread: can not create two threads per instance";
58844e8df1fSDamjan Jovanovic 
58944e8df1fSDamjan Jovanovic         }
590cdf0e10cSrcweir 
591cdf0e10cSrcweir 
592cdf0e10cSrcweir     /** Test of the osl::Thread::createSuspended method
593cdf0e10cSrcweir     */
59444e8df1fSDamjan Jovanovic     class createSuspended : public ::testing::Test
595cdf0e10cSrcweir     {
596cdf0e10cSrcweir     public:
597cdf0e10cSrcweir         // initialise your test code values here.
SetUp()59844e8df1fSDamjan Jovanovic         void SetUp()
599cdf0e10cSrcweir             {
600cdf0e10cSrcweir             }
601cdf0e10cSrcweir 
TearDown()60244e8df1fSDamjan Jovanovic         void TearDown()
603cdf0e10cSrcweir             {
604cdf0e10cSrcweir             }
60544e8df1fSDamjan Jovanovic     }; // class createSuspended
606cdf0e10cSrcweir 
60744e8df1fSDamjan Jovanovic     /** Create a suspended thread, use the same class as create_001
608cdf0e10cSrcweir 
60944e8df1fSDamjan Jovanovic         after create, wait enough time, check the value, if it's still the initial value, pass
61044e8df1fSDamjan Jovanovic     */
TEST_F(createSuspended,createSuspended_001)61144e8df1fSDamjan Jovanovic     TEST_F(createSuspended, createSuspended_001)
61244e8df1fSDamjan Jovanovic         {
61344e8df1fSDamjan Jovanovic             myThread* newthread = new myThread();
61444e8df1fSDamjan Jovanovic             sal_Bool bRes = newthread->createSuspended();
61544e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can not creates a new thread!";
616cdf0e10cSrcweir 
61744e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(1);
61844e8df1fSDamjan Jovanovic             sal_Bool isRunning = newthread->isRunning();
61944e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
62044e8df1fSDamjan Jovanovic             sal_Int32 nValue = newthread->getValue();
621cdf0e10cSrcweir 
62244e8df1fSDamjan Jovanovic             resumeAndWaitThread(newthread);
623cdf0e10cSrcweir 
62444e8df1fSDamjan Jovanovic             termAndJoinThread(newthread);
62544e8df1fSDamjan Jovanovic             delete newthread;
626cdf0e10cSrcweir 
62744e8df1fSDamjan Jovanovic             ASSERT_TRUE(nValue == 0 && isRunning) << "Creates a new suspended thread";
62844e8df1fSDamjan Jovanovic         }
62944e8df1fSDamjan Jovanovic     // LLA: Deadlocked!!!
TEST_F(createSuspended,createSuspended_002)63044e8df1fSDamjan Jovanovic     TEST_F(createSuspended, createSuspended_002)
63144e8df1fSDamjan Jovanovic         {
63244e8df1fSDamjan Jovanovic             myThread* newthread = new myThread();
63344e8df1fSDamjan Jovanovic             sal_Bool res1 = newthread->createSuspended();
63444e8df1fSDamjan Jovanovic             sal_Bool res2 = newthread->createSuspended();
635cdf0e10cSrcweir 
63644e8df1fSDamjan Jovanovic             resumeAndWaitThread(newthread);
637cdf0e10cSrcweir 
63844e8df1fSDamjan Jovanovic             termAndJoinThread(newthread);
639cdf0e10cSrcweir 
64044e8df1fSDamjan Jovanovic             delete newthread;
641cdf0e10cSrcweir 
64244e8df1fSDamjan Jovanovic             ASSERT_TRUE(res1 && !res2) << "Creates a new thread: can not create two threads per instance";
64344e8df1fSDamjan Jovanovic         }
644cdf0e10cSrcweir 
645cdf0e10cSrcweir 
646cdf0e10cSrcweir     /** when the count value equal to or more than 3, suspend the thread.
647cdf0e10cSrcweir     */
suspendCountThread(OCountThread * _pCountThread)648cdf0e10cSrcweir     void suspendCountThread(OCountThread* _pCountThread)
649cdf0e10cSrcweir     {
650cdf0e10cSrcweir         sal_Int32 nValue = 0;
651cdf0e10cSrcweir         while (1)
652cdf0e10cSrcweir         {
653cdf0e10cSrcweir             nValue = _pCountThread->getValue();
654cdf0e10cSrcweir             if (nValue >= 3)
655cdf0e10cSrcweir             {
656cdf0e10cSrcweir                 _pCountThread->suspend();
657cdf0e10cSrcweir                 break;
658cdf0e10cSrcweir             }
659cdf0e10cSrcweir         }
660cdf0e10cSrcweir     }
661cdf0e10cSrcweir 
662cdf0e10cSrcweir     /** Test of the osl::Thread::suspend method
663cdf0e10cSrcweir     */
66444e8df1fSDamjan Jovanovic     class suspend : public ::testing::Test
665cdf0e10cSrcweir     {
666cdf0e10cSrcweir     public:
667cdf0e10cSrcweir         // initialise your test code values here.
SetUp()66844e8df1fSDamjan Jovanovic         void SetUp()
669cdf0e10cSrcweir             {
670cdf0e10cSrcweir             }
671cdf0e10cSrcweir 
TearDown()67244e8df1fSDamjan Jovanovic         void TearDown()
673cdf0e10cSrcweir             {
674cdf0e10cSrcweir             }
67544e8df1fSDamjan Jovanovic     }; // class suspend
676cdf0e10cSrcweir 
67744e8df1fSDamjan Jovanovic     /** Use a thread which has a flag added 1 every second
678cdf0e10cSrcweir 
67944e8df1fSDamjan Jovanovic         ALGORITHM:
68044e8df1fSDamjan Jovanovic         create the thread, after running special time, record value of flag, then suspend it,
68144e8df1fSDamjan Jovanovic         wait a long time, check the flag, if it remains unchanged during suspending
68244e8df1fSDamjan Jovanovic     */
TEST_F(suspend,suspend_001)68344e8df1fSDamjan Jovanovic     TEST_F(suspend, suspend_001)
68444e8df1fSDamjan Jovanovic         {
68544e8df1fSDamjan Jovanovic             OCountThread* aCountThread = new OCountThread();
68644e8df1fSDamjan Jovanovic             sal_Bool bRes = aCountThread->create();
68744e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
68844e8df1fSDamjan Jovanovic             // the thread run for some seconds, but not terminate
68944e8df1fSDamjan Jovanovic             suspendCountThread( aCountThread );
690cdf0e10cSrcweir 
69144e8df1fSDamjan Jovanovic             // the value just after calling suspend
69244e8df1fSDamjan Jovanovic             sal_Int32 nValue = aCountThread->getValue();       // (2)
693cdf0e10cSrcweir 
69444e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
695cdf0e10cSrcweir 
69644e8df1fSDamjan Jovanovic             // the value after waiting 3 seconds
69744e8df1fSDamjan Jovanovic             sal_Int32 nLaterValue = aCountThread->getValue();    // (3)
698cdf0e10cSrcweir 
69944e8df1fSDamjan Jovanovic             resumeAndWaitThread(aCountThread);
70044e8df1fSDamjan Jovanovic             termAndJoinThread(aCountThread);
70144e8df1fSDamjan Jovanovic             delete aCountThread;
702cdf0e10cSrcweir 
70344e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True && nValue == nLaterValue) << "Suspend the thread";
704cdf0e10cSrcweir 
70544e8df1fSDamjan Jovanovic         }
70644e8df1fSDamjan Jovanovic     /** suspend a thread in it's worker-function, the ALGORITHM is same as suspend_001
70744e8df1fSDamjan Jovanovic          reason of deadlocked I think: no schedule can schedule other threads to go on excuting
70844e8df1fSDamjan Jovanovic      */
TEST_F(suspend,suspend_002)70944e8df1fSDamjan Jovanovic     TEST_F(suspend, suspend_002)
71044e8df1fSDamjan Jovanovic         {
71144e8df1fSDamjan Jovanovic #if 0
71244e8df1fSDamjan Jovanovic             OSuspendThread* aThread = new OSuspendThread();
71344e8df1fSDamjan Jovanovic             sal_Bool bRes = aThread->create();
71444e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
71544e8df1fSDamjan Jovanovic             // first the thread run for some seconds, but not terminate
71644e8df1fSDamjan Jovanovic             sal_Int32 nValue = 0;
71744e8df1fSDamjan Jovanovic             //while (1)
71844e8df1fSDamjan Jovanovic             //{
71944e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
72044e8df1fSDamjan Jovanovic             nValue = aThread->getValue();    // (1)
72144e8df1fSDamjan Jovanovic             printf(" getValue is %d !", nValue );
72244e8df1fSDamjan Jovanovic             if (nValue >= 2)
723cdf0e10cSrcweir             {
72444e8df1fSDamjan Jovanovic                     aThread->setSuspend();
72544e8df1fSDamjan Jovanovic                     //break;
726cdf0e10cSrcweir             }
72744e8df1fSDamjan Jovanovic             //}
72844e8df1fSDamjan Jovanovic             printf(" after while!");
72944e8df1fSDamjan Jovanovic             // the value just after calling suspend
73044e8df1fSDamjan Jovanovic             nValue = aThread->getValue();       // (2)
73144e8df1fSDamjan Jovanovic 
73244e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
73344e8df1fSDamjan Jovanovic             printf(" after sleep!");
73444e8df1fSDamjan Jovanovic             // the value after waiting 3 seconds
73544e8df1fSDamjan Jovanovic             sal_Int32 nLaterValue = aThread->getValue();        // (3)
73644e8df1fSDamjan Jovanovic 
73744e8df1fSDamjan Jovanovic             //resumeAndWaitThread(aThread);
73844e8df1fSDamjan Jovanovic             aThread->resume();
73944e8df1fSDamjan Jovanovic             termAndJoinThread(aThread);
74044e8df1fSDamjan Jovanovic             delete aThread;
74144e8df1fSDamjan Jovanovic 
74244e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True && nValue == nLaterValue) << "Suspend the thread";
74344e8df1fSDamjan Jovanovic #endif
74444e8df1fSDamjan Jovanovic         }
745cdf0e10cSrcweir 
746cdf0e10cSrcweir 
747cdf0e10cSrcweir     /** Test of the osl::Thread::resume method
748cdf0e10cSrcweir     */
74944e8df1fSDamjan Jovanovic     class resume : public ::testing::Test
750cdf0e10cSrcweir     {
751cdf0e10cSrcweir     public:
752cdf0e10cSrcweir         // initialise your test code values here.
SetUp()75344e8df1fSDamjan Jovanovic         void SetUp()
754cdf0e10cSrcweir             {
755cdf0e10cSrcweir             }
756cdf0e10cSrcweir 
TearDown()75744e8df1fSDamjan Jovanovic         void TearDown()
758cdf0e10cSrcweir             {
759cdf0e10cSrcweir             }
76044e8df1fSDamjan Jovanovic     }; // class resume
761cdf0e10cSrcweir 
76244e8df1fSDamjan Jovanovic     /** check if the thread run samely as usual after suspend and resume
763cdf0e10cSrcweir 
76444e8df1fSDamjan Jovanovic         ALGORITHM:
76544e8df1fSDamjan Jovanovic         compare the values before and after suspend, they should be same,
76644e8df1fSDamjan Jovanovic         then compare values before and after resume, the difference should be same as the sleep seconds number
76744e8df1fSDamjan Jovanovic     */
TEST_F(resume,resume_001)76844e8df1fSDamjan Jovanovic     TEST_F(resume, resume_001)
76944e8df1fSDamjan Jovanovic         {
77044e8df1fSDamjan Jovanovic             OCountThread* pCountThread = new OCountThread();
77144e8df1fSDamjan Jovanovic             sal_Bool bRes = pCountThread->create();
77244e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
773cdf0e10cSrcweir 
77444e8df1fSDamjan Jovanovic             suspendCountThread(pCountThread);
775cdf0e10cSrcweir 
77644e8df1fSDamjan Jovanovic             sal_Int32 nSuspendValue = pCountThread->getValue();  // (2)
77744e8df1fSDamjan Jovanovic             // suspend for 3 seconds
77844e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
77944e8df1fSDamjan Jovanovic             pCountThread->resume();
780cdf0e10cSrcweir 
78144e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
78244e8df1fSDamjan Jovanovic             sal_Int32 nResumeValue = pCountThread->getValue();
783cdf0e10cSrcweir 
78444e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
78544e8df1fSDamjan Jovanovic             sal_Int32 nLaterValue = pCountThread->getValue();
786cdf0e10cSrcweir 
78744e8df1fSDamjan Jovanovic             termAndJoinThread(pCountThread);
78844e8df1fSDamjan Jovanovic             delete pCountThread;
789cdf0e10cSrcweir 
79044e8df1fSDamjan Jovanovic             printf("SuspendValue: %d\n", nSuspendValue);
79144e8df1fSDamjan Jovanovic             printf("ResumeValue:  %d\n", nResumeValue);
79244e8df1fSDamjan Jovanovic             printf("LaterValue:   %d\n", nLaterValue);
793cdf0e10cSrcweir 
79444e8df1fSDamjan Jovanovic             /* LLA: this assumption is no longer relevant: nResumeValue ==  nSuspendValue && */
79544e8df1fSDamjan Jovanovic             ASSERT_TRUE(nLaterValue >= 9 &&
79644e8df1fSDamjan Jovanovic                 nResumeValue > nSuspendValue &&
79744e8df1fSDamjan Jovanovic                 nLaterValue > nResumeValue) << "Suspend then resume the thread";
798cdf0e10cSrcweir 
79944e8df1fSDamjan Jovanovic         }
800cdf0e10cSrcweir 
80144e8df1fSDamjan Jovanovic     /** Create a suspended thread then resume, check if the thread has run
80244e8df1fSDamjan Jovanovic      */
TEST_F(resume,resume_002)80344e8df1fSDamjan Jovanovic     TEST_F(resume, resume_002)
80444e8df1fSDamjan Jovanovic         {
80544e8df1fSDamjan Jovanovic             myThread* newthread = new myThread();
80644e8df1fSDamjan Jovanovic             sal_Bool bRes = newthread->createSuspended();
80744e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't create thread!";
808cdf0e10cSrcweir 
80944e8df1fSDamjan Jovanovic             newthread->resume();
81044e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
81144e8df1fSDamjan Jovanovic             sal_Int32 nValue = newthread->getValue();
812cdf0e10cSrcweir 
81344e8df1fSDamjan Jovanovic             termAndJoinThread(newthread);
81444e8df1fSDamjan Jovanovic             delete newthread;
815cdf0e10cSrcweir 
81644e8df1fSDamjan Jovanovic             printf("   nValue = %d\n", nValue);
817cdf0e10cSrcweir 
81844e8df1fSDamjan Jovanovic             ASSERT_TRUE(nValue >= 1) << "Creates a suspended thread, then resume";
81944e8df1fSDamjan Jovanovic         }
820cdf0e10cSrcweir 
821cdf0e10cSrcweir     /** Test of the osl::Thread::terminate method
822cdf0e10cSrcweir     */
82344e8df1fSDamjan Jovanovic     class terminate : public ::testing::Test
824cdf0e10cSrcweir     {
825cdf0e10cSrcweir     public:
826cdf0e10cSrcweir         // initialise your test code values here.
SetUp()82744e8df1fSDamjan Jovanovic         void SetUp()
828cdf0e10cSrcweir             {
829cdf0e10cSrcweir             }
830cdf0e10cSrcweir 
TearDown()83144e8df1fSDamjan Jovanovic         void TearDown()
832cdf0e10cSrcweir             {
833cdf0e10cSrcweir             }
83444e8df1fSDamjan Jovanovic     }; // class terminate
835cdf0e10cSrcweir 
83644e8df1fSDamjan Jovanovic     /** Check after call terminate if the running thread running go on executing
837cdf0e10cSrcweir 
83844e8df1fSDamjan Jovanovic         ALGORITHM:
83944e8df1fSDamjan Jovanovic         before and after call terminate, the values should be the same
84044e8df1fSDamjan Jovanovic     */
TEST_F(terminate,terminate_001)84144e8df1fSDamjan Jovanovic     TEST_F(terminate, terminate_001)
84244e8df1fSDamjan Jovanovic         {
84344e8df1fSDamjan Jovanovic             OCountThread* aCountThread = new OCountThread();
84444e8df1fSDamjan Jovanovic             sal_Bool bRes = aCountThread->create();
84544e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
846cdf0e10cSrcweir 
84744e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
84844e8df1fSDamjan Jovanovic             sal_Int32 nValue = aCountThread->getValue();
84944e8df1fSDamjan Jovanovic             aCountThread->terminate();
85044e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
85144e8df1fSDamjan Jovanovic             sal_Int32 nLaterValue = aCountThread->getValue();
85244e8df1fSDamjan Jovanovic 
85344e8df1fSDamjan Jovanovic             // isRunning should be false after terminate
85444e8df1fSDamjan Jovanovic             sal_Bool isRunning = aCountThread->isRunning();
85544e8df1fSDamjan Jovanovic             aCountThread->join();
85644e8df1fSDamjan Jovanovic             delete aCountThread;
857cdf0e10cSrcweir 
85844e8df1fSDamjan Jovanovic             printf("     nValue = %d\n", nValue);
85944e8df1fSDamjan Jovanovic             printf("nLaterValue = %d\n", nLaterValue);
860cdf0e10cSrcweir 
86144e8df1fSDamjan Jovanovic             ASSERT_TRUE(isRunning == sal_False && nLaterValue >= nValue) << "Terminate the thread";
86244e8df1fSDamjan Jovanovic         }
86344e8df1fSDamjan Jovanovic     /** Check if a suspended thread will terminate after call terminate, different on w32 and on UNX
86444e8df1fSDamjan Jovanovic      */
TEST_F(terminate,terminate_002)86544e8df1fSDamjan Jovanovic     TEST_F(terminate, terminate_002)
86644e8df1fSDamjan Jovanovic         {
86744e8df1fSDamjan Jovanovic             OCountThread* aCountThread = new OCountThread();
86844e8df1fSDamjan Jovanovic             sal_Bool bRes = aCountThread->create();
86944e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
870cdf0e10cSrcweir 
87144e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(1);
87244e8df1fSDamjan Jovanovic             suspendCountThread(aCountThread);
87344e8df1fSDamjan Jovanovic             sal_Int32 nValue = aCountThread->getValue();
874cdf0e10cSrcweir 
87544e8df1fSDamjan Jovanovic             // seems a suspended thread can not be terminated on W32, while on Solaris can
87644e8df1fSDamjan Jovanovic             resumeAndWaitThread(aCountThread);
877cdf0e10cSrcweir 
87844e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
87944e8df1fSDamjan Jovanovic 
88044e8df1fSDamjan Jovanovic             termAndJoinThread(aCountThread);
88144e8df1fSDamjan Jovanovic             sal_Int32 nLaterValue = aCountThread->getValue();
88244e8df1fSDamjan Jovanovic             delete aCountThread;
88344e8df1fSDamjan Jovanovic 
88444e8df1fSDamjan Jovanovic             printf("     nValue = %d\n", nValue);
88544e8df1fSDamjan Jovanovic             printf("nLaterValue = %d\n", nLaterValue);
88644e8df1fSDamjan Jovanovic 
88744e8df1fSDamjan Jovanovic             ASSERT_TRUE(nLaterValue > nValue) << "Suspend then resume the thread";
88844e8df1fSDamjan Jovanovic         }
889cdf0e10cSrcweir 
890cdf0e10cSrcweir 
891cdf0e10cSrcweir     /** Test of the osl::Thread::join method
892cdf0e10cSrcweir     */
89344e8df1fSDamjan Jovanovic     class join : public ::testing::Test
894cdf0e10cSrcweir     {
895cdf0e10cSrcweir     public:
896cdf0e10cSrcweir         // initialise your test code values here.
SetUp()89744e8df1fSDamjan Jovanovic         void SetUp()
898cdf0e10cSrcweir             {
899cdf0e10cSrcweir             }
900cdf0e10cSrcweir 
TearDown()90144e8df1fSDamjan Jovanovic         void TearDown()
902cdf0e10cSrcweir             {
903cdf0e10cSrcweir             }
90444e8df1fSDamjan Jovanovic     }; // class join
905cdf0e10cSrcweir 
90644e8df1fSDamjan Jovanovic     /** Check after call terminate if the thread running function will not go on executing
907cdf0e10cSrcweir 
90844e8df1fSDamjan Jovanovic         the next statement after join will not exec before the thread terminate
90944e8df1fSDamjan Jovanovic         ALGORITHM:
91044e8df1fSDamjan Jovanovic         recode system time at the beginning of the thread run, call join, then record system time again,
91144e8df1fSDamjan Jovanovic         the difference of the two time should be equal or more than 20 seconds, the CountThead normally terminate
91244e8df1fSDamjan Jovanovic     */
TEST_F(join,join_001)91344e8df1fSDamjan Jovanovic     TEST_F(join, join_001)
91444e8df1fSDamjan Jovanovic         {
91544e8df1fSDamjan Jovanovic             OCountThread *aCountThread = new OCountThread();
91644e8df1fSDamjan Jovanovic             sal_Bool bRes = aCountThread->create();
91744e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
918cdf0e10cSrcweir 
91944e8df1fSDamjan Jovanovic             StopWatch aStopWatch;
92044e8df1fSDamjan Jovanovic             aStopWatch.start();
92144e8df1fSDamjan Jovanovic             // TimeValue aTimeVal_befor;
92244e8df1fSDamjan Jovanovic             // osl_getSystemTime( &aTimeVal_befor );
92344e8df1fSDamjan Jovanovic             //printf("#join:the system time is %d,%d\n", pTimeVal_befor->Seconds,pTimeVal_befor->Nanosec);
924cdf0e10cSrcweir 
92544e8df1fSDamjan Jovanovic             aCountThread->join();
926cdf0e10cSrcweir 
92744e8df1fSDamjan Jovanovic             //the below line will be executed after aCountThread terminate
92844e8df1fSDamjan Jovanovic             // TimeValue aTimeVal_after;
92944e8df1fSDamjan Jovanovic             // osl_getSystemTime( &aTimeVal_after );
93044e8df1fSDamjan Jovanovic             aStopWatch.stop();
93144e8df1fSDamjan Jovanovic             // sal_uInt32 nSec  = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
93244e8df1fSDamjan Jovanovic             double nSec = aStopWatch.getSeconds();
93344e8df1fSDamjan Jovanovic             printf("join_001 nSec=%f\n", nSec);
93444e8df1fSDamjan Jovanovic             delete aCountThread;
93544e8df1fSDamjan Jovanovic 
93644e8df1fSDamjan Jovanovic             ASSERT_TRUE(nSec >= 2) << "Join the thread: after the thread terminate";
93744e8df1fSDamjan Jovanovic 
93844e8df1fSDamjan Jovanovic         }
93944e8df1fSDamjan Jovanovic     /** after terminated by another thread, join exited immediately
94044e8df1fSDamjan Jovanovic 
94144e8df1fSDamjan Jovanovic         ALGORITHM:
94244e8df1fSDamjan Jovanovic         terminate the thread when value>=3, call join, check the beginning time and time after join,
94344e8df1fSDamjan Jovanovic         the difference should be 3 seconds, join costs little time
94444e8df1fSDamjan Jovanovic     */
TEST_F(join,join_002)94544e8df1fSDamjan Jovanovic     TEST_F(join, join_002)
94644e8df1fSDamjan Jovanovic         {
94744e8df1fSDamjan Jovanovic             OCountThread *aCountThread = new OCountThread();
94844e8df1fSDamjan Jovanovic             sal_Bool bRes = aCountThread->create();
94944e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
95044e8df1fSDamjan Jovanovic 
95144e8df1fSDamjan Jovanovic             //record the time when the running begin
95244e8df1fSDamjan Jovanovic             // TimeValue aTimeVal_befor;
95344e8df1fSDamjan Jovanovic             // osl_getSystemTime( &aTimeVal_befor );
95444e8df1fSDamjan Jovanovic             StopWatch aStopWatch;
95544e8df1fSDamjan Jovanovic             aStopWatch.start();
95644e8df1fSDamjan Jovanovic 
95744e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(10);
95844e8df1fSDamjan Jovanovic             termAndJoinThread(aCountThread);
95944e8df1fSDamjan Jovanovic 
96044e8df1fSDamjan Jovanovic             //the below line will be executed after aCountThread terminate
96144e8df1fSDamjan Jovanovic             // TimeValue aTimeVal_after;
96244e8df1fSDamjan Jovanovic             // osl_getSystemTime( &aTimeVal_after );
96344e8df1fSDamjan Jovanovic             // sal_uInt32 nSec  = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
96444e8df1fSDamjan Jovanovic             aStopWatch.stop();
96544e8df1fSDamjan Jovanovic             double nSec = aStopWatch.getSeconds();
96644e8df1fSDamjan Jovanovic             printf("join_002 nSec=%f\n", nSec);
96744e8df1fSDamjan Jovanovic 
96844e8df1fSDamjan Jovanovic             delete aCountThread;
96944e8df1fSDamjan Jovanovic             ASSERT_TRUE(nSec >= 1) << "Join the thread: after thread terminate by another thread";
97044e8df1fSDamjan Jovanovic         }
971cdf0e10cSrcweir 
972cdf0e10cSrcweir     /** Test of the osl::Thread::isRunning method
973cdf0e10cSrcweir     */
97444e8df1fSDamjan Jovanovic     class isRunning : public ::testing::Test
975cdf0e10cSrcweir     {
976cdf0e10cSrcweir     public:
977cdf0e10cSrcweir         // initialise your test code values here.
SetUp()97844e8df1fSDamjan Jovanovic         void SetUp()
979cdf0e10cSrcweir             {
980cdf0e10cSrcweir             }
981cdf0e10cSrcweir 
TearDown()98244e8df1fSDamjan Jovanovic         void TearDown()
983cdf0e10cSrcweir             {
984cdf0e10cSrcweir             }
98544e8df1fSDamjan Jovanovic     }; // class isRunning
986cdf0e10cSrcweir 
98744e8df1fSDamjan Jovanovic     /**
98844e8df1fSDamjan Jovanovic      */
TEST_F(isRunning,isRunning_001)98944e8df1fSDamjan Jovanovic     TEST_F(isRunning, isRunning_001)
99044e8df1fSDamjan Jovanovic         {
99144e8df1fSDamjan Jovanovic             OCountThread *aCountThread = new OCountThread();
99244e8df1fSDamjan Jovanovic             sal_Bool bRes = aCountThread->create();
99344e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
994cdf0e10cSrcweir 
99544e8df1fSDamjan Jovanovic             sal_Bool bRun = aCountThread->isRunning();
996cdf0e10cSrcweir 
99744e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
99844e8df1fSDamjan Jovanovic             termAndJoinThread(aCountThread);
99944e8df1fSDamjan Jovanovic             sal_Bool bTer = aCountThread->isRunning();
100044e8df1fSDamjan Jovanovic             delete aCountThread;
1001cdf0e10cSrcweir 
100244e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRun == sal_True && bTer == sal_False) << "Test isRunning";
100344e8df1fSDamjan Jovanovic         }
100444e8df1fSDamjan Jovanovic     /** check the value of isRunning when suspending and after resume
100544e8df1fSDamjan Jovanovic      */
TEST_F(isRunning,isRunning_002)100644e8df1fSDamjan Jovanovic     TEST_F(isRunning, isRunning_002)
100744e8df1fSDamjan Jovanovic         {
100844e8df1fSDamjan Jovanovic             OCountThread *aCountThread = new OCountThread();
100944e8df1fSDamjan Jovanovic             sal_Bool bRes = aCountThread->create();
101044e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
101144e8df1fSDamjan Jovanovic 
101244e8df1fSDamjan Jovanovic             // sal_Bool bRunning = aCountThread->isRunning();
101344e8df1fSDamjan Jovanovic             // sal_Int32 nValue = 0;
101444e8df1fSDamjan Jovanovic             suspendCountThread(aCountThread);
101544e8df1fSDamjan Jovanovic 
101644e8df1fSDamjan Jovanovic             sal_Bool bRunning_sup = aCountThread->isRunning();
101744e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
101844e8df1fSDamjan Jovanovic             aCountThread->resume();
101944e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
102044e8df1fSDamjan Jovanovic             sal_Bool bRunning_res = aCountThread->isRunning();
102144e8df1fSDamjan Jovanovic             termAndJoinThread(aCountThread);
102244e8df1fSDamjan Jovanovic             sal_Bool bRunning_ter = aCountThread->isRunning();
102344e8df1fSDamjan Jovanovic             delete aCountThread;
102444e8df1fSDamjan Jovanovic 
102544e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True &&
102644e8df1fSDamjan Jovanovic                 bRunning_sup == sal_True &&
102744e8df1fSDamjan Jovanovic                 bRunning_res == sal_True &&
102844e8df1fSDamjan Jovanovic                 bRunning_ter == sal_False) << "Test isRunning";
1029cdf0e10cSrcweir 
103044e8df1fSDamjan Jovanovic         }
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir     /// check osl::Thread::setPriority
103344e8df1fSDamjan Jovanovic     class setPriority : public ::testing::Test
1034cdf0e10cSrcweir     {
1035cdf0e10cSrcweir     public:
1036cdf0e10cSrcweir         // initialise your test code values here.
SetUp()103744e8df1fSDamjan Jovanovic         void SetUp()
1038cdf0e10cSrcweir             {
1039cdf0e10cSrcweir             }
1040cdf0e10cSrcweir 
TearDown()104144e8df1fSDamjan Jovanovic         void TearDown()
1042cdf0e10cSrcweir             {
1043cdf0e10cSrcweir             }
1044cdf0e10cSrcweir 
1045cdf0e10cSrcweir         // insert your test code here.
getPrioName(oslThreadPriority _aPriority)1046cdf0e10cSrcweir         rtl::OString getPrioName(oslThreadPriority _aPriority)
1047cdf0e10cSrcweir             {
1048cdf0e10cSrcweir                 rtl::OString sPrioStr;
1049cdf0e10cSrcweir                 switch (_aPriority)
1050cdf0e10cSrcweir                 {
1051cdf0e10cSrcweir                 case osl_Thread_PriorityHighest:
1052cdf0e10cSrcweir                     sPrioStr = "Highest";
1053cdf0e10cSrcweir                     break;
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir                 case osl_Thread_PriorityAboveNormal:
1056cdf0e10cSrcweir                     sPrioStr = "AboveNormal";
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir                 case osl_Thread_PriorityNormal:
1059cdf0e10cSrcweir                     sPrioStr = "Normal";
1060cdf0e10cSrcweir 
1061cdf0e10cSrcweir                 case osl_Thread_PriorityBelowNormal:
1062cdf0e10cSrcweir                     sPrioStr = "BelowNormal";
1063cdf0e10cSrcweir                     break;
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir                 case osl_Thread_PriorityLowest:
1066cdf0e10cSrcweir                     sPrioStr = "Lowest";
1067cdf0e10cSrcweir                     break;
1068cdf0e10cSrcweir                 default:
1069cdf0e10cSrcweir                     sPrioStr = "unknown";
1070cdf0e10cSrcweir                 }
1071cdf0e10cSrcweir                 return sPrioStr;
1072cdf0e10cSrcweir             }
1073cdf0e10cSrcweir 
1074cdf0e10cSrcweir 
1075cdf0e10cSrcweir         /** check 2 threads.
1076cdf0e10cSrcweir 
1077cdf0e10cSrcweir             ALGORITHM:
1078cdf0e10cSrcweir             Here the function should show, that 2 different threads,
1079cdf0e10cSrcweir             which only increase a value, should run at the same time with same prio.
1080cdf0e10cSrcweir             The test fails, if the difference between the two values is more than 5%
1081cdf0e10cSrcweir             but IMHO this isn't a failure, it's only a feature of the OS.
1082cdf0e10cSrcweir         */
1083cdf0e10cSrcweir 
check2Threads(oslThreadPriority _aPriority)1084cdf0e10cSrcweir         void check2Threads(oslThreadPriority _aPriority)
1085cdf0e10cSrcweir             {
1086cdf0e10cSrcweir                 // initial 5 threads with different priorities
1087cdf0e10cSrcweir                 OAddThread* pThread = new OAddThread();
1088cdf0e10cSrcweir                 OAddThread* p2Thread = new OAddThread();
1089cdf0e10cSrcweir 
1090cdf0e10cSrcweir                 //Create them and start running at the same time
1091cdf0e10cSrcweir                 pThread->create();
1092cdf0e10cSrcweir                 pThread->setPriority(_aPriority);
1093cdf0e10cSrcweir                 p2Thread->create();
1094cdf0e10cSrcweir                 p2Thread->setPriority(_aPriority);
1095cdf0e10cSrcweir 
1096cdf0e10cSrcweir                 ThreadHelper::thread_sleep_tenth_sec(5);
1097cdf0e10cSrcweir 
1098cdf0e10cSrcweir                 pThread->terminate();
1099cdf0e10cSrcweir                 p2Thread->terminate();
1100cdf0e10cSrcweir 
1101cdf0e10cSrcweir                 sal_Int32 nValueNormal = 0;
1102cdf0e10cSrcweir                 nValueNormal = pThread->getValue();
1103cdf0e10cSrcweir 
1104cdf0e10cSrcweir                 sal_Int32 nValueNormal2 = 0;
1105cdf0e10cSrcweir                 nValueNormal2 = p2Thread->getValue();
1106cdf0e10cSrcweir 
1107cdf0e10cSrcweir                 rtl::OString sPrio = getPrioName(_aPriority);
110844e8df1fSDamjan Jovanovic                 printf("After 10 tenth seconds\n");
1109cdf0e10cSrcweir 
111044e8df1fSDamjan Jovanovic                 printf("nValue in %s Prio Thread is  %d\n",sPrio.getStr(), nValueNormal);
111144e8df1fSDamjan Jovanovic                 printf("nValue in %s Prio Thread is %d\n", sPrio.getStr(), nValueNormal2);
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir                 // ThreadHelper::thread_sleep_tenth_sec(1);
1114cdf0e10cSrcweir                 pThread->join();
1115cdf0e10cSrcweir                 p2Thread->join();
1116cdf0e10cSrcweir 
1117cdf0e10cSrcweir                 delete pThread;
1118cdf0e10cSrcweir                 delete p2Thread;
1119cdf0e10cSrcweir 
1120cdf0e10cSrcweir                 sal_Int32 nDelta = abs(nValueNormal - nValueNormal2);
1121cdf0e10cSrcweir                 double nQuotient = std::max(nValueNormal, nValueNormal2);
112244e8df1fSDamjan Jovanovic                 ASSERT_TRUE(nQuotient != 0) << "Quotient is zero, which means, there exist no right values.";
1123cdf0e10cSrcweir                 double nDeltaPercent = nDelta / nQuotient * 100;
1124cdf0e10cSrcweir 
112544e8df1fSDamjan Jovanovic                 printf("Delta value %d, percent %f\n",nDelta, nDeltaPercent);
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir                 // LLA: it's not a bug if the current OS is not able to handle thread scheduling right and good.
1128cdf0e10cSrcweir                 // like Windows XP
112944e8df1fSDamjan Jovanovic                 // LLA: ASSERT_TRUE(// LLA:     nDeltaPercent <= 5
113044e8df1fSDamjan Jovanovic                 // LLA:) << // LLA:     "Run 2 normal threads, the count diff more than 5 percent.";
1131cdf0e10cSrcweir             }
113244e8df1fSDamjan Jovanovic     }; // class setPriority
1133cdf0e10cSrcweir 
TEST_F(setPriority,setPriority_001_1)113444e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_001_1)
113544e8df1fSDamjan Jovanovic         {
113644e8df1fSDamjan Jovanovic             check2Threads(osl_Thread_PriorityHighest);
113744e8df1fSDamjan Jovanovic         }
TEST_F(setPriority,setPriority_001_2)113844e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_001_2)
113944e8df1fSDamjan Jovanovic         {
114044e8df1fSDamjan Jovanovic             check2Threads(osl_Thread_PriorityAboveNormal);
114144e8df1fSDamjan Jovanovic         }
TEST_F(setPriority,setPriority_001_3)114244e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_001_3)
114344e8df1fSDamjan Jovanovic         {
114444e8df1fSDamjan Jovanovic             check2Threads(osl_Thread_PriorityNormal);
114544e8df1fSDamjan Jovanovic         }
TEST_F(setPriority,setPriority_001_4)114644e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_001_4)
114744e8df1fSDamjan Jovanovic         {
114844e8df1fSDamjan Jovanovic             check2Threads(osl_Thread_PriorityBelowNormal);
114944e8df1fSDamjan Jovanovic         }
TEST_F(setPriority,setPriority_001_5)115044e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_001_5)
115144e8df1fSDamjan Jovanovic         {
115244e8df1fSDamjan Jovanovic             check2Threads(osl_Thread_PriorityLowest);
115344e8df1fSDamjan Jovanovic         }
1154cdf0e10cSrcweir 
115544e8df1fSDamjan Jovanovic #ifndef SOLARIS
TEST_F(setPriority,setPriority_002)115644e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_002)
115744e8df1fSDamjan Jovanovic         {
115844e8df1fSDamjan Jovanovic             // initial 5 threads with different priorities
115944e8df1fSDamjan Jovanovic 
116044e8df1fSDamjan Jovanovic             OAddThread aHighestThread;
116144e8df1fSDamjan Jovanovic             OAddThread aAboveNormalThread;
116244e8df1fSDamjan Jovanovic             OAddThread aNormalThread;
116344e8df1fSDamjan Jovanovic             //OAddThread *aBelowNormalThread = new OAddThread();
116444e8df1fSDamjan Jovanovic             //OAddThread *aLowestThread = new OAddThread();
116544e8df1fSDamjan Jovanovic 
116644e8df1fSDamjan Jovanovic             //Create them and start running at the same time
116744e8df1fSDamjan Jovanovic             aHighestThread.createSuspended();
116844e8df1fSDamjan Jovanovic             aHighestThread.setPriority(osl_Thread_PriorityHighest);
116944e8df1fSDamjan Jovanovic 
117044e8df1fSDamjan Jovanovic             aAboveNormalThread.createSuspended();
117144e8df1fSDamjan Jovanovic             aAboveNormalThread.setPriority(osl_Thread_PriorityAboveNormal);
117244e8df1fSDamjan Jovanovic 
117344e8df1fSDamjan Jovanovic             aNormalThread.createSuspended();
117444e8df1fSDamjan Jovanovic             aNormalThread.setPriority(osl_Thread_PriorityNormal);
117544e8df1fSDamjan Jovanovic             /*aBelowNormalThread->create();
117644e8df1fSDamjan Jovanovic               aBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
117744e8df1fSDamjan Jovanovic               aLowestThread->create();
117844e8df1fSDamjan Jovanovic               aLowestThread->setPriority(osl_Thread_PriorityLowest);
117944e8df1fSDamjan Jovanovic             */
118044e8df1fSDamjan Jovanovic 
118144e8df1fSDamjan Jovanovic             aHighestThread.resume();
118244e8df1fSDamjan Jovanovic             aAboveNormalThread.resume();
118344e8df1fSDamjan Jovanovic             aNormalThread.resume();
118444e8df1fSDamjan Jovanovic 
118544e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(5);
118644e8df1fSDamjan Jovanovic 
118744e8df1fSDamjan Jovanovic             aHighestThread.suspend();
118844e8df1fSDamjan Jovanovic             aAboveNormalThread.suspend();
118944e8df1fSDamjan Jovanovic             aNormalThread.suspend();
119044e8df1fSDamjan Jovanovic 
119144e8df1fSDamjan Jovanovic             termAndJoinThread(&aNormalThread);
119244e8df1fSDamjan Jovanovic             termAndJoinThread(&aAboveNormalThread);
119344e8df1fSDamjan Jovanovic             termAndJoinThread(&aHighestThread);
119444e8df1fSDamjan Jovanovic             //aBelowNormalThread->terminate();
119544e8df1fSDamjan Jovanovic             //aLowestThread->terminate();
119644e8df1fSDamjan Jovanovic 
119744e8df1fSDamjan Jovanovic             sal_Int32 nValueHighest = 0;
119844e8df1fSDamjan Jovanovic             nValueHighest = aHighestThread.getValue();
119944e8df1fSDamjan Jovanovic 
120044e8df1fSDamjan Jovanovic             sal_Int32 nValueAboveNormal = 0;
120144e8df1fSDamjan Jovanovic             nValueAboveNormal = aAboveNormalThread.getValue();
120244e8df1fSDamjan Jovanovic 
120344e8df1fSDamjan Jovanovic             sal_Int32 nValueNormal = 0;
120444e8df1fSDamjan Jovanovic             nValueNormal = aNormalThread.getValue();
120544e8df1fSDamjan Jovanovic 
120644e8df1fSDamjan Jovanovic             // sal_Int32 nValueBelowNormal = 0;
120744e8df1fSDamjan Jovanovic             //nValueBelowNormal = aBelowNormalThread->getValue();
120844e8df1fSDamjan Jovanovic             // sal_Int32 nValueLowest = 0;
120944e8df1fSDamjan Jovanovic             //nValueLowest = aLowestThread->getValue();
121044e8df1fSDamjan Jovanovic             printf("After 10 tenth seconds\n");
121144e8df1fSDamjan Jovanovic             printf("nValue in Highest Prio Thread is %d\n",nValueHighest);
121244e8df1fSDamjan Jovanovic             printf("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
121344e8df1fSDamjan Jovanovic             printf("nValue in Normal Prio Thread is %d\n",nValueNormal);
121444e8df1fSDamjan Jovanovic 
121544e8df1fSDamjan Jovanovic             // LLA: this is not a save test, so we only check if all values not zero
121644e8df1fSDamjan Jovanovic             // LLA: ASSERT_TRUE(// LLA:     nValueHighest >= nValueAboveNormal &&
121744e8df1fSDamjan Jovanovic             // LLA:     nValueAboveNormal >= nValueNormal &&
121844e8df1fSDamjan Jovanovic             // LLA:     nValueNormal > 0
121944e8df1fSDamjan Jovanovic             // LLA:) << // LLA:     "SetPriority";
1220cdf0e10cSrcweir 
1221cdf0e10cSrcweir // LLA: windows let starve threads with lower priority
1222cdf0e10cSrcweir #ifndef WNT
122344e8df1fSDamjan Jovanovic             ASSERT_TRUE(nValueHighest     > 0 &&
122444e8df1fSDamjan Jovanovic                 nValueAboveNormal > 0 &&
122544e8df1fSDamjan Jovanovic                 nValueNormal > 0) << "SetPriority";
1226cdf0e10cSrcweir #endif
122744e8df1fSDamjan Jovanovic         }
1228cdf0e10cSrcweir 
TEST_F(setPriority,setPriority_003)122944e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_003)
123044e8df1fSDamjan Jovanovic         {
123144e8df1fSDamjan Jovanovic             // initial 5 threads with different priorities
123244e8df1fSDamjan Jovanovic             OAddThread *pHighestThread = new OAddThread();
123344e8df1fSDamjan Jovanovic             OAddThread *pAboveNormalThread = new OAddThread();
123444e8df1fSDamjan Jovanovic             OAddThread *pNormalThread = new OAddThread();
123544e8df1fSDamjan Jovanovic             OAddThread *pBelowNormalThread = new OAddThread();
123644e8df1fSDamjan Jovanovic             OAddThread *pLowestThread = new OAddThread();
123744e8df1fSDamjan Jovanovic 
123844e8df1fSDamjan Jovanovic             //Create them and start running at the same time
123944e8df1fSDamjan Jovanovic             pHighestThread->createSuspended();
124044e8df1fSDamjan Jovanovic             pHighestThread->setPriority(osl_Thread_PriorityHighest);
124144e8df1fSDamjan Jovanovic 
124244e8df1fSDamjan Jovanovic             pAboveNormalThread->createSuspended();
124344e8df1fSDamjan Jovanovic             pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
124444e8df1fSDamjan Jovanovic 
124544e8df1fSDamjan Jovanovic             pNormalThread->createSuspended();
124644e8df1fSDamjan Jovanovic             pNormalThread->setPriority(osl_Thread_PriorityNormal);
124744e8df1fSDamjan Jovanovic 
124844e8df1fSDamjan Jovanovic             pBelowNormalThread->createSuspended();
124944e8df1fSDamjan Jovanovic             pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
125044e8df1fSDamjan Jovanovic 
125144e8df1fSDamjan Jovanovic             pLowestThread->createSuspended();
125244e8df1fSDamjan Jovanovic             pLowestThread->setPriority(osl_Thread_PriorityLowest);
125344e8df1fSDamjan Jovanovic 
125444e8df1fSDamjan Jovanovic             pHighestThread->resume();
125544e8df1fSDamjan Jovanovic             pAboveNormalThread->resume();
125644e8df1fSDamjan Jovanovic             pNormalThread->resume();
125744e8df1fSDamjan Jovanovic             pBelowNormalThread->resume();
125844e8df1fSDamjan Jovanovic             pLowestThread->resume();
125944e8df1fSDamjan Jovanovic 
126044e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(5);
126144e8df1fSDamjan Jovanovic 
126244e8df1fSDamjan Jovanovic             pHighestThread->suspend();
126344e8df1fSDamjan Jovanovic             pAboveNormalThread->suspend();
126444e8df1fSDamjan Jovanovic             pNormalThread->suspend();
126544e8df1fSDamjan Jovanovic             pBelowNormalThread->suspend();
126644e8df1fSDamjan Jovanovic             pLowestThread->suspend();
126744e8df1fSDamjan Jovanovic 
126844e8df1fSDamjan Jovanovic             termAndJoinThread(pHighestThread);
126944e8df1fSDamjan Jovanovic             termAndJoinThread(pAboveNormalThread);
127044e8df1fSDamjan Jovanovic             termAndJoinThread(pNormalThread);
127144e8df1fSDamjan Jovanovic             termAndJoinThread(pBelowNormalThread);
127244e8df1fSDamjan Jovanovic             termAndJoinThread(pLowestThread);
127344e8df1fSDamjan Jovanovic 
127444e8df1fSDamjan Jovanovic             sal_Int32 nValueHighest = 0;
127544e8df1fSDamjan Jovanovic             nValueHighest = pHighestThread->getValue();
127644e8df1fSDamjan Jovanovic 
127744e8df1fSDamjan Jovanovic             sal_Int32 nValueAboveNormal = 0;
127844e8df1fSDamjan Jovanovic             nValueAboveNormal = pAboveNormalThread->getValue();
127944e8df1fSDamjan Jovanovic 
128044e8df1fSDamjan Jovanovic             sal_Int32 nValueNormal = 0;
128144e8df1fSDamjan Jovanovic             nValueNormal = pNormalThread->getValue();
128244e8df1fSDamjan Jovanovic 
128344e8df1fSDamjan Jovanovic             sal_Int32 nValueBelowNormal = 0;
128444e8df1fSDamjan Jovanovic             nValueBelowNormal = pBelowNormalThread->getValue();
128544e8df1fSDamjan Jovanovic 
128644e8df1fSDamjan Jovanovic             sal_Int32 nValueLowest = 0;
128744e8df1fSDamjan Jovanovic             nValueLowest = pLowestThread->getValue();
128844e8df1fSDamjan Jovanovic 
128944e8df1fSDamjan Jovanovic             printf("After 10 tenth seconds\n");
129044e8df1fSDamjan Jovanovic             printf("nValue in Highest Prio Thread is     %d\n",nValueHighest);
129144e8df1fSDamjan Jovanovic             printf("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
129244e8df1fSDamjan Jovanovic             printf("nValue in Normal Prio Thread is      %d\n",nValueNormal);
129344e8df1fSDamjan Jovanovic             printf("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
129444e8df1fSDamjan Jovanovic             printf("nValue in Lowest Prio Thread is      %d\n",nValueLowest);
129544e8df1fSDamjan Jovanovic 
129644e8df1fSDamjan Jovanovic             delete pHighestThread;
129744e8df1fSDamjan Jovanovic             delete pAboveNormalThread;
129844e8df1fSDamjan Jovanovic             delete pNormalThread;
129944e8df1fSDamjan Jovanovic             delete pBelowNormalThread;
130044e8df1fSDamjan Jovanovic             delete pLowestThread;
130144e8df1fSDamjan Jovanovic 
130244e8df1fSDamjan Jovanovic             // LLA: this is not a save test, so we only check if all values not zero
130344e8df1fSDamjan Jovanovic             // LLA: ASSERT_TRUE(// LLA:     nValueHighest > nValueAboveNormal &&
130444e8df1fSDamjan Jovanovic             // LLA:     nValueAboveNormal > nValueNormal &&
130544e8df1fSDamjan Jovanovic             // LLA:     nValueNormal > nValueBelowNormal &&
130644e8df1fSDamjan Jovanovic             // LLA:     nValueBelowNormal > nValueLowest &&
130744e8df1fSDamjan Jovanovic             // LLA:     nValueLowest > 0
130844e8df1fSDamjan Jovanovic             // LLA:) << // LLA:     "SetPriority";
1309cdf0e10cSrcweir 
1310cdf0e10cSrcweir // LLA: windows let starve threads with lower priority
1311cdf0e10cSrcweir #ifndef WNT
131244e8df1fSDamjan Jovanovic             ASSERT_TRUE(nValueHighest     > 0 &&
131344e8df1fSDamjan Jovanovic                 nValueAboveNormal > 0 &&
131444e8df1fSDamjan Jovanovic                 nValueNormal      > 0 &&
131544e8df1fSDamjan Jovanovic                 nValueBelowNormal > 0 &&
131644e8df1fSDamjan Jovanovic                 nValueLowest      > 0) << "SetPriority";
1317cdf0e10cSrcweir #endif
131844e8df1fSDamjan Jovanovic         }
1319cdf0e10cSrcweir 
TEST_F(setPriority,setPriority_004)132044e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_004)
132144e8df1fSDamjan Jovanovic         {
132244e8df1fSDamjan Jovanovic             // initial 5 threads with different priorities
132344e8df1fSDamjan Jovanovic             // OAddThread *pHighestThread = new OAddThread();
132444e8df1fSDamjan Jovanovic             OAddThread *pAboveNormalThread = new OAddThread();
132544e8df1fSDamjan Jovanovic             OAddThread *pNormalThread = new OAddThread();
132644e8df1fSDamjan Jovanovic             OAddThread *pBelowNormalThread = new OAddThread();
132744e8df1fSDamjan Jovanovic             OAddThread *pLowestThread = new OAddThread();
132844e8df1fSDamjan Jovanovic 
132944e8df1fSDamjan Jovanovic             //Create them and start running at the same time
133044e8df1fSDamjan Jovanovic             // pHighestThread->createSuspended();
133144e8df1fSDamjan Jovanovic             // pHighestThread->setPriority(osl_Thread_PriorityHighest);
133244e8df1fSDamjan Jovanovic 
133344e8df1fSDamjan Jovanovic             pAboveNormalThread->createSuspended();
133444e8df1fSDamjan Jovanovic             pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
133544e8df1fSDamjan Jovanovic 
133644e8df1fSDamjan Jovanovic             pNormalThread->createSuspended();
133744e8df1fSDamjan Jovanovic             pNormalThread->setPriority(osl_Thread_PriorityNormal);
133844e8df1fSDamjan Jovanovic 
133944e8df1fSDamjan Jovanovic             pBelowNormalThread->createSuspended();
134044e8df1fSDamjan Jovanovic             pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
134144e8df1fSDamjan Jovanovic 
134244e8df1fSDamjan Jovanovic             pLowestThread->createSuspended();
134344e8df1fSDamjan Jovanovic             pLowestThread->setPriority(osl_Thread_PriorityLowest);
134444e8df1fSDamjan Jovanovic 
134544e8df1fSDamjan Jovanovic             // pHighestThread->resume();
134644e8df1fSDamjan Jovanovic             pAboveNormalThread->resume();
134744e8df1fSDamjan Jovanovic             pNormalThread->resume();
134844e8df1fSDamjan Jovanovic             pBelowNormalThread->resume();
134944e8df1fSDamjan Jovanovic             pLowestThread->resume();
135044e8df1fSDamjan Jovanovic 
135144e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(5);
135244e8df1fSDamjan Jovanovic 
135344e8df1fSDamjan Jovanovic             // pHighestThread->suspend();
135444e8df1fSDamjan Jovanovic             pAboveNormalThread->suspend();
135544e8df1fSDamjan Jovanovic             pNormalThread->suspend();
135644e8df1fSDamjan Jovanovic             pBelowNormalThread->suspend();
135744e8df1fSDamjan Jovanovic             pLowestThread->suspend();
135844e8df1fSDamjan Jovanovic 
135944e8df1fSDamjan Jovanovic             // termAndJoinThread(pHighestThread);
136044e8df1fSDamjan Jovanovic             termAndJoinThread(pAboveNormalThread);
136144e8df1fSDamjan Jovanovic             termAndJoinThread(pNormalThread);
136244e8df1fSDamjan Jovanovic             termAndJoinThread(pBelowNormalThread);
136344e8df1fSDamjan Jovanovic             termAndJoinThread(pLowestThread);
136444e8df1fSDamjan Jovanovic 
136544e8df1fSDamjan Jovanovic             // sal_Int32 nValueHighest  = 0;
136644e8df1fSDamjan Jovanovic             // nValueHighest =  pHighestThread->getValue();
136744e8df1fSDamjan Jovanovic 
136844e8df1fSDamjan Jovanovic             sal_Int32 nValueAboveNormal = 0;
136944e8df1fSDamjan Jovanovic             nValueAboveNormal = pAboveNormalThread->getValue();
137044e8df1fSDamjan Jovanovic 
137144e8df1fSDamjan Jovanovic             sal_Int32 nValueNormal = 0;
137244e8df1fSDamjan Jovanovic             nValueNormal = pNormalThread->getValue();
137344e8df1fSDamjan Jovanovic 
137444e8df1fSDamjan Jovanovic             sal_Int32 nValueBelowNormal = 0;
137544e8df1fSDamjan Jovanovic             nValueBelowNormal = pBelowNormalThread->getValue();
137644e8df1fSDamjan Jovanovic 
137744e8df1fSDamjan Jovanovic             sal_Int32 nValueLowest = 0;
137844e8df1fSDamjan Jovanovic             nValueLowest = pLowestThread->getValue();
137944e8df1fSDamjan Jovanovic 
138044e8df1fSDamjan Jovanovic             printf("After 5 tenth seconds\n");
138144e8df1fSDamjan Jovanovic             // printf("nValue in Highest Prio Thread  is     %d\n",nValueHighest);
138244e8df1fSDamjan Jovanovic             printf("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
138344e8df1fSDamjan Jovanovic             printf("nValue in Normal Prio Thread is      %d\n",nValueNormal);
138444e8df1fSDamjan Jovanovic             printf("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
138544e8df1fSDamjan Jovanovic             printf("nValue in Lowest Prio Thread is      %d\n",nValueLowest);
138644e8df1fSDamjan Jovanovic 
138744e8df1fSDamjan Jovanovic             // delete pHighestThread;
138844e8df1fSDamjan Jovanovic             delete pAboveNormalThread;
138944e8df1fSDamjan Jovanovic             delete pNormalThread;
139044e8df1fSDamjan Jovanovic             delete pBelowNormalThread;
139144e8df1fSDamjan Jovanovic             delete pLowestThread;
139244e8df1fSDamjan Jovanovic 
139344e8df1fSDamjan Jovanovic             // LLA: this is not a save test, so we only check if all values not zero
139444e8df1fSDamjan Jovanovic             // LLA: ASSERT_TRUE(// LLA:     nValueHighest > nValueAboveNormal &&
139544e8df1fSDamjan Jovanovic             // LLA:     nValueAboveNormal > nValueNormal &&
139644e8df1fSDamjan Jovanovic             // LLA:     nValueNormal > nValueBelowNormal &&
139744e8df1fSDamjan Jovanovic             // LLA:     nValueBelowNormal > nValueLowest &&
139844e8df1fSDamjan Jovanovic             // LLA:     nValueLowest > 0
139944e8df1fSDamjan Jovanovic             // LLA:) << // LLA:     "SetPriority";
1400cdf0e10cSrcweir 
1401cdf0e10cSrcweir // LLA: windows let starve threads with lower priority
1402cdf0e10cSrcweir #ifndef WNT
140344e8df1fSDamjan Jovanovic             ASSERT_TRUE(/* nValueHighest     > 0 &&  */
140444e8df1fSDamjan Jovanovic                 nValueAboveNormal > 0 &&
140544e8df1fSDamjan Jovanovic                 nValueNormal      > 0 &&
140644e8df1fSDamjan Jovanovic                 nValueBelowNormal > 0 &&
140744e8df1fSDamjan Jovanovic                 nValueLowest      > 0) << "SetPriority";
1408cdf0e10cSrcweir #endif
140944e8df1fSDamjan Jovanovic         }
TEST_F(setPriority,setPriority_005)141044e8df1fSDamjan Jovanovic     TEST_F(setPriority, setPriority_005)
141144e8df1fSDamjan Jovanovic         {
141244e8df1fSDamjan Jovanovic             // initial 5 threads with different priorities
141344e8df1fSDamjan Jovanovic             // OAddThread *pHighestThread = new OAddThread();
141444e8df1fSDamjan Jovanovic             // OAddThread *pAboveNormalThread = new OAddThread();
141544e8df1fSDamjan Jovanovic             OAddThread *pNormalThread = new OAddThread();
141644e8df1fSDamjan Jovanovic             OAddThread *pBelowNormalThread = new OAddThread();
141744e8df1fSDamjan Jovanovic             OAddThread *pLowestThread = new OAddThread();
141844e8df1fSDamjan Jovanovic 
141944e8df1fSDamjan Jovanovic             //Create them and start running at the same time
142044e8df1fSDamjan Jovanovic             // pHighestThread->createSuspended();
142144e8df1fSDamjan Jovanovic             // pHighestThread->setPriority(osl_Thread_PriorityHighest);
142244e8df1fSDamjan Jovanovic 
142344e8df1fSDamjan Jovanovic             // pAboveNormalThread->createSuspended();
142444e8df1fSDamjan Jovanovic             // pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
142544e8df1fSDamjan Jovanovic 
142644e8df1fSDamjan Jovanovic             pNormalThread->createSuspended();
142744e8df1fSDamjan Jovanovic             pNormalThread->setPriority(osl_Thread_PriorityNormal);
142844e8df1fSDamjan Jovanovic 
142944e8df1fSDamjan Jovanovic             pBelowNormalThread->createSuspended();
143044e8df1fSDamjan Jovanovic             pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
143144e8df1fSDamjan Jovanovic 
143244e8df1fSDamjan Jovanovic             pLowestThread->createSuspended();
143344e8df1fSDamjan Jovanovic             pLowestThread->setPriority(osl_Thread_PriorityLowest);
143444e8df1fSDamjan Jovanovic 
143544e8df1fSDamjan Jovanovic             // pHighestThread->resume();
143644e8df1fSDamjan Jovanovic             // pAboveNormalThread->resume();
143744e8df1fSDamjan Jovanovic             pNormalThread->resume();
143844e8df1fSDamjan Jovanovic             pBelowNormalThread->resume();
143944e8df1fSDamjan Jovanovic             pLowestThread->resume();
144044e8df1fSDamjan Jovanovic 
144144e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(5);
144244e8df1fSDamjan Jovanovic 
144344e8df1fSDamjan Jovanovic             // pHighestThread->suspend();
144444e8df1fSDamjan Jovanovic             // pAboveNormalThread->suspend();
144544e8df1fSDamjan Jovanovic             pNormalThread->suspend();
144644e8df1fSDamjan Jovanovic             pBelowNormalThread->suspend();
144744e8df1fSDamjan Jovanovic             pLowestThread->suspend();
144844e8df1fSDamjan Jovanovic 
144944e8df1fSDamjan Jovanovic             // termAndJoinThread(pHighestThread);
145044e8df1fSDamjan Jovanovic             // termAndJoinThread(pAboveNormalThread);
145144e8df1fSDamjan Jovanovic             termAndJoinThread(pNormalThread);
145244e8df1fSDamjan Jovanovic             termAndJoinThread(pBelowNormalThread);
145344e8df1fSDamjan Jovanovic             termAndJoinThread(pLowestThread);
145444e8df1fSDamjan Jovanovic 
145544e8df1fSDamjan Jovanovic             // sal_Int32 nValueHighest  = 0;
145644e8df1fSDamjan Jovanovic             // nValueHighest =  pHighestThread->getValue();
145744e8df1fSDamjan Jovanovic 
145844e8df1fSDamjan Jovanovic             // sal_Int32 nValueAboveNormal = 0;
145944e8df1fSDamjan Jovanovic             // nValueAboveNormal = pAboveNormalThread->getValue();
146044e8df1fSDamjan Jovanovic 
146144e8df1fSDamjan Jovanovic             sal_Int32 nValueNormal = 0;
146244e8df1fSDamjan Jovanovic             nValueNormal = pNormalThread->getValue();
146344e8df1fSDamjan Jovanovic 
146444e8df1fSDamjan Jovanovic             sal_Int32 nValueBelowNormal = 0;
146544e8df1fSDamjan Jovanovic             nValueBelowNormal = pBelowNormalThread->getValue();
146644e8df1fSDamjan Jovanovic 
146744e8df1fSDamjan Jovanovic             sal_Int32 nValueLowest = 0;
146844e8df1fSDamjan Jovanovic             nValueLowest = pLowestThread->getValue();
146944e8df1fSDamjan Jovanovic 
147044e8df1fSDamjan Jovanovic             printf("After 5 tenth seconds\n");
147144e8df1fSDamjan Jovanovic             // printf("nValue in Highest Prio Thread  is     %d\n",nValueHighest);
147244e8df1fSDamjan Jovanovic             // printf("nValue in AboveNormal  Prio Thread is %d\n",nValueAboveNormal);
147344e8df1fSDamjan Jovanovic             printf("nValue in Normal Prio Thread is      %d\n",nValueNormal);
147444e8df1fSDamjan Jovanovic             printf("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
147544e8df1fSDamjan Jovanovic             printf("nValue in Lowest Prio Thread is      %d\n",nValueLowest);
147644e8df1fSDamjan Jovanovic 
147744e8df1fSDamjan Jovanovic             // delete pHighestThread;
147844e8df1fSDamjan Jovanovic             // delete pAboveNormalThread;
147944e8df1fSDamjan Jovanovic             delete pNormalThread;
148044e8df1fSDamjan Jovanovic             delete pBelowNormalThread;
148144e8df1fSDamjan Jovanovic             delete pLowestThread;
148244e8df1fSDamjan Jovanovic 
148344e8df1fSDamjan Jovanovic             // LLA: this is not a save test, so we only check if all values not zero
148444e8df1fSDamjan Jovanovic             // LLA: ASSERT_TRUE(// LLA:     nValueHighest > nValueAboveNormal &&
148544e8df1fSDamjan Jovanovic             // LLA:     nValueAboveNormal > nValueNormal &&
148644e8df1fSDamjan Jovanovic             // LLA:     nValueNormal > nValueBelowNormal &&
148744e8df1fSDamjan Jovanovic             // LLA:     nValueBelowNormal > nValueLowest &&
148844e8df1fSDamjan Jovanovic             // LLA:     nValueLowest > 0
148944e8df1fSDamjan Jovanovic             // LLA:) << // LLA:     "SetPriority";
1490cdf0e10cSrcweir 
1491cdf0e10cSrcweir // LLA: windows let starve threads with lower priority
1492cdf0e10cSrcweir #ifndef WNT
149344e8df1fSDamjan Jovanovic             ASSERT_TRUE(/* nValueHighest     > 0 &&  */
149444e8df1fSDamjan Jovanovic                 /* nValueAboveNormal > 0 &&  */
149544e8df1fSDamjan Jovanovic                 nValueNormal      > 0 &&
149644e8df1fSDamjan Jovanovic                 nValueBelowNormal > 0 &&
149744e8df1fSDamjan Jovanovic                 nValueLowest      > 0) << "SetPriority";
1498cdf0e10cSrcweir #endif
149944e8df1fSDamjan Jovanovic         }
150044e8df1fSDamjan Jovanovic #endif // SOLARIS
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir 
1503cdf0e10cSrcweir     /** Test of the osl::Thread::getPriority method
1504cdf0e10cSrcweir     */
150544e8df1fSDamjan Jovanovic     class getPriority : public ::testing::Test
1506cdf0e10cSrcweir     {
1507cdf0e10cSrcweir     public:
1508cdf0e10cSrcweir         // initialise your test code values here.
SetUp()150944e8df1fSDamjan Jovanovic         void SetUp()
1510cdf0e10cSrcweir             {
1511cdf0e10cSrcweir             }
1512cdf0e10cSrcweir 
TearDown()151344e8df1fSDamjan Jovanovic         void TearDown()
1514cdf0e10cSrcweir             {
1515cdf0e10cSrcweir             }
151644e8df1fSDamjan Jovanovic     }; // class getPriority
1517cdf0e10cSrcweir 
TEST_F(getPriority,getPriority_001)151844e8df1fSDamjan Jovanovic     TEST_F(getPriority, getPriority_001)
151944e8df1fSDamjan Jovanovic         {
152044e8df1fSDamjan Jovanovic             OAddThread *pHighestThread = new OAddThread();
1521cdf0e10cSrcweir 
152244e8df1fSDamjan Jovanovic             //Create them and start running at the same time
152344e8df1fSDamjan Jovanovic             pHighestThread->create();
152444e8df1fSDamjan Jovanovic             pHighestThread->setPriority(osl_Thread_PriorityHighest);
1525cdf0e10cSrcweir 
152644e8df1fSDamjan Jovanovic             oslThreadPriority aPriority = pHighestThread->getPriority();
152744e8df1fSDamjan Jovanovic             termAndJoinThread(pHighestThread);
152844e8df1fSDamjan Jovanovic             delete pHighestThread;
1529cdf0e10cSrcweir 
153044e8df1fSDamjan Jovanovic             ThreadHelper::outputPriority(aPriority);
1531cdf0e10cSrcweir 
1532cdf0e10cSrcweir // LLA: Priority settings may not work within some OS versions.
1533cdf0e10cSrcweir #if ( defined WNT ) || ( defined SOLARIS )
153444e8df1fSDamjan Jovanovic             ASSERT_TRUE(aPriority == osl_Thread_PriorityHighest) << "getPriority";
1535cdf0e10cSrcweir #else
1536cdf0e10cSrcweir // LLA: Linux
1537cdf0e10cSrcweir // NO_PTHREAD_PRIORITY ???
153844e8df1fSDamjan Jovanovic             ASSERT_TRUE(aPriority == osl_Thread_PriorityNormal) << "getPriority";
1539cdf0e10cSrcweir #endif
154044e8df1fSDamjan Jovanovic         }
1541cdf0e10cSrcweir 
TEST_F(getPriority,getPriority_002)154244e8df1fSDamjan Jovanovic     TEST_F(getPriority, getPriority_002)
154344e8df1fSDamjan Jovanovic         {
1544cdf0e10cSrcweir 
154544e8df1fSDamjan Jovanovic         }
1546cdf0e10cSrcweir 
1547cdf0e10cSrcweir 
154844e8df1fSDamjan Jovanovic     class getIdentifier : public ::testing::Test
1549cdf0e10cSrcweir     {
1550cdf0e10cSrcweir     public:
1551cdf0e10cSrcweir         // initialise your test code values here.
SetUp()155244e8df1fSDamjan Jovanovic         void SetUp()
1553cdf0e10cSrcweir             {
1554cdf0e10cSrcweir             }
1555cdf0e10cSrcweir 
TearDown()155644e8df1fSDamjan Jovanovic         void TearDown()
1557cdf0e10cSrcweir             {
1558cdf0e10cSrcweir             }
155944e8df1fSDamjan Jovanovic     }; // class getIdentifier
1560cdf0e10cSrcweir 
156144e8df1fSDamjan Jovanovic     // insert your test code here.
TEST_F(getIdentifier,getIdentifier_001)156244e8df1fSDamjan Jovanovic     TEST_F(getIdentifier, getIdentifier_001)
156344e8df1fSDamjan Jovanovic         {
1564cdf0e10cSrcweir 
156544e8df1fSDamjan Jovanovic         }
1566cdf0e10cSrcweir 
TEST_F(getIdentifier,getIdentifier_002)156744e8df1fSDamjan Jovanovic     TEST_F(getIdentifier, getIdentifier_002)
156844e8df1fSDamjan Jovanovic         {
1569cdf0e10cSrcweir 
157044e8df1fSDamjan Jovanovic         }
1571cdf0e10cSrcweir 
1572cdf0e10cSrcweir     /** Test of the osl::Thread::getCurrentIdentifier method
1573cdf0e10cSrcweir     */
157444e8df1fSDamjan Jovanovic     class getCurrentIdentifier : public ::testing::Test
1575cdf0e10cSrcweir     {
1576cdf0e10cSrcweir     public:
1577cdf0e10cSrcweir         // initialise your test code values here.
SetUp()157844e8df1fSDamjan Jovanovic         void SetUp()
1579cdf0e10cSrcweir             {
1580cdf0e10cSrcweir             }
1581cdf0e10cSrcweir 
TearDown()158244e8df1fSDamjan Jovanovic         void TearDown()
1583cdf0e10cSrcweir             {
1584cdf0e10cSrcweir             }
158544e8df1fSDamjan Jovanovic     }; // class getCurrentIdentifier
1586cdf0e10cSrcweir 
158744e8df1fSDamjan Jovanovic     // insert your test code here.
TEST_F(getCurrentIdentifier,getCurrentIdentifier_001)158844e8df1fSDamjan Jovanovic     TEST_F(getCurrentIdentifier, getCurrentIdentifier_001)
158944e8df1fSDamjan Jovanovic         {
159044e8df1fSDamjan Jovanovic             oslThreadIdentifier oId;
159144e8df1fSDamjan Jovanovic             OCountThread* pCountThread = new OCountThread;
159244e8df1fSDamjan Jovanovic             //OCountThread* pCountThread2 = new OCountThread;
159344e8df1fSDamjan Jovanovic             pCountThread->create();
159444e8df1fSDamjan Jovanovic             //pCountThread2->create();
159544e8df1fSDamjan Jovanovic             pCountThread->setWait(3);
159644e8df1fSDamjan Jovanovic             oId = Thread::getCurrentIdentifier();
159744e8df1fSDamjan Jovanovic             oslThreadIdentifier oIdChild = pCountThread->getIdentifier();
159844e8df1fSDamjan Jovanovic             //printf("CurrentId is %ld, Child1 id is %ld, Child2 id is %ld\n",oId, oIdChild,pCountThread2->m_id );
159944e8df1fSDamjan Jovanovic             termAndJoinThread(pCountThread);
160044e8df1fSDamjan Jovanovic             delete pCountThread;
160144e8df1fSDamjan Jovanovic             //termAndJoinThread(pCountThread2);
160244e8df1fSDamjan Jovanovic             //delete pCountThread2;
160344e8df1fSDamjan Jovanovic 
160444e8df1fSDamjan Jovanovic             ASSERT_TRUE(oId != oIdChild) << "Get the identifier for the current active thread.";
1605cdf0e10cSrcweir 
160644e8df1fSDamjan Jovanovic         }
1607cdf0e10cSrcweir 
TEST_F(getCurrentIdentifier,getCurrentIdentifier_002)160844e8df1fSDamjan Jovanovic     TEST_F(getCurrentIdentifier, getCurrentIdentifier_002)
160944e8df1fSDamjan Jovanovic         {
161044e8df1fSDamjan Jovanovic         }
1611cdf0e10cSrcweir 
1612cdf0e10cSrcweir 
1613cdf0e10cSrcweir     /** Test of the osl::Thread::wait method
1614cdf0e10cSrcweir     */
161544e8df1fSDamjan Jovanovic     class wait : public ::testing::Test
1616cdf0e10cSrcweir     {
1617cdf0e10cSrcweir     public:
1618cdf0e10cSrcweir         // initialise your test code values here.
SetUp()161944e8df1fSDamjan Jovanovic         void SetUp()
1620cdf0e10cSrcweir             {
1621cdf0e10cSrcweir             }
1622cdf0e10cSrcweir 
TearDown()162344e8df1fSDamjan Jovanovic         void TearDown()
1624cdf0e10cSrcweir             {
1625cdf0e10cSrcweir             }
162644e8df1fSDamjan Jovanovic     }; // class wait
1627cdf0e10cSrcweir 
1628cdf0e10cSrcweir 
162944e8df1fSDamjan Jovanovic     /** call wait in the run method
1630cdf0e10cSrcweir 
163144e8df1fSDamjan Jovanovic         ALGORITHM:
163244e8df1fSDamjan Jovanovic         tested thread wait nWaitSec seconds, main thread sleep (2) seconds,
163344e8df1fSDamjan Jovanovic         then terminate the tested thread, due to the fact that the thread do a sleep(1) + wait(5)
163444e8df1fSDamjan Jovanovic         it's finish after 6 seconds.
163544e8df1fSDamjan Jovanovic     */
TEST_F(wait,wait_001)163644e8df1fSDamjan Jovanovic     TEST_F(wait, wait_001)
163744e8df1fSDamjan Jovanovic         {
163844e8df1fSDamjan Jovanovic             OCountThread *aCountThread = new OCountThread();
163944e8df1fSDamjan Jovanovic             sal_Int32 nWaitSec = 5;
164044e8df1fSDamjan Jovanovic             aCountThread->setWait(nWaitSec);
164144e8df1fSDamjan Jovanovic             // thread runs at least 5 seconds.
164244e8df1fSDamjan Jovanovic             sal_Bool bRes = aCountThread->create();
164344e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
164444e8df1fSDamjan Jovanovic 
164544e8df1fSDamjan Jovanovic             //record the time when the running begin
164644e8df1fSDamjan Jovanovic             StopWatch aStopWatch;
164744e8df1fSDamjan Jovanovic             aStopWatch.start();
164844e8df1fSDamjan Jovanovic 
164944e8df1fSDamjan Jovanovic             // wait a little bit, to let the thread the time, to start
165044e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec( 4 );
165144e8df1fSDamjan Jovanovic 
165244e8df1fSDamjan Jovanovic             // if wait works,
165344e8df1fSDamjan Jovanovic             // this function returns, after 4 sec. later
165444e8df1fSDamjan Jovanovic             termAndJoinThread(aCountThread);
165544e8df1fSDamjan Jovanovic 
165644e8df1fSDamjan Jovanovic             // value should be one.
165744e8df1fSDamjan Jovanovic             sal_Int32 nValue = aCountThread->getValue();
165844e8df1fSDamjan Jovanovic 
165944e8df1fSDamjan Jovanovic             aStopWatch.stop();
166044e8df1fSDamjan Jovanovic 
166144e8df1fSDamjan Jovanovic             // sal_uInt32 nSec  = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
166244e8df1fSDamjan Jovanovic             double nTenthSec = aStopWatch.getTenthSec();
166344e8df1fSDamjan Jovanovic             double nSec = aStopWatch.getSeconds();
166444e8df1fSDamjan Jovanovic             delete aCountThread;
166544e8df1fSDamjan Jovanovic             printf("nTenthSec = %f \n", nTenthSec);
166644e8df1fSDamjan Jovanovic             printf("nSec = %f \n", nSec);
166744e8df1fSDamjan Jovanovic             printf("nValue = %d \n", nValue);
166844e8df1fSDamjan Jovanovic 
166944e8df1fSDamjan Jovanovic             ASSERT_TRUE(nTenthSec >= 5 && nValue == 1) << "Wait: Blocks the calling thread for the given number of time.";
167044e8df1fSDamjan Jovanovic 
167144e8df1fSDamjan Jovanovic         }
1672cdf0e10cSrcweir // LLA: wait_001 does the same.
1673cdf0e10cSrcweir // LLA:         /** wait then terminate the thread
1674cdf0e10cSrcweir // LLA:
1675cdf0e10cSrcweir // LLA:         ALGORITHM:
1676cdf0e10cSrcweir // LLA:         wait nWaitSec seconds, and terminate when the wait does not finish
1677cdf0e10cSrcweir // LLA:         Windows & UNX: thread terminates immediatlly
1678cdf0e10cSrcweir // LLA:     */
167944e8df1fSDamjan Jovanovic // LLA:     TEST_F(wait, wait_002)
1680cdf0e10cSrcweir // LLA:     {
1681cdf0e10cSrcweir // LLA:         OCountThread aThread;
1682cdf0e10cSrcweir // LLA:
1683cdf0e10cSrcweir // LLA:         sal_Int32 nWaitSec = 3;
1684cdf0e10cSrcweir // LLA:         aThread.setWait(nWaitSec);
1685cdf0e10cSrcweir // LLA:
1686cdf0e10cSrcweir // LLA:         sal_Bool bRes = aThread.create();
168744e8df1fSDamjan Jovanovic // LLA:         ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
1688cdf0e10cSrcweir // LLA:
1689cdf0e10cSrcweir // LLA:         StopWatch aStopWatch;
1690cdf0e10cSrcweir // LLA:         // TimeValue aTimeVal_befor;
1691cdf0e10cSrcweir // LLA:         // osl_getSystemTime( &aTimeVal_befor );
1692cdf0e10cSrcweir // LLA:         aStopWatch.start();
1693cdf0e10cSrcweir // LLA:
1694cdf0e10cSrcweir // LLA:         termAndJoinThread(&aThread);
1695cdf0e10cSrcweir // LLA:         sal_Int32 nValue = aThread.getValue();
1696cdf0e10cSrcweir // LLA:
1697cdf0e10cSrcweir // LLA:         // TimeValue aTimeVal_after;
1698cdf0e10cSrcweir // LLA:         // osl_getSystemTime( &aTimeVal_after );
1699cdf0e10cSrcweir // LLA:         aStopWatch.stop();
1700cdf0e10cSrcweir // LLA:         // sal_Int32 nSec = aTimeVal_after.Seconds  - aTimeVal_befor.Seconds;
1701cdf0e10cSrcweir // LLA:         double nSec = aStopWatch.getSeconds();
170244e8df1fSDamjan Jovanovic // LLA:         printf("sec=%f\n", nSec);
170344e8df1fSDamjan Jovanovic // LLA:         printf("nValue = %d\n", nValue);
1704cdf0e10cSrcweir // LLA:
170544e8df1fSDamjan Jovanovic // LLA:         ASSERT_TRUE(// LLA:             nSec < 1 && nValue == 0
170644e8df1fSDamjan Jovanovic // LLA:) << // LLA:             "Wait: Blocks the calling thread for the given number of time.";
1707cdf0e10cSrcweir // LLA:     }
1708cdf0e10cSrcweir     /** osl::Thread::yield method: can not design good test scenario to test up to now
1709cdf0e10cSrcweir     */
171044e8df1fSDamjan Jovanovic     class yield : public ::testing::Test
1711cdf0e10cSrcweir     {
1712cdf0e10cSrcweir     public:
SetUp()171344e8df1fSDamjan Jovanovic         void SetUp()
1714cdf0e10cSrcweir             {
1715cdf0e10cSrcweir             }
1716cdf0e10cSrcweir 
TearDown()171744e8df1fSDamjan Jovanovic         void TearDown()
1718cdf0e10cSrcweir             {
1719cdf0e10cSrcweir             }
1720cdf0e10cSrcweir     }; // class yield
1721cdf0e10cSrcweir 
172244e8df1fSDamjan Jovanovic     // insert your test code here.
TEST_F(yield,yield_001)172344e8df1fSDamjan Jovanovic     TEST_F(yield, yield_001)
172444e8df1fSDamjan Jovanovic         {
172544e8df1fSDamjan Jovanovic         }
172644e8df1fSDamjan Jovanovic 
1727cdf0e10cSrcweir     /** Test of the osl::Thread::schedule method
1728cdf0e10cSrcweir     */
172944e8df1fSDamjan Jovanovic     class schedule : public ::testing::Test
1730cdf0e10cSrcweir     {
1731cdf0e10cSrcweir     public:
1732cdf0e10cSrcweir         // initialise your test code values here.
SetUp()173344e8df1fSDamjan Jovanovic         void SetUp()
1734cdf0e10cSrcweir             {
1735cdf0e10cSrcweir             }
1736cdf0e10cSrcweir 
TearDown()173744e8df1fSDamjan Jovanovic         void TearDown()
1738cdf0e10cSrcweir             {
1739cdf0e10cSrcweir             }
174044e8df1fSDamjan Jovanovic     }; // class schedule
1741cdf0e10cSrcweir 
174244e8df1fSDamjan Jovanovic     /** The requested thread will get terminate the next time schedule() is called.
1743cdf0e10cSrcweir 
174444e8df1fSDamjan Jovanovic         Note: on UNX, if call suspend thread is not the to be suspended thread, the to be
174544e8df1fSDamjan Jovanovic         suspended   thread will get suspended the next time schedule() is called,
174644e8df1fSDamjan Jovanovic         while on w32, it's nothing with schedule.
1747cdf0e10cSrcweir 
174844e8df1fSDamjan Jovanovic         check if suspend and terminate work well via schedule
174944e8df1fSDamjan Jovanovic     */
TEST_F(schedule,schedule_001)175044e8df1fSDamjan Jovanovic     TEST_F(schedule, schedule_001)
175144e8df1fSDamjan Jovanovic         {
175244e8df1fSDamjan Jovanovic             OAddThread* aThread = new OAddThread();
175344e8df1fSDamjan Jovanovic             sal_Bool bRes = aThread->create();
175444e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
175544e8df1fSDamjan Jovanovic 
175644e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
175744e8df1fSDamjan Jovanovic             aThread->suspend();
175844e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(1);
175944e8df1fSDamjan Jovanovic             sal_Int32 nValue = aThread->getValue();
176044e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
176144e8df1fSDamjan Jovanovic             sal_Int32 nLaterValue = aThread->getValue();
176244e8df1fSDamjan Jovanovic             // resumeAndWaitThread(aThread);
176344e8df1fSDamjan Jovanovic             printf("      value = %d\n", nValue);
176444e8df1fSDamjan Jovanovic             printf("later value = %d\n", nLaterValue);
176544e8df1fSDamjan Jovanovic             // if value and latervalue not equal, than the thread would not suspended
1766cdf0e10cSrcweir 
176744e8df1fSDamjan Jovanovic             ASSERT_TRUE(nLaterValue == nValue) << "Schedule: suspend works.";
1768cdf0e10cSrcweir 
176944e8df1fSDamjan Jovanovic             aThread->resume();
177044e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
1771cdf0e10cSrcweir 
177244e8df1fSDamjan Jovanovic             aThread->terminate();
177344e8df1fSDamjan Jovanovic             sal_Int32 nValue_term = aThread->getValue();
1774cdf0e10cSrcweir 
177544e8df1fSDamjan Jovanovic             aThread->join();
177644e8df1fSDamjan Jovanovic             sal_Int32 nValue_join = aThread->getValue();
1777cdf0e10cSrcweir 
177844e8df1fSDamjan Jovanovic             printf("value after term = %d\n", nValue_term);
177944e8df1fSDamjan Jovanovic             printf("value after join = %d\n", nValue_join);
1780cdf0e10cSrcweir 
178144e8df1fSDamjan Jovanovic             // nValue_term and nValue_join should be the same
178244e8df1fSDamjan Jovanovic             // but should be differ from nValue
1783cdf0e10cSrcweir 
178444e8df1fSDamjan Jovanovic             delete aThread;
178544e8df1fSDamjan Jovanovic             //check if thread really terminate after call terminate, if join immediatlly return
178644e8df1fSDamjan Jovanovic             ASSERT_TRUE(nValue_join -  nValue_term <= 1 && nValue_join -  nValue_term >= 0) << "Schedule: Returns False if the thread should terminate.";
1787cdf0e10cSrcweir 
178844e8df1fSDamjan Jovanovic         }
1789cdf0e10cSrcweir 
179044e8df1fSDamjan Jovanovic     /** design a thread that has not call schedule in the workfunction--run method
179144e8df1fSDamjan Jovanovic      */
TEST_F(schedule,schedule_002)179244e8df1fSDamjan Jovanovic     TEST_F(schedule, schedule_002)
179344e8df1fSDamjan Jovanovic         {
179444e8df1fSDamjan Jovanovic             ONoScheduleThread aThread; // this thread runs 10 sec. (no schedule() used)
179544e8df1fSDamjan Jovanovic             sal_Bool bRes = aThread.create();
179644e8df1fSDamjan Jovanovic             ASSERT_TRUE(bRes == sal_True) << "Can't start thread!";
1797cdf0e10cSrcweir 
179844e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(2);
179944e8df1fSDamjan Jovanovic             aThread.suspend();
180044e8df1fSDamjan Jovanovic             sal_Int32 nValue = aThread.getValue();
1801cdf0e10cSrcweir 
180244e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(3);
180344e8df1fSDamjan Jovanovic             sal_Int32 nLaterValue = aThread.getValue();
180444e8df1fSDamjan Jovanovic             ThreadHelper::thread_sleep_tenth_sec(5);
1805cdf0e10cSrcweir 
180644e8df1fSDamjan Jovanovic             resumeAndWaitThread(&aThread);
1807cdf0e10cSrcweir 
180844e8df1fSDamjan Jovanovic             printf("      value = %d\n", nValue);
180944e8df1fSDamjan Jovanovic             printf("later value = %d\n", nLaterValue);
1810cdf0e10cSrcweir 
181144e8df1fSDamjan Jovanovic             //On windows, suspend works, so the values are same
1812cdf0e10cSrcweir #ifdef WNT
181344e8df1fSDamjan Jovanovic             ASSERT_TRUE(nLaterValue == nValue) << "Schedule: don't schedule in thread run method, suspend works.";
1814cdf0e10cSrcweir #endif
1815cdf0e10cSrcweir 
181644e8df1fSDamjan Jovanovic             //On UNX, suspend does not work, so the difference of the values equals to sleep seconds number
1817cdf0e10cSrcweir #ifdef UNX
181844e8df1fSDamjan Jovanovic             aThread.resume();
181944e8df1fSDamjan Jovanovic             ASSERT_TRUE(nLaterValue > nValue) << "Schedule: don't schedule in thread run method, suspend does not work too.";
1820cdf0e10cSrcweir #endif
1821cdf0e10cSrcweir 
182244e8df1fSDamjan Jovanovic             // terminate will not work if no schedule in thread's work function
182344e8df1fSDamjan Jovanovic             termAndJoinThread(&aThread);
182444e8df1fSDamjan Jovanovic             sal_Int32 nValue_term = aThread.getValue();
1825cdf0e10cSrcweir 
182644e8df1fSDamjan Jovanovic             printf(" value term = %d\n", nValue_term);
1827cdf0e10cSrcweir 
182844e8df1fSDamjan Jovanovic             ASSERT_TRUE(nValue_term == 10) << "Schedule: don't schedule in thread run method, terminate failed.";
182944e8df1fSDamjan Jovanovic         }
1830cdf0e10cSrcweir 
1831cdf0e10cSrcweir } // namespace osl_Thread
1832cdf0e10cSrcweir 
1833cdf0e10cSrcweir 
1834cdf0e10cSrcweir // -----------------------------------------------------------------------------
1835cdf0e10cSrcweir // destroy function when the binding thread terminate
destroyCallback(void * data)1836cdf0e10cSrcweir void SAL_CALL destroyCallback(void * data)
1837cdf0e10cSrcweir {
183844e8df1fSDamjan Jovanovic     printf("destroying local data %s\n", (char *) data);
1839cdf0e10cSrcweir     delete[] (char *) data;
1840cdf0e10cSrcweir }
1841cdf0e10cSrcweir 
1842cdf0e10cSrcweir static ThreadData myThreadData(destroyCallback);
1843cdf0e10cSrcweir 
1844cdf0e10cSrcweir /**
1845cdf0e10cSrcweir */
1846cdf0e10cSrcweir class myKeyThread : public Thread
1847cdf0e10cSrcweir {
1848cdf0e10cSrcweir public:
1849cdf0e10cSrcweir     // a public char member for test result checking
1850cdf0e10cSrcweir     char m_Char_Test;
1851cdf0e10cSrcweir     // for pass thread-special data to thread
myKeyThread(const char cData)1852cdf0e10cSrcweir     myKeyThread(const char cData)
1853cdf0e10cSrcweir         {
1854cdf0e10cSrcweir             m_nData = cData;
1855cdf0e10cSrcweir         }
1856cdf0e10cSrcweir private:
1857cdf0e10cSrcweir     char m_nData;
1858cdf0e10cSrcweir 
run()1859cdf0e10cSrcweir     void SAL_CALL run()
1860cdf0e10cSrcweir         {
1861cdf0e10cSrcweir             char * pc = new char[2];
1862cdf0e10cSrcweir //      strcpy(pc, &m_nData);
1863cdf0e10cSrcweir             memcpy(pc, &m_nData, 1);
1864cdf0e10cSrcweir             pc[1] = '\0';
1865cdf0e10cSrcweir 
1866cdf0e10cSrcweir             myThreadData.setData(pc);
1867cdf0e10cSrcweir             char* pData = (char*)myThreadData.getData();
1868cdf0e10cSrcweir             m_Char_Test = *pData;
1869cdf0e10cSrcweir             // wait for long time to check the data value in main thread
1870cdf0e10cSrcweir             ThreadHelper::thread_sleep_tenth_sec(3);
1871cdf0e10cSrcweir         }
1872cdf0e10cSrcweir public:
~myKeyThread()1873cdf0e10cSrcweir     ~myKeyThread()
1874cdf0e10cSrcweir         {
1875cdf0e10cSrcweir             if (isRunning())
1876cdf0e10cSrcweir             {
187744e8df1fSDamjan Jovanovic                 printf("error: not terminated.\n");
1878cdf0e10cSrcweir             }
1879cdf0e10cSrcweir         }
1880cdf0e10cSrcweir };
1881cdf0e10cSrcweir 
1882cdf0e10cSrcweir static ThreadData idData;
1883cdf0e10cSrcweir 
1884cdf0e10cSrcweir class idThread: public Thread
1885cdf0e10cSrcweir {
1886cdf0e10cSrcweir public:
1887cdf0e10cSrcweir     oslThreadIdentifier m_Id;
1888cdf0e10cSrcweir private:
run()1889cdf0e10cSrcweir     void SAL_CALL run()
1890cdf0e10cSrcweir         {
1891cdf0e10cSrcweir             oslThreadIdentifier* pId = new oslThreadIdentifier;
1892cdf0e10cSrcweir             *pId = getIdentifier();
1893cdf0e10cSrcweir             idData.setData(pId);
1894cdf0e10cSrcweir             oslThreadIdentifier* pIdData = (oslThreadIdentifier*)idData.getData();
189544e8df1fSDamjan Jovanovic             //printf("Thread %d has Data %d\n", getIdentifier(), *pIdData);
1896cdf0e10cSrcweir             m_Id = *pIdData;
1897cdf0e10cSrcweir             delete pId;
1898cdf0e10cSrcweir         }
1899cdf0e10cSrcweir 
1900cdf0e10cSrcweir public:
~idThread()1901cdf0e10cSrcweir     ~idThread()
1902cdf0e10cSrcweir         {
1903cdf0e10cSrcweir             if (isRunning())
1904cdf0e10cSrcweir             {
190544e8df1fSDamjan Jovanovic                 printf("error: not terminated.\n");
1906cdf0e10cSrcweir             }
1907cdf0e10cSrcweir         }
1908cdf0e10cSrcweir };
1909cdf0e10cSrcweir 
1910cdf0e10cSrcweir namespace osl_ThreadData
1911cdf0e10cSrcweir {
1912cdf0e10cSrcweir 
191344e8df1fSDamjan Jovanovic     class ctors : public ::testing::Test
1914cdf0e10cSrcweir     {
1915cdf0e10cSrcweir     public:
1916cdf0e10cSrcweir         // initialise your test code values here.
SetUp()191744e8df1fSDamjan Jovanovic         void SetUp()
1918cdf0e10cSrcweir             {
1919cdf0e10cSrcweir             }
1920cdf0e10cSrcweir 
TearDown()192144e8df1fSDamjan Jovanovic         void TearDown()
1922cdf0e10cSrcweir             {
1923cdf0e10cSrcweir             }
192444e8df1fSDamjan Jovanovic     }; // class ctors
1925cdf0e10cSrcweir 
1926cdf0e10cSrcweir 
192744e8df1fSDamjan Jovanovic     // insert your test code here.
TEST_F(ctors,ctor_001)192844e8df1fSDamjan Jovanovic     TEST_F(ctors, ctor_001)
192944e8df1fSDamjan Jovanovic         {
1930cdf0e10cSrcweir 
193144e8df1fSDamjan Jovanovic         }
1932cdf0e10cSrcweir 
193344e8df1fSDamjan Jovanovic     class setData : public ::testing::Test
1934cdf0e10cSrcweir     {
1935cdf0e10cSrcweir     public:
1936cdf0e10cSrcweir         // initialise your test code values here.
SetUp()193744e8df1fSDamjan Jovanovic         void SetUp()
1938cdf0e10cSrcweir             {
1939cdf0e10cSrcweir             }
1940cdf0e10cSrcweir 
TearDown()194144e8df1fSDamjan Jovanovic         void TearDown()
1942cdf0e10cSrcweir             {
1943cdf0e10cSrcweir             }
194444e8df1fSDamjan Jovanovic     }; // class setData
1945cdf0e10cSrcweir 
194644e8df1fSDamjan Jovanovic     /** the same instance of the class can have different values in different threads
194744e8df1fSDamjan Jovanovic      */
TEST_F(setData,setData_001)194844e8df1fSDamjan Jovanovic     TEST_F(setData, setData_001)
194944e8df1fSDamjan Jovanovic         {
195044e8df1fSDamjan Jovanovic             idThread aThread1;
195144e8df1fSDamjan Jovanovic             aThread1.create();
195244e8df1fSDamjan Jovanovic             idThread aThread2;
195344e8df1fSDamjan Jovanovic             aThread2.create();
1954cdf0e10cSrcweir 
195544e8df1fSDamjan Jovanovic             aThread1.join();
195644e8df1fSDamjan Jovanovic             aThread2.join();
1957cdf0e10cSrcweir 
195844e8df1fSDamjan Jovanovic             oslThreadIdentifier aThreadId1 = aThread1.getIdentifier();
195944e8df1fSDamjan Jovanovic             oslThreadIdentifier aThreadId2 = aThread2.getIdentifier();
1960cdf0e10cSrcweir 
196144e8df1fSDamjan Jovanovic             ASSERT_TRUE(aThread1.m_Id == aThreadId1 && aThread2.m_Id == aThreadId2) << "ThreadData setData: ";
1962cdf0e10cSrcweir 
196344e8df1fSDamjan Jovanovic         }
1964cdf0e10cSrcweir 
TEST_F(setData,setData_002)196544e8df1fSDamjan Jovanovic     TEST_F(setData, setData_002)
196644e8df1fSDamjan Jovanovic         {
196744e8df1fSDamjan Jovanovic             // at first, set the data a value
196844e8df1fSDamjan Jovanovic             char* pc = new char[2];
196944e8df1fSDamjan Jovanovic             char m_nData = 'm';
1970cdf0e10cSrcweir // LLA: this is a copy functions only and really only for \0 terminated strings
1971cdf0e10cSrcweir //      m_nData is not a string, it's a character
1972cdf0e10cSrcweir //          strcpy(pc, &m_nData);
197344e8df1fSDamjan Jovanovic             memcpy(pc, &m_nData, 1);
197444e8df1fSDamjan Jovanovic             pc[1] = '\0';
1975cdf0e10cSrcweir 
197644e8df1fSDamjan Jovanovic             myThreadData.setData(pc);
1977cdf0e10cSrcweir 
197844e8df1fSDamjan Jovanovic             myKeyThread aThread1('a');
197944e8df1fSDamjan Jovanovic             aThread1.create();
198044e8df1fSDamjan Jovanovic             myKeyThread aThread2('b');
198144e8df1fSDamjan Jovanovic             aThread2.create();
198244e8df1fSDamjan Jovanovic             // aThread1 and aThread2 should have not terminated yet, check current data, not 'a' 'b'
198344e8df1fSDamjan Jovanovic             char* pChar = (char*)myThreadData.getData();
198444e8df1fSDamjan Jovanovic             char aChar = *pChar;
1985cdf0e10cSrcweir 
198644e8df1fSDamjan Jovanovic             aThread1.join();
198744e8df1fSDamjan Jovanovic             aThread2.join();
1988cdf0e10cSrcweir 
198944e8df1fSDamjan Jovanovic             // the saved thread data of aThread1 & aThread2, different
199044e8df1fSDamjan Jovanovic             char cData1 = aThread1.m_Char_Test;
199144e8df1fSDamjan Jovanovic             char cData2 = aThread2.m_Char_Test;
1992cdf0e10cSrcweir 
199344e8df1fSDamjan Jovanovic             ASSERT_TRUE(cData1 == 'a' && cData2 == 'b' && aChar == 'm') << "ThreadData setData: ";
1994cdf0e10cSrcweir 
199544e8df1fSDamjan Jovanovic         }
199644e8df1fSDamjan Jovanovic     /** setData the second time, and then getData
199744e8df1fSDamjan Jovanovic      */
TEST_F(setData,setData_003)199844e8df1fSDamjan Jovanovic     TEST_F(setData, setData_003)
199944e8df1fSDamjan Jovanovic         {
200044e8df1fSDamjan Jovanovic             // at first, set the data a value
200144e8df1fSDamjan Jovanovic             char* pc = new char[2];
200244e8df1fSDamjan Jovanovic             char m_nData = 'm';
2003cdf0e10cSrcweir //          strcpy(pc, &m_nData);
200444e8df1fSDamjan Jovanovic             memcpy(pc, &m_nData, 1);
200544e8df1fSDamjan Jovanovic             pc[1] = '\0';
200644e8df1fSDamjan Jovanovic             myThreadData.setData(pc);
2007cdf0e10cSrcweir 
200844e8df1fSDamjan Jovanovic             myKeyThread aThread1('a');
200944e8df1fSDamjan Jovanovic             aThread1.create();
201044e8df1fSDamjan Jovanovic             myKeyThread aThread2('b');
201144e8df1fSDamjan Jovanovic             aThread2.create();
201244e8df1fSDamjan Jovanovic             // aThread1 and aThread2 should have not terminated yet
201344e8df1fSDamjan Jovanovic             // setData the second time
201444e8df1fSDamjan Jovanovic             char* pc2 = new char[2];
201544e8df1fSDamjan Jovanovic             m_nData = 'o';
201644e8df1fSDamjan Jovanovic //          strcpy(pc2, &m_nData);
201744e8df1fSDamjan Jovanovic             memcpy(pc2, &m_nData, 1);
201844e8df1fSDamjan Jovanovic             pc2[1] = '\0';
2019cdf0e10cSrcweir 
202044e8df1fSDamjan Jovanovic             myThreadData.setData(pc2);
202144e8df1fSDamjan Jovanovic             char* pChar = (char*)myThreadData.getData();
202244e8df1fSDamjan Jovanovic             char aChar = *pChar;
2023cdf0e10cSrcweir 
202444e8df1fSDamjan Jovanovic             aThread1.join();
202544e8df1fSDamjan Jovanovic             aThread2.join();
2026cdf0e10cSrcweir 
202744e8df1fSDamjan Jovanovic             // the saved thread data of aThread1 & aThread2, different
202844e8df1fSDamjan Jovanovic             char cData1 = aThread1.m_Char_Test;
202944e8df1fSDamjan Jovanovic             char cData2 = aThread2.m_Char_Test;
2030cdf0e10cSrcweir 
203144e8df1fSDamjan Jovanovic             ASSERT_TRUE(cData1 == 'a' && cData2 == 'b' && aChar == 'o') << "ThreadData setData: ";
2032cdf0e10cSrcweir 
203344e8df1fSDamjan Jovanovic         }
2034cdf0e10cSrcweir 
2035cdf0e10cSrcweir     //sal_Bool buildTwoThreads(char)
2036cdf0e10cSrcweir 
203744e8df1fSDamjan Jovanovic     class getData : public ::testing::Test
2038cdf0e10cSrcweir     {
2039cdf0e10cSrcweir     public:
2040cdf0e10cSrcweir         // initialise your test code values here.
SetUp()204144e8df1fSDamjan Jovanovic         void SetUp()
2042cdf0e10cSrcweir             {
2043cdf0e10cSrcweir             }
2044cdf0e10cSrcweir 
TearDown()204544e8df1fSDamjan Jovanovic         void TearDown()
2046cdf0e10cSrcweir             {
2047cdf0e10cSrcweir             }
204844e8df1fSDamjan Jovanovic     }; // class getData
2049cdf0e10cSrcweir 
205044e8df1fSDamjan Jovanovic     // After setData in child threads, get Data in the main thread, should be independent
TEST_F(getData,getData_001)205144e8df1fSDamjan Jovanovic     TEST_F(getData, getData_001)
205244e8df1fSDamjan Jovanovic         {
205344e8df1fSDamjan Jovanovic             char* pc = new char[2];
205444e8df1fSDamjan Jovanovic             char m_nData[] = "i";
205544e8df1fSDamjan Jovanovic             strcpy(pc, m_nData);
205644e8df1fSDamjan Jovanovic             printf("pc %s\n", pc);
205744e8df1fSDamjan Jovanovic             myThreadData.setData(pc);
2058cdf0e10cSrcweir 
205944e8df1fSDamjan Jovanovic             myKeyThread aThread1('c');
206044e8df1fSDamjan Jovanovic             aThread1.create();
206144e8df1fSDamjan Jovanovic             myKeyThread aThread2('d');
206244e8df1fSDamjan Jovanovic             aThread2.create();
2063cdf0e10cSrcweir 
206444e8df1fSDamjan Jovanovic             aThread1.join();
206544e8df1fSDamjan Jovanovic             aThread2.join();
2066cdf0e10cSrcweir 
206744e8df1fSDamjan Jovanovic             char cData1 = aThread1.m_Char_Test;
206844e8df1fSDamjan Jovanovic             char cData2 = aThread2.m_Char_Test;
2069cdf0e10cSrcweir 
207044e8df1fSDamjan Jovanovic             char* pChar = (char*)myThreadData.getData();
207144e8df1fSDamjan Jovanovic             char aChar = *pChar;
2072cdf0e10cSrcweir 
207344e8df1fSDamjan Jovanovic             ASSERT_TRUE(cData1 == 'c' && cData2 == 'd' && aChar == 'i') << "ThreadData setData: ";
2074cdf0e10cSrcweir 
207544e8df1fSDamjan Jovanovic         }
2076cdf0e10cSrcweir 
207744e8df1fSDamjan Jovanovic     // setData then change the value in the address data pointer points,
207844e8df1fSDamjan Jovanovic     // and then getData, should get the new value
TEST_F(getData,getData_002)207944e8df1fSDamjan Jovanovic     TEST_F(getData, getData_002)
208044e8df1fSDamjan Jovanovic         {
208144e8df1fSDamjan Jovanovic             char* pc = new char[2];
208244e8df1fSDamjan Jovanovic             char m_nData = 'i';
2083cdf0e10cSrcweir //          strcpy(pc, &m_nData);
208444e8df1fSDamjan Jovanovic             memcpy(pc, &m_nData, 1);
208544e8df1fSDamjan Jovanovic             pc[1] = '\0';
2086cdf0e10cSrcweir //          strncpy(pc, &m_nData, sizeof(char);
2087cdf0e10cSrcweir 
208844e8df1fSDamjan Jovanovic             printf("pc %s\n", pc);
208944e8df1fSDamjan Jovanovic             myThreadData.setData(pc);
2090cdf0e10cSrcweir 
209144e8df1fSDamjan Jovanovic             myKeyThread aThread1('a');
209244e8df1fSDamjan Jovanovic             aThread1.create();
209344e8df1fSDamjan Jovanovic             myKeyThread aThread2('b');
209444e8df1fSDamjan Jovanovic             aThread2.create();
2095cdf0e10cSrcweir 
209644e8df1fSDamjan Jovanovic             // change the value which pc points
209744e8df1fSDamjan Jovanovic             char m_nData2 = 'j';
209844e8df1fSDamjan Jovanovic             // strcpy(pc, &m_nData2);
209944e8df1fSDamjan Jovanovic             memcpy(pc, &m_nData2, 1);
210044e8df1fSDamjan Jovanovic             pc[1] = '\0';
2101cdf0e10cSrcweir 
210244e8df1fSDamjan Jovanovic             //printf("pc %s\n", pc);
210344e8df1fSDamjan Jovanovic             void* pChar = myThreadData.getData();
210444e8df1fSDamjan Jovanovic             char aChar = *(char*)pChar;
2105cdf0e10cSrcweir 
210644e8df1fSDamjan Jovanovic             aThread1.join();
210744e8df1fSDamjan Jovanovic             aThread2.join();
2108cdf0e10cSrcweir 
210944e8df1fSDamjan Jovanovic             char cData1 = aThread1.m_Char_Test;
211044e8df1fSDamjan Jovanovic             char cData2 = aThread2.m_Char_Test;
2111cdf0e10cSrcweir 
211244e8df1fSDamjan Jovanovic             ASSERT_TRUE(cData1 == 'a' && cData2 == 'b' && aChar == 'j') << "ThreadData setData: ";
2113cdf0e10cSrcweir 
211444e8df1fSDamjan Jovanovic         }
2115cdf0e10cSrcweir 
2116cdf0e10cSrcweir 
2117cdf0e10cSrcweir } // namespace osl_ThreadData
2118cdf0e10cSrcweir 
main(int argc,char ** argv)211944e8df1fSDamjan Jovanovic int main(int argc, char **argv)
212044e8df1fSDamjan Jovanovic {
212144e8df1fSDamjan Jovanovic     ::testing::InitGoogleTest(&argc, argv);
212244e8df1fSDamjan Jovanovic     return RUN_ALL_TESTS();
212344e8df1fSDamjan Jovanovic }
2124