1647f063dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3647f063dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4647f063dSAndrew Rist * or more contributor license agreements. See the NOTICE file
5647f063dSAndrew Rist * distributed with this work for additional information
6647f063dSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7647f063dSAndrew Rist * to you under the Apache License, Version 2.0 (the
8647f063dSAndrew Rist * "License"); you may not use this file except in compliance
9647f063dSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11647f063dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13647f063dSAndrew Rist * Unless required by applicable law or agreed to in writing,
14647f063dSAndrew Rist * software distributed under the License is distributed on an
15647f063dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16647f063dSAndrew Rist * KIND, either express or implied. See the License for the
17647f063dSAndrew Rist * specific language governing permissions and limitations
18647f063dSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20647f063dSAndrew Rist *************************************************************/
21647f063dSAndrew Rist
22cdf0e10cSrcweir #include <stdio.h>
23cdf0e10cSrcweir #include <rtl/tres.h>
24cdf0e10cSrcweir #include <osl/diagnose.h>
25cdf0e10cSrcweir #include <osl/time.h>
26cdf0e10cSrcweir
27cdf0e10cSrcweir /* force an assertion on false state */
28cdf0e10cSrcweir #define TST_BOOM(c, m) OSL_ENSURE(c, m)
29cdf0e10cSrcweir
30cdf0e10cSrcweir
31cdf0e10cSrcweir typedef struct _rtl_CmpState
32cdf0e10cSrcweir {
33cdf0e10cSrcweir struct _rtl_CmpState* m_next;
34cdf0e10cSrcweir struct _rtl_CmpState* m_prev;
35cdf0e10cSrcweir
36cdf0e10cSrcweir sal_Bool m_stat;
37cdf0e10cSrcweir rtl_String* m_msg;
38cdf0e10cSrcweir
39cdf0e10cSrcweir } rtl_CmpState;
40cdf0e10cSrcweir
41cdf0e10cSrcweir typedef struct _rtl_FuncState
42cdf0e10cSrcweir {
43cdf0e10cSrcweir struct _rtl_FuncState* m_next;
44cdf0e10cSrcweir struct _rtl_FuncState* m_prev;
45cdf0e10cSrcweir rtl_String* m_name;
46cdf0e10cSrcweir sal_uInt32 m_flags;
47cdf0e10cSrcweir sal_uInt32 m_start;
48cdf0e10cSrcweir sal_uInt32 m_stop;
49cdf0e10cSrcweir struct _rtl_CmpState* m_cmp;
50cdf0e10cSrcweir
51cdf0e10cSrcweir } rtl_FuncState;
52cdf0e10cSrcweir
53cdf0e10cSrcweir
54cdf0e10cSrcweir
55cdf0e10cSrcweir typedef struct _rtl_TestResult_Data
56cdf0e10cSrcweir {
57cdf0e10cSrcweir rtl_TestResult_vtable* m_funcs;
58cdf0e10cSrcweir void* m_externaldata;
59cdf0e10cSrcweir
60cdf0e10cSrcweir rtl_FuncState* m_state;
61cdf0e10cSrcweir
62cdf0e10cSrcweir } rtl_TestResult_Data;
63cdf0e10cSrcweir
64cdf0e10cSrcweir
65cdf0e10cSrcweir /**
66cdf0e10cSrcweir * internal helper functions
67cdf0e10cSrcweir */
68cdf0e10cSrcweir
69cdf0e10cSrcweir /* ...to create, link, unlink and destroy allocated memory */
70cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_create_funcstate( const sal_Char* meth );
71cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_link_funcstate( rtl_FuncState* ptr,
72cdf0e10cSrcweir rtl_FuncState* plink );
73cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_unlink_funcstate( rtl_FuncState* plink );
74cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_create_cmpstate(
75cdf0e10cSrcweir sal_Bool state,
76cdf0e10cSrcweir const sal_Char* msg
77cdf0e10cSrcweir );
78cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_link_cmpstate( rtl_CmpState* ptr,
79cdf0e10cSrcweir rtl_CmpState* plink );
80cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_unlink_cmpstate( rtl_CmpState* plink );
81cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_timer();
82cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_funcstate( rtl_FuncState* pState_ );
83cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_funcstates( rtl_FuncState* pState_ );
84cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_cmpstates( rtl_CmpState* pState_ );
85cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_cmpstate( rtl_CmpState* pState_ );
86cdf0e10cSrcweir
87cdf0e10cSrcweir
88cdf0e10cSrcweir /* set and clear single bits */
89cdf0e10cSrcweir static void SAL_CALL rtl_tres_setbit( rtl_FuncState* pState_,
90cdf0e10cSrcweir sal_uInt32 flag );
91cdf0e10cSrcweir static void SAL_CALL rtl_tres_clearbit( rtl_FuncState* pState_,
92cdf0e10cSrcweir sal_uInt32 flag );
93cdf0e10cSrcweir
94cdf0e10cSrcweir /**
95cdf0e10cSrcweir * forward declarations of concrete function implementations overloadable
96cdf0e10cSrcweir * and accessible via vtable
97cdf0e10cSrcweir */
98cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_state(
99cdf0e10cSrcweir rtl_TestResult* pThis_,
100cdf0e10cSrcweir sal_Bool state,
101cdf0e10cSrcweir const sal_Char* msg,
102cdf0e10cSrcweir const sal_Char* sub,
103cdf0e10cSrcweir sal_Bool v
104cdf0e10cSrcweir );
105cdf0e10cSrcweir
106cdf0e10cSrcweir static void SAL_CALL rtl_tres_end( rtl_TestResult* pThis_,
107cdf0e10cSrcweir const sal_Char* msg );
108cdf0e10cSrcweir
109cdf0e10cSrcweir static rtl_funcstate SAL_CALL rtl_tres_funcstate( rtl_TestResult* pThis_ );
110cdf0e10cSrcweir
111cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_ispassed( rtl_TestResult* pThis_ );
112cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_isok( rtl_TestResult* pThis_ );
113cdf0e10cSrcweir
114cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_isbit( rtl_TestResult* pThis_,
115cdf0e10cSrcweir sal_uInt32 flag );
116cdf0e10cSrcweir
117cdf0e10cSrcweir static rtl_funcstate SAL_CALL rtl_tres_getnextfuncstate( rtl_funcstate );
118cdf0e10cSrcweir static rtl_funcstate SAL_CALL rtl_tres_getprevfuncstate( rtl_funcstate );
119cdf0e10cSrcweir static sal_uInt32 SAL_CALL rtl_tres_getflags( rtl_funcstate );
120cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getstarttime( rtl_funcstate );
121cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getstoptime( rtl_funcstate );
122cdf0e10cSrcweir static rtl_cmpstate SAL_CALL rtl_tres_getcmpstate( rtl_funcstate );
123cdf0e10cSrcweir
124cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_getstat( rtl_cmpstate );
125cdf0e10cSrcweir rtl_String* SAL_CALL rtl_tres_getname( rtl_funcstate );
126cdf0e10cSrcweir rtl_String* SAL_CALL rtl_tres_getmsg( rtl_cmpstate );
127cdf0e10cSrcweir static rtl_cmpstate SAL_CALL rtl_tres_getnextcmpstate( rtl_cmpstate );
128cdf0e10cSrcweir
129cdf0e10cSrcweir
130cdf0e10cSrcweir /**
131cdf0e10cSrcweir * initialize vtable with function pointers
132cdf0e10cSrcweir */
133cdf0e10cSrcweir static rtl_TestResult_vtable trVTable =
134cdf0e10cSrcweir {
135cdf0e10cSrcweir sizeof(rtl_TestResult_vtable),
136cdf0e10cSrcweir rtl_tres_state,
137cdf0e10cSrcweir rtl_tres_end,
138cdf0e10cSrcweir rtl_tres_ispassed,
139cdf0e10cSrcweir rtl_tres_isok,
140cdf0e10cSrcweir rtl_tres_funcstate,
141cdf0e10cSrcweir rtl_tres_isbit,
142cdf0e10cSrcweir rtl_tres_getnextfuncstate,
143cdf0e10cSrcweir rtl_tres_getprevfuncstate,
144cdf0e10cSrcweir rtl_tres_getflags,
145cdf0e10cSrcweir rtl_tres_getname,
146cdf0e10cSrcweir rtl_tres_getstarttime,
147cdf0e10cSrcweir rtl_tres_getstoptime,
148cdf0e10cSrcweir rtl_tres_getcmpstate,
149cdf0e10cSrcweir rtl_tres_getstat,
150cdf0e10cSrcweir rtl_tres_getmsg,
151cdf0e10cSrcweir rtl_tres_getnextcmpstate
152cdf0e10cSrcweir };
153cdf0e10cSrcweir
154cdf0e10cSrcweir /**
155cdf0e10cSrcweir * rtl_tres_create
156cdf0e10cSrcweir * create and initialize data struct for TestResult
157cdf0e10cSrcweir *
158cdf0e10cSrcweir * @param const sal_Char* meth = name of the method (entryname)
159*922709c9Smseidel * @param sal_uInt32 flags = bitmap of commandline and status flags
160cdf0e10cSrcweir *
161cdf0e10cSrcweir * @return rtl_TestResult* = pointer to a new allocated testresult struct
162cdf0e10cSrcweir */
rtl_tres_create(const sal_Char * meth,sal_uInt32 flags)163cdf0e10cSrcweir rtl_TestResult* rtl_tres_create( const sal_Char* meth, sal_uInt32 flags )
164cdf0e10cSrcweir {
165cdf0e10cSrcweir /* allocate memory for testresult data structure */
166cdf0e10cSrcweir rtl_TestResult_Data* pData = (rtl_TestResult_Data*) malloc( sizeof(
167cdf0e10cSrcweir rtl_TestResult_Data ) );
168cdf0e10cSrcweir /* initialize members... */
169cdf0e10cSrcweir pData->m_funcs = &trVTable; /* ...vtableptr to vtbladr */
170509a48ffSpfg pData->m_externaldata = NULL; /* ...external data pointer */
171cdf0e10cSrcweir
172cdf0e10cSrcweir /* allocate memory for state structure and initialize members */
173cdf0e10cSrcweir pData->m_state = rtl_tres_create_funcstate( meth );
174cdf0e10cSrcweir pData->m_state->m_flags = flags; /* ...option Bitmap */
175cdf0e10cSrcweir
176cdf0e10cSrcweir /* set OK flag initial */
177cdf0e10cSrcweir rtl_tres_setbit( pData->m_state, rtl_tres_Flag_OK );
178cdf0e10cSrcweir
179cdf0e10cSrcweir return (rtl_TestResult*)pData ;
180cdf0e10cSrcweir }
181cdf0e10cSrcweir
182cdf0e10cSrcweir /**
183cdf0e10cSrcweir * rtl_tres_create_funcstate
184cdf0e10cSrcweir * allocates and initializes a structure to represent the status of a test
185cdf0e10cSrcweir * entry or its substates
186cdf0e10cSrcweir *
187cdf0e10cSrcweir * @param const sal_Char* meth = the name of the method (entry or sub entry)
188cdf0e10cSrcweir *
189cdf0e10cSrcweir * @return rtl_FuncState* = pointer to a new allocated funcstate struct
190cdf0e10cSrcweir */
rtl_tres_create_funcstate(const sal_Char * meth)191cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_create_funcstate( const sal_Char* meth )
192cdf0e10cSrcweir {
193509a48ffSpfg rtl_FuncState* pStat = NULL; /* status structure */
194cdf0e10cSrcweir
195cdf0e10cSrcweir /* allocate memory for status structure */
196cdf0e10cSrcweir pStat = (rtl_FuncState*) malloc( sizeof( struct _rtl_FuncState ) );
197cdf0e10cSrcweir
198cdf0e10cSrcweir if ( pStat )
199cdf0e10cSrcweir {
200cdf0e10cSrcweir pStat->m_next = pStat; /* init ptr to next struct */
201cdf0e10cSrcweir pStat->m_prev = pStat; /* init ptr to prev struct */
202cdf0e10cSrcweir
203509a48ffSpfg pStat->m_name = NULL; /* init name */
204cdf0e10cSrcweir pStat->m_flags = 0; /* init flags */
205cdf0e10cSrcweir pStat->m_start = rtl_tres_timer(); /* init start milliseconds */
206cdf0e10cSrcweir pStat->m_stop = 0; /* init stop milliseconds */
207509a48ffSpfg pStat->m_cmp = NULL; /* init ptr to msg struct */
208cdf0e10cSrcweir rtl_string_newFromStr( &pStat->m_name, meth );/* copy meth to name */
209cdf0e10cSrcweir
210cdf0e10cSrcweir /* set ok flag initially */
211cdf0e10cSrcweir rtl_tres_setbit(pStat, rtl_tres_Flag_OK);
212cdf0e10cSrcweir }
213cdf0e10cSrcweir
214cdf0e10cSrcweir return ( pStat );
215cdf0e10cSrcweir }
216cdf0e10cSrcweir /**
217cdf0e10cSrcweir * rtl_tres_link_funcstate
218cdf0e10cSrcweir * link initialized funcstate structure to a circular double linked list
219cdf0e10cSrcweir *
220cdf0e10cSrcweir * @param rtl_FuncState* ptr = pointer to a funcstate where to link in new
221cdf0e10cSrcweir * @param rtl_FuncState* plink = pointer to a funcstate to link in list
222cdf0e10cSrcweir *
223cdf0e10cSrcweir * @return rtl_FuncState* = pointer to structure linked in new
224cdf0e10cSrcweir */
rtl_tres_link_funcstate(rtl_FuncState * ptr,rtl_FuncState * plink)225cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_link_funcstate( rtl_FuncState* ptr,
226cdf0e10cSrcweir rtl_FuncState* plink )
227cdf0e10cSrcweir {
228cdf0e10cSrcweir ptr->m_next->m_prev = plink;
229cdf0e10cSrcweir ptr->m_next->m_prev->m_next = ptr->m_next;
230cdf0e10cSrcweir ptr->m_next->m_prev->m_prev = ptr;
231cdf0e10cSrcweir ptr->m_next = plink;
232cdf0e10cSrcweir return ( plink );
233cdf0e10cSrcweir }
234cdf0e10cSrcweir
235cdf0e10cSrcweir /**
236cdf0e10cSrcweir * rtl_tres_unlink_funcstate
237cdf0e10cSrcweir * unlink funcstate structure from a circular double linked list
238cdf0e10cSrcweir *
239cdf0e10cSrcweir * @param rtl_FuncState* plink = pointer to a funcstate to unlink from list
240cdf0e10cSrcweir *
241cdf0e10cSrcweir * @return rtl_FuncState* = pointer to funcstate struct unlinked from
242cdf0e10cSrcweir * list
243cdf0e10cSrcweir */
rtl_tres_unlink_funcstate(rtl_FuncState * plink)244cdf0e10cSrcweir rtl_FuncState* SAL_CALL rtl_tres_unlink_funcstate( rtl_FuncState* plink )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir plink->m_next->m_prev = plink->m_prev;
247cdf0e10cSrcweir plink->m_prev->m_next = plink->m_next;
248cdf0e10cSrcweir plink->m_next = plink;
249cdf0e10cSrcweir plink->m_prev = plink;
250cdf0e10cSrcweir return ( plink );
251cdf0e10cSrcweir }
252cdf0e10cSrcweir
253cdf0e10cSrcweir /**
254cdf0e10cSrcweir * rtl_tres_link_cmpstate
255cdf0e10cSrcweir * link initialized cmpstate structure to a circular double linked list
256cdf0e10cSrcweir *
257cdf0e10cSrcweir * @param rtl_CmpState* ptr = pointer to a cmpstate where to link in new
258cdf0e10cSrcweir * @param rtl_CmpState* plink = pointer to a cmpstate to link in list
259cdf0e10cSrcweir *
260cdf0e10cSrcweir * @return rtl_CmpState* = pointer to cmpstate struct linked in new
261cdf0e10cSrcweir */
rtl_tres_link_cmpstate(rtl_CmpState * ptr,rtl_CmpState * plink)262cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_link_cmpstate( rtl_CmpState* ptr,
263cdf0e10cSrcweir rtl_CmpState* plink )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir ptr->m_next->m_prev = plink;
266cdf0e10cSrcweir ptr->m_next->m_prev->m_next = ptr->m_next;
267cdf0e10cSrcweir ptr->m_next->m_prev->m_prev = ptr;
268cdf0e10cSrcweir ptr->m_next = plink;
269cdf0e10cSrcweir return ( plink );
270cdf0e10cSrcweir }
271cdf0e10cSrcweir /**
272cdf0e10cSrcweir * rtl_tres_unlink_cmpstate
273cdf0e10cSrcweir * unlink cmpstate structure from a circular double linked list
274cdf0e10cSrcweir *
275cdf0e10cSrcweir * @param rtl_CmpState* plink = pointer to a cmpstate to unlink from list
276cdf0e10cSrcweir *
277cdf0e10cSrcweir * @return rtl_CmpState* = pointer to cmpstate struct unlinked from list
278cdf0e10cSrcweir */
rtl_tres_unlink_cmpstate(rtl_CmpState * plink)279cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_unlink_cmpstate( rtl_CmpState* plink )
280cdf0e10cSrcweir {
281cdf0e10cSrcweir plink->m_next->m_prev = plink->m_prev;
282cdf0e10cSrcweir plink->m_prev->m_next = plink->m_next;
283cdf0e10cSrcweir plink->m_next = plink;
284cdf0e10cSrcweir plink->m_prev = plink;
285cdf0e10cSrcweir return ( plink );
286cdf0e10cSrcweir }
287cdf0e10cSrcweir
288cdf0e10cSrcweir /**
289cdf0e10cSrcweir * rtl_tres_create_cmpstate
290cdf0e10cSrcweir * allocates and initializes a structure to represent the status of a test
291cdf0e10cSrcweir * comparison
292cdf0e10cSrcweir *
293cdf0e10cSrcweir * @param sal_Bool state = compare state
294cdf0e10cSrcweir * @param sal_Char* msg = message for logging and debug purposes
295cdf0e10cSrcweir *
296cdf0e10cSrcweir * @return rtl_CmpState* = pointer to the new allocated struct
297cdf0e10cSrcweir */
rtl_tres_create_cmpstate(sal_Bool state,const sal_Char * msg)298cdf0e10cSrcweir rtl_CmpState* SAL_CALL rtl_tres_create_cmpstate(
299cdf0e10cSrcweir sal_Bool state,
300cdf0e10cSrcweir const sal_Char* msg
301cdf0e10cSrcweir )
302cdf0e10cSrcweir {
303cdf0e10cSrcweir /* allocate memory for cmpstate struct */
304cdf0e10cSrcweir rtl_CmpState* pStat = (rtl_CmpState*) malloc( sizeof( rtl_CmpState ) );
305cdf0e10cSrcweir
306cdf0e10cSrcweir /* initialize if memory could be allocated */
307cdf0e10cSrcweir if ( pStat )
308cdf0e10cSrcweir {
309cdf0e10cSrcweir pStat->m_next = pStat; /* init next with this */
310cdf0e10cSrcweir pStat->m_prev = pStat; /* init prev with this */
311509a48ffSpfg pStat->m_msg = NULL;
312cdf0e10cSrcweir pStat->m_stat = state; /* boolean state */
313cdf0e10cSrcweir rtl_string_newFromStr( &pStat->m_msg, msg ); /* copy message */
314cdf0e10cSrcweir }
315cdf0e10cSrcweir return ( pStat );
316cdf0e10cSrcweir }
317cdf0e10cSrcweir
318cdf0e10cSrcweir /**
319cdf0e10cSrcweir * rtl_tres_destroy
320cdf0e10cSrcweir * free allocated memory of testresult data struct
321cdf0e10cSrcweir *
322*922709c9Smseidel * @param rtl_TestResult* pThis_ = pointer to a valid testresult struct
323cdf0e10cSrcweir */
rtl_tres_destroy(rtl_TestResult * pThis_)324cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy( rtl_TestResult* pThis_ )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir /* cast to implementation representation structure */
327cdf0e10cSrcweir rtl_TestResult_Data* pData = (rtl_TestResult_Data*) pThis_;
328cdf0e10cSrcweir
329cdf0e10cSrcweir /* destroy all funcstates */
330cdf0e10cSrcweir if ( pData->m_state )
331cdf0e10cSrcweir rtl_tres_destroy_funcstates( pData->m_state );
332cdf0e10cSrcweir
333*922709c9Smseidel /* free allocated memory and reinitialize to zero */
334cdf0e10cSrcweir /* to be able to prevent dangling pointer access*/
335509a48ffSpfg free( pData ); pData = NULL;
336cdf0e10cSrcweir }
337cdf0e10cSrcweir
338cdf0e10cSrcweir /**
339cdf0e10cSrcweir * rtl_tres_destroy_funcstates
340cdf0e10cSrcweir * free allocated memory occupied by the list of funcstate data structs
341cdf0e10cSrcweir * (iterates through next pointers)
342cdf0e10cSrcweir *
343cdf0e10cSrcweir * @param rtl_FuncState* pState_ = pointer to a valid funcstate struct
344cdf0e10cSrcweir */
rtl_tres_destroy_funcstates(rtl_FuncState * pState_)345cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_funcstates( rtl_FuncState* pState_ )
346cdf0e10cSrcweir {
347cdf0e10cSrcweir rtl_FuncState* plink = pState_->m_next;
348cdf0e10cSrcweir while ( plink != plink->m_next )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir rtl_tres_destroy_funcstate( rtl_tres_unlink_funcstate( plink ) );
351cdf0e10cSrcweir plink = pState_->m_next;
352cdf0e10cSrcweir }
353cdf0e10cSrcweir rtl_tres_destroy_funcstate( plink );
354cdf0e10cSrcweir }
355cdf0e10cSrcweir
356cdf0e10cSrcweir /**
357cdf0e10cSrcweir * rtl_tres_destroy_cmpstates
358cdf0e10cSrcweir * free allocated memory occupied by the list of cmpstate data structs
359cdf0e10cSrcweir * (iterates through next pointers)
360cdf0e10cSrcweir *
361cdf0e10cSrcweir * @param rtl_CmpState* pState_ = pointer to a valid cmpstate struct
362cdf0e10cSrcweir */
rtl_tres_destroy_cmpstates(rtl_CmpState * pState_)363cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_cmpstates( rtl_CmpState* pState_ )
364cdf0e10cSrcweir {
365cdf0e10cSrcweir rtl_CmpState* plink = pState_->m_next;
366cdf0e10cSrcweir while ( plink != plink->m_next )
367cdf0e10cSrcweir {
368cdf0e10cSrcweir rtl_tres_destroy_cmpstate( rtl_tres_unlink_cmpstate( plink ) );
369cdf0e10cSrcweir plink = pState_->m_next;
370cdf0e10cSrcweir }
371cdf0e10cSrcweir rtl_tres_destroy_cmpstate( plink );
372cdf0e10cSrcweir }
373cdf0e10cSrcweir
374cdf0e10cSrcweir
375cdf0e10cSrcweir /**
376cdf0e10cSrcweir * rtl_tres_destroy_funcstate
377cdf0e10cSrcweir * free allocated memory occupied by one funcstate and it's list
378cdf0e10cSrcweir * of cmpstate data structs
379cdf0e10cSrcweir *
380cdf0e10cSrcweir * @param rtl_FuncState* pState_ = pointer to a valid funcstate struct
381cdf0e10cSrcweir */
rtl_tres_destroy_funcstate(rtl_FuncState * pState_)382cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_funcstate( rtl_FuncState* pState_ )
383cdf0e10cSrcweir {
384cdf0e10cSrcweir rtl_FuncState* plink = pState_;
385cdf0e10cSrcweir
386cdf0e10cSrcweir if ( plink->m_cmp )
387cdf0e10cSrcweir rtl_tres_destroy_cmpstates( plink->m_cmp );
388cdf0e10cSrcweir
389cdf0e10cSrcweir if ( plink->m_name )
390cdf0e10cSrcweir {
391cdf0e10cSrcweir rtl_string_release( plink->m_name );
392509a48ffSpfg plink->m_name = NULL;
393cdf0e10cSrcweir }
394cdf0e10cSrcweir plink->m_flags = 0;
395cdf0e10cSrcweir free( plink );
396509a48ffSpfg plink = NULL;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir
399cdf0e10cSrcweir /**
400cdf0e10cSrcweir * rtl_tres_destroy_cmpstate
401cdf0e10cSrcweir * free allocated memory of a cmpstate data struct
402cdf0e10cSrcweir *
403cdf0e10cSrcweir * @param rtl_CmpState* pState_ = pointer to cmpstate struct to destroy
404cdf0e10cSrcweir */
rtl_tres_destroy_cmpstate(rtl_CmpState * pState_)405cdf0e10cSrcweir void SAL_CALL rtl_tres_destroy_cmpstate( rtl_CmpState* pState_ )
406cdf0e10cSrcweir {
407cdf0e10cSrcweir
408cdf0e10cSrcweir rtl_CmpState* plink = pState_;
409cdf0e10cSrcweir
410cdf0e10cSrcweir if ( plink->m_msg )
411cdf0e10cSrcweir {
412cdf0e10cSrcweir rtl_string_release( plink->m_msg );
413509a48ffSpfg plink->m_msg = NULL;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir free( plink );
416509a48ffSpfg plink = NULL;
417cdf0e10cSrcweir }
418cdf0e10cSrcweir /**
419cdf0e10cSrcweir * central function to call in tests
420cdf0e10cSrcweir *
421cdf0e10cSrcweir * @param rtl_TestResult* pThis_ = self pointer to TestResult structure
422cdf0e10cSrcweir * @param sal_Bool state = boolean result of statement comparison
423cdf0e10cSrcweir * @param const sal_Char* msg = message for actual statementcomparison
424cdf0e10cSrcweir * @param const sal_Char* sub = name of sub testfunction
425cdf0e10cSrcweir * @param sal_Bool v = boolean verbose parameter
426cdf0e10cSrcweir *
427cdf0e10cSrcweir * @return sal_Bool = determines if statement comparison
428cdf0e10cSrcweir * was positive or not
429cdf0e10cSrcweir */
rtl_tres_state(rtl_TestResult * pThis_,sal_Bool state,const sal_Char * msg,const sal_Char * sub,sal_Bool v)430cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_state(
431cdf0e10cSrcweir rtl_TestResult* pThis_,
432cdf0e10cSrcweir sal_Bool state,
433cdf0e10cSrcweir const sal_Char* msg,
434cdf0e10cSrcweir const sal_Char* sub,
435cdf0e10cSrcweir sal_Bool v
436cdf0e10cSrcweir )
437cdf0e10cSrcweir {
438cdf0e10cSrcweir
439cdf0e10cSrcweir /* cast pointer to testresult data implementation struct*/
440cdf0e10cSrcweir rtl_TestResult_Data* pData = (rtl_TestResult_Data*)pThis_;
441cdf0e10cSrcweir
442cdf0e10cSrcweir /* initialize funcstate pointer with masterstate */
443cdf0e10cSrcweir rtl_FuncState* pFunc = pData->m_state;
444cdf0e10cSrcweir
445cdf0e10cSrcweir /* if substate required */
446cdf0e10cSrcweir if ( sub )
447cdf0e10cSrcweir {
448cdf0e10cSrcweir /* link new created function state to last item */
449cdf0e10cSrcweir pFunc = rtl_tres_link_funcstate( pFunc->m_prev,
450cdf0e10cSrcweir rtl_tres_create_funcstate( sub ) );
451cdf0e10cSrcweir
452cdf0e10cSrcweir /* indicate this state as substate */
453cdf0e10cSrcweir rtl_tres_setbit( pFunc, rtl_tres_Flag_SUB );
454cdf0e10cSrcweir
455*922709c9Smseidel /* indicate previous state as passed if no masterstate */
456cdf0e10cSrcweir if ( pFunc->m_prev != pData->m_state )
457cdf0e10cSrcweir rtl_tres_setbit( pFunc->m_prev, rtl_tres_Flag_PASSED );
458cdf0e10cSrcweir }
459cdf0e10cSrcweir
460cdf0e10cSrcweir
461cdf0e10cSrcweir /* test failed */
462cdf0e10cSrcweir if( ! state )
463cdf0e10cSrcweir {
464cdf0e10cSrcweir /* determine if assertion should be thrown */
465cdf0e10cSrcweir if ( rtl_tres_isbit( pThis_, rtl_tres_Flag_BOOM ) )
466cdf0e10cSrcweir {
467cdf0e10cSrcweir /* if message available */
468cdf0e10cSrcweir if ( msg )
469cdf0e10cSrcweir TST_BOOM( state, msg );
470cdf0e10cSrcweir else
471cdf0e10cSrcweir TST_BOOM( state, "no msg available" );
472cdf0e10cSrcweir }
473cdf0e10cSrcweir
474cdf0e10cSrcweir /* clear this state ok flag and masterstate ok flag */
475cdf0e10cSrcweir rtl_tres_clearbit( pFunc, rtl_tres_Flag_OK );
476cdf0e10cSrcweir rtl_tres_clearbit( pData->m_state, rtl_tres_Flag_OK );
477cdf0e10cSrcweir }
478cdf0e10cSrcweir /* message available */
479cdf0e10cSrcweir if( msg )
480cdf0e10cSrcweir {
481cdf0e10cSrcweir /* append a new comparison state */
482cdf0e10cSrcweir if (! pFunc->m_cmp )
483cdf0e10cSrcweir pFunc->m_cmp = rtl_tres_create_cmpstate( state, msg );
484cdf0e10cSrcweir else
485cdf0e10cSrcweir rtl_tres_link_cmpstate( pFunc->m_cmp,
486cdf0e10cSrcweir rtl_tres_create_cmpstate(state, msg ) );
487cdf0e10cSrcweir
488cdf0e10cSrcweir /* message to stderr required ? */
489cdf0e10cSrcweir if ( v || ( pFunc->m_next->m_flags & rtl_tres_Flag_VERBOSE ) )
490cdf0e10cSrcweir fprintf( stderr, "%s\n", msg );
491cdf0e10cSrcweir }
492cdf0e10cSrcweir
493cdf0e10cSrcweir pFunc->m_stop = rtl_tres_timer();
494cdf0e10cSrcweir return ( state );
495cdf0e10cSrcweir }
496cdf0e10cSrcweir
497cdf0e10cSrcweir /**
498cdf0e10cSrcweir * rtl_tres_timer
499cdf0e10cSrcweir * function to get actual timevalue
500cdf0e10cSrcweir * this has to be replaced by a high resolution timer
501cdf0e10cSrcweir */
rtl_tres_timer()502cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_timer()
503cdf0e10cSrcweir {
504cdf0e10cSrcweir sal_uInt32 val = 0;
505cdf0e10cSrcweir TimeValue* tmv = (TimeValue*)malloc( sizeof( TimeValue ) );
506cdf0e10cSrcweir osl_getSystemTime( tmv );
507cdf0e10cSrcweir val = tmv->Nanosec/1000L;
508cdf0e10cSrcweir free( tmv );
509cdf0e10cSrcweir return ( val );
510cdf0e10cSrcweir }
511cdf0e10cSrcweir
512cdf0e10cSrcweir
rtl_tres_end(rtl_TestResult * pThis_,const sal_Char * msg)513cdf0e10cSrcweir static void SAL_CALL rtl_tres_end( rtl_TestResult* pThis_,
514cdf0e10cSrcweir const sal_Char* msg )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir rtl_TestResult_Data* pData = (rtl_TestResult_Data*) pThis_;
517cdf0e10cSrcweir
518cdf0e10cSrcweir if( msg )
519cdf0e10cSrcweir {
520cdf0e10cSrcweir if (! pData->m_state->m_cmp )
521cdf0e10cSrcweir pData->m_state->m_cmp = rtl_tres_create_cmpstate( sal_True, msg );
522cdf0e10cSrcweir else
523cdf0e10cSrcweir rtl_tres_link_cmpstate( pData->m_state->m_cmp,
524cdf0e10cSrcweir rtl_tres_create_cmpstate( sal_True, msg ) );
525cdf0e10cSrcweir }
526cdf0e10cSrcweir pData->m_state->m_prev->m_flags |= rtl_tres_Flag_PASSED;
527cdf0e10cSrcweir pData->m_state->m_flags |= rtl_tres_Flag_PASSED;
528cdf0e10cSrcweir pData->m_state->m_stop = rtl_tres_timer();
529cdf0e10cSrcweir }
530cdf0e10cSrcweir
531cdf0e10cSrcweir
rtl_tres_ispassed(rtl_TestResult * pThis_)532cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_ispassed( rtl_TestResult* pThis_ )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir return rtl_tres_isbit( pThis_, rtl_tres_Flag_PASSED );
535cdf0e10cSrcweir }
536cdf0e10cSrcweir
rtl_tres_isok(rtl_TestResult * pThis_)537cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_isok( rtl_TestResult* pThis_ )
538cdf0e10cSrcweir {
539cdf0e10cSrcweir return rtl_tres_isbit( pThis_, rtl_tres_Flag_OK );
540cdf0e10cSrcweir }
541cdf0e10cSrcweir /**
542cdf0e10cSrcweir * return pointer to funcstate structure
543cdf0e10cSrcweir */
rtl_tres_funcstate(rtl_TestResult * pThis_)544cdf0e10cSrcweir static rtl_funcstate SAL_CALL rtl_tres_funcstate( rtl_TestResult* pThis_ )
545cdf0e10cSrcweir {
546cdf0e10cSrcweir
547cdf0e10cSrcweir rtl_TestResult_Data* pThis = (rtl_TestResult_Data*) pThis_;
548cdf0e10cSrcweir return (rtl_funcstate)pThis->m_state;
549cdf0e10cSrcweir }
550cdf0e10cSrcweir
551cdf0e10cSrcweir /**
552cdf0e10cSrcweir * determine if a flag is set or not
553cdf0e10cSrcweir */
rtl_tres_isbit(rtl_TestResult * pThis_,sal_uInt32 flag)554cdf0e10cSrcweir static sal_Bool SAL_CALL rtl_tres_isbit( rtl_TestResult* pThis_,
555cdf0e10cSrcweir sal_uInt32 flag )
556cdf0e10cSrcweir {
557cdf0e10cSrcweir return (sal_Bool)
558cdf0e10cSrcweir ((((rtl_TestResult_Data *) pThis_)->m_state->m_flags & flag) == flag);
559cdf0e10cSrcweir }
560cdf0e10cSrcweir /**
561cdf0e10cSrcweir * set one single bit
562cdf0e10cSrcweir */
rtl_tres_setbit(rtl_FuncState * pState_,sal_uInt32 flag)563cdf0e10cSrcweir static void SAL_CALL rtl_tres_setbit( rtl_FuncState* pState_,
564cdf0e10cSrcweir sal_uInt32 flag )
565cdf0e10cSrcweir {
566cdf0e10cSrcweir pState_->m_flags |= flag;
567cdf0e10cSrcweir }
568cdf0e10cSrcweir /**
569cdf0e10cSrcweir * clear one single bit
570cdf0e10cSrcweir */
rtl_tres_clearbit(rtl_FuncState * pState_,sal_uInt32 flag)571cdf0e10cSrcweir static void SAL_CALL rtl_tres_clearbit( rtl_FuncState* pState_,
572cdf0e10cSrcweir sal_uInt32 flag )
573cdf0e10cSrcweir {
574cdf0e10cSrcweir pState_->m_flags = pState_->m_flags & ( ~flag );
575cdf0e10cSrcweir }
576cdf0e10cSrcweir
577cdf0e10cSrcweir /**
578cdf0e10cSrcweir * returns next pointer of passed funcstate structure
579cdf0e10cSrcweir */
rtl_tres_getnextfuncstate(rtl_funcstate fstate)580cdf0e10cSrcweir rtl_funcstate SAL_CALL rtl_tres_getnextfuncstate( rtl_funcstate fstate )
581cdf0e10cSrcweir {
582cdf0e10cSrcweir rtl_FuncState* fs = (rtl_FuncState*)fstate;
583cdf0e10cSrcweir return( (rtl_funcstate)fs->m_next );
584cdf0e10cSrcweir
585cdf0e10cSrcweir }
586cdf0e10cSrcweir /**
587cdf0e10cSrcweir * returns previous pointer of passed funcstate structure
588cdf0e10cSrcweir */
rtl_tres_getprevfuncstate(rtl_funcstate fstate)589cdf0e10cSrcweir rtl_funcstate SAL_CALL rtl_tres_getprevfuncstate( rtl_funcstate fstate )
590cdf0e10cSrcweir {
591cdf0e10cSrcweir rtl_FuncState* fs = (rtl_FuncState*)fstate;
592cdf0e10cSrcweir return( (rtl_funcstate)fs->m_prev );
593cdf0e10cSrcweir
594cdf0e10cSrcweir }
595cdf0e10cSrcweir /**
596cdf0e10cSrcweir * returns flag value of passed funcstate structure
597cdf0e10cSrcweir */
rtl_tres_getflags(rtl_funcstate fstate)598cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getflags( rtl_funcstate fstate )
599cdf0e10cSrcweir {
600cdf0e10cSrcweir rtl_FuncState* fs = (rtl_FuncState*)fstate;
601cdf0e10cSrcweir return( fs->m_flags );
602cdf0e10cSrcweir }
603cdf0e10cSrcweir /**
604cdf0e10cSrcweir * returns name of passed funcstate structure
605cdf0e10cSrcweir */
rtl_tres_getname(rtl_funcstate fstate)606cdf0e10cSrcweir rtl_String* SAL_CALL rtl_tres_getname( rtl_funcstate fstate )
607cdf0e10cSrcweir {
608cdf0e10cSrcweir rtl_FuncState* fs = (rtl_FuncState*)fstate;
609cdf0e10cSrcweir return( fs->m_name );
610cdf0e10cSrcweir }
611cdf0e10cSrcweir /**
612cdf0e10cSrcweir * returns starttime of passed funcstate structure
613cdf0e10cSrcweir */
rtl_tres_getstarttime(rtl_funcstate fstate)614cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getstarttime( rtl_funcstate fstate )
615cdf0e10cSrcweir {
616cdf0e10cSrcweir rtl_FuncState* fs = (rtl_FuncState*)fstate;
617cdf0e10cSrcweir return( fs->m_start );
618cdf0e10cSrcweir }
619cdf0e10cSrcweir
620cdf0e10cSrcweir /**
621cdf0e10cSrcweir * returns stoptime of passed funcstate structure
622cdf0e10cSrcweir */
rtl_tres_getstoptime(rtl_funcstate fstate)623cdf0e10cSrcweir sal_uInt32 SAL_CALL rtl_tres_getstoptime( rtl_funcstate fstate )
624cdf0e10cSrcweir {
625cdf0e10cSrcweir rtl_FuncState* fs = (rtl_FuncState*)fstate;
626cdf0e10cSrcweir return( fs->m_stop );
627cdf0e10cSrcweir }
628cdf0e10cSrcweir
629cdf0e10cSrcweir /**
630cdf0e10cSrcweir * returns pointer to cmpstate of passed funcstate structure
631cdf0e10cSrcweir */
rtl_tres_getcmpstate(rtl_funcstate fstate)632cdf0e10cSrcweir rtl_cmpstate SAL_CALL rtl_tres_getcmpstate( rtl_funcstate fstate)
633cdf0e10cSrcweir {
634cdf0e10cSrcweir rtl_FuncState* fs = (rtl_FuncState*)fstate;
635cdf0e10cSrcweir return( (rtl_cmpstate)fs->m_cmp );
636cdf0e10cSrcweir
637cdf0e10cSrcweir }
638cdf0e10cSrcweir /**
639cdf0e10cSrcweir * returns boolean state of passed cmpstate structure
640cdf0e10cSrcweir */
rtl_tres_getstat(rtl_cmpstate cstate)641cdf0e10cSrcweir sal_Bool SAL_CALL rtl_tres_getstat( rtl_cmpstate cstate)
642cdf0e10cSrcweir {
643cdf0e10cSrcweir rtl_CmpState* cs = (rtl_CmpState*)cstate;
644cdf0e10cSrcweir return( cs->m_stat );
645cdf0e10cSrcweir }
646cdf0e10cSrcweir /**
647cdf0e10cSrcweir * returns message of passed cmpstate structure
648cdf0e10cSrcweir */
rtl_tres_getmsg(rtl_cmpstate cstate)649cdf0e10cSrcweir rtl_String* SAL_CALL rtl_tres_getmsg( rtl_cmpstate cstate)
650cdf0e10cSrcweir {
651cdf0e10cSrcweir rtl_CmpState* cs = (rtl_CmpState*)cstate;
652cdf0e10cSrcweir return( cs->m_msg );
653cdf0e10cSrcweir }
654cdf0e10cSrcweir /**
655cdf0e10cSrcweir * returns next pointer of passed cmpstate structure
656cdf0e10cSrcweir */
rtl_tres_getnextcmpstate(rtl_cmpstate cstate)657cdf0e10cSrcweir rtl_cmpstate SAL_CALL rtl_tres_getnextcmpstate( rtl_cmpstate cstate)
658cdf0e10cSrcweir {
659cdf0e10cSrcweir rtl_CmpState* cs = (rtl_CmpState*)cstate;
660cdf0e10cSrcweir return( (rtl_cmpstate)cs->m_next );
661cdf0e10cSrcweir }
662cdf0e10cSrcweir
663cdf0e10cSrcweir /*
664cdf0e10cSrcweir // <method_logPrintf>
665cdf0e10cSrcweir //inline void logPrintf ( const sal_Bool bTestCaseState,
666cdf0e10cSrcweir // const char *pFormatStr, ...
667cdf0e10cSrcweir // )
668cdf0e10cSrcweir //{
669cdf0e10cSrcweir // if( m_pFunctions && m_pFunctions->pLogPrintf )
670cdf0e10cSrcweir // {
671cdf0e10cSrcweir // va_list vArgumentList;
672cdf0e10cSrcweir // va_start ( vArgumentList, pFormatStr );
673cdf0e10cSrcweir
674cdf0e10cSrcweir // m_pFunctions->pLogPrintf( this, bTestCaseState, pFormatStr, vArgumentList );
675cdf0e10cSrcweir
676cdf0e10cSrcweir // va_end ( vArgumentList );
677cdf0e10cSrcweir // }
678cdf0e10cSrcweir //} // </method_logPrintf>
679cdf0e10cSrcweir */
680