2 * PROJECT: ReactOS kernel
3 * FILE: regtests/shared/regtests.c
4 * PURPOSE: Regression testing framework
5 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * 06-07-2003 CSH Created
9 #define WIN32_NO_STATUS
11 #define NTOS_MODE_USER
12 #include <ndk/ntndk.h>
13 #include <pseh/pseh.h>
19 typedef struct _PERFORM_TEST_ARGS
21 TestOutputRoutine OutputRoutine
;
32 static LIST_ENTRY AllTests
;
37 InitializeListHead(&AllTests
);
41 FormatExecutionTime(char *buffer
, ULONG milliseconds
)
50 PerformTest(PVOID _arg
)
52 PERFORM_TEST_ARGS
*Args
= (PERFORM_TEST_ARGS
*)_arg
;
53 _PTEST Test
= Args
->Test
;
55 _SetThreadPriority(_GetCurrentThread(), THREAD_PRIORITY_IDLE
);
57 memset(Args
->Buffer
, 0, sizeof(Args
->Buffer
));
61 _Buffer
= Args
->Buffer
;
62 (Test
->Routine
)(TESTCMD_RUN
);
63 Args
->Result
= _Result
;
65 Args
->Result
= TS_FAILED
;
66 sprintf(Args
->Buffer
, "due to exception 0x%lx", _SEH_GetExceptionCode());
72 ControlNormalTest(HANDLE hThread
,
73 PERFORM_TEST_ARGS
*Args
,
77 _FILETIME executionTime
;
80 status
= _WaitForSingleObject(hThread
, TimeOut
);
81 if (status
== WAIT_TIMEOUT
)
83 _TerminateThread(hThread
, 0);
84 Args
->Result
= TS_TIMEDOUT
;
86 status
= _GetThreadTimes(hThread
,
91 Args
->Time
= executionTime
.dwLowDateTime
/ 10000;
95 DisplayResult(PERFORM_TEST_ARGS
* Args
,
100 if (Args
->Result
== TS_OK
)
102 sprintf(OutputBuffer
,
103 "[%s] Success [%s]\n",
105 FormatExecutionTime(Format
,
108 else if (Args
->Result
== TS_TIMEDOUT
)
110 sprintf(OutputBuffer
,
111 "[%s] Timed out [%s]\n",
113 FormatExecutionTime(Format
,
117 sprintf(OutputBuffer
, "[%s] Failed (%s)\n", Args
->TestName
, Args
->Buffer
);
119 if (Args
->OutputRoutine
!= NULL
)
120 (*Args
->OutputRoutine
)(OutputBuffer
);
122 DbgPrint(OutputBuffer
);
126 ControlTest(HANDLE hThread
,
127 PERFORM_TEST_ARGS
*Args
,
134 ControlNormalTest(hThread
, Args
, TimeOut
);
137 printf("Unknown test type %ld\n", TestType
);
143 PerformTests(TestOutputRoutine OutputRoutine
, LPSTR TestName
)
145 PLIST_ENTRY CurrentEntry
;
146 PLIST_ENTRY NextEntry
;
148 PERFORM_TEST_ARGS Args
;
150 char OutputBuffer
[1024];
155 Args
.OutputRoutine
= OutputRoutine
;
156 Args
.TestName
= Name
;
159 CurrentEntry
= AllTests
.Flink
;
160 for (; CurrentEntry
!= &AllTests
; CurrentEntry
= NextEntry
)
162 NextEntry
= CurrentEntry
->Flink
;
163 Current
= CONTAINING_RECORD(CurrentEntry
, _TEST
, ListEntry
);
166 /* Get name of test */
167 memset(Name
, 0, sizeof(Name
));
171 (Current
->Routine
)(TESTCMD_TESTNAME
);
172 if (_Result
!= TS_OK
)
174 if (TestName
!= NULL
)
176 strcpy(Name
, "Unnamed");
179 if ((TestName
!= NULL
) && (_stricmp(Name
, TestName
) != 0))
182 TestType
= TT_NORMAL
;
184 _Buffer
= (char *)&TestType
;
185 (Current
->Routine
)(TESTCMD_TESTTYPE
);
186 if (_Result
!= TS_OK
)
187 TestType
= TT_NORMAL
;
189 /* Get timeout for test */
192 _Buffer
= (char *)&TimeOut
;
193 (Current
->Routine
)(TESTCMD_TIMEOUT
);
194 if (_Result
!= TS_OK
|| TimeOut
== INFINITE
)
197 /* Run test in a separate thread */
198 hThread
= _CreateThread(NULL
, 0, PerformTest
, (PVOID
)&Args
, 0, NULL
);
201 printf("[%s] Failed (CreateThread() failed: %ld)\n",
204 Args
.Result
= TS_FAILED
;
207 ControlTest(hThread
, &Args
, TestType
, TimeOut
);
209 DisplayResult(&Args
, OutputBuffer
);
214 AddTest(TestRoutine Routine
)
218 Test
= (_PTEST
) malloc(sizeof(_TEST
));
221 DbgPrint("Out of memory");
225 Test
->Routine
= Routine
;
227 InsertTailList(&AllTests
, &Test
->ListEntry
);
231 FrameworkGetHook(ULONG index
)
233 return FrameworkGetHookInternal(index
);