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