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
14 #define NTOS_MODE_USER
22 typedef struct _PERFORM_TEST_ARGS
24 TestOutputRoutine OutputRoutine
;
32 static LIST_ENTRY AllTests
;
37 InitializeListHead(&AllTests
);
41 FormatExecutionTime(char *buffer
, LPFILETIME time
)
43 ULONG milliseconds
= time
->dwLowDateTime
/ 10000;
52 PerformTest(PVOID _arg
)
54 PERFORM_TEST_ARGS
*Args
= (PERFORM_TEST_ARGS
*)_arg
;
55 TestOutputRoutine OutputRoutine
= Args
->OutputRoutine
;
56 _PTEST Test
= Args
->Test
;
57 LPSTR TestName
= Args
->TestName
;
60 FILETIME ExecutionTime
;
61 char OutputBuffer
[5000];
65 hThread
= _GetCurrentThread();
66 _SetThreadPriority(hThread
, THREAD_PRIORITY_IDLE
);
68 memset(Buffer
, 0, sizeof(Buffer
));
73 (Test
->Routine
)(TESTCMD_RUN
);
76 sprintf(Buffer
, "due to exception 0x%lx", _SEH_GetExceptionCode());
81 if (!_GetThreadTimes(hThread
,
87 ExecutionTime
.dwLowDateTime
= 0;
88 ExecutionTime
.dwHighDateTime
= 0;
91 "[%s] Success [%s]\n",
93 FormatExecutionTime(Format
,
97 sprintf(OutputBuffer
, "[%s] Failed (%s)\n", TestName
, Buffer
);
99 if (OutputRoutine
!= NULL
)
100 (*OutputRoutine
)(OutputBuffer
);
102 DbgPrint(OutputBuffer
);
107 PerformTests(TestOutputRoutine OutputRoutine
, LPSTR TestName
)
109 PLIST_ENTRY CurrentEntry
;
110 PLIST_ENTRY NextEntry
;
112 PERFORM_TEST_ARGS Args
;
114 char OutputBuffer
[1024];
118 Args
.OutputRoutine
= OutputRoutine
;
119 Args
.TestName
= Name
;
121 CurrentEntry
= AllTests
.Flink
;
122 for (; CurrentEntry
!= &AllTests
; CurrentEntry
= NextEntry
)
124 NextEntry
= CurrentEntry
->Flink
;
125 Current
= CONTAINING_RECORD(CurrentEntry
, _TEST
, ListEntry
);
128 /* Get name of test */
129 memset(Name
, 0, sizeof(Name
));
133 (Current
->Routine
)(TESTCMD_TESTNAME
);
134 if (_Result
!= TS_OK
)
136 if (TestName
!= NULL
)
138 strcpy(Name
, "Unnamed");
141 if ((TestName
!= NULL
) && (_stricmp(Name
, TestName
) != 0))
144 /* Get timeout for test */
147 _Buffer
= (char *)&TimeOut
;
148 (Current
->Routine
)(TESTCMD_TIMEOUT
);
149 if (_Result
!= TS_OK
|| TimeOut
== INFINITE
)
152 /* Run test in thread */
153 hThread
= _CreateThread(NULL
, 0, PerformTest
, (PVOID
)&Args
, 0, NULL
);
155 sprintf(OutputBuffer
,
156 "[%s] Failed (CreateThread() failed: %d)\n",
157 Name
, (unsigned int)_GetLastError());
158 else if (_WaitForSingleObject(hThread
, TimeOut
) == WAIT_TIMEOUT
)
160 if (!_TerminateThread(hThread
, 0))
161 sprintf(OutputBuffer
,
162 "[%s] Failed (timed out after %dms; TerminateThread() failed: %d)\n",
163 Name
, (int)TimeOut
, (unsigned int)_GetLastError());
165 sprintf(OutputBuffer
, "[%s] Failed (timed out after %dms)\n", Name
, (int)TimeOut
);
166 _CloseHandle(hThread
);
170 _CloseHandle(hThread
);
174 if (OutputRoutine
!= NULL
)
175 (*OutputRoutine
)(OutputBuffer
);
177 DbgPrint(OutputBuffer
);
182 AddTest(TestRoutine Routine
)
186 Test
= (_PTEST
) malloc(sizeof(_TEST
));
189 DbgPrint("Out of memory");
193 Test
->Routine
= Routine
;
195 InsertTailList(&AllTests
, &Test
->ListEntry
);
199 FrameworkGetHook(ULONG index
)
201 return FrameworkGetHookInternal(index
);