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 PerformTest(PVOID _arg
)
43 PERFORM_TEST_ARGS
*Args
= (PERFORM_TEST_ARGS
*)_arg
;
44 TestOutputRoutine OutputRoutine
= Args
->OutputRoutine
;
45 PROS_TEST Test
= Args
->Test
;
46 LPSTR TestName
= Args
->TestName
;
47 char OutputBuffer
[5000];
50 memset(Buffer
, 0, sizeof(Buffer
));
55 (Test
->Routine
)(TESTCMD_RUN
);
58 sprintf(Buffer
, "due to exception 0x%lx", _SEH_GetExceptionCode());
63 sprintf(OutputBuffer
, "ROSREGTEST: |%s| Status: Failed (%s)\n", TestName
, Buffer
);
67 sprintf(OutputBuffer
, "ROSREGTEST: |%s| Status: Success\n", TestName
);
69 if (OutputRoutine
!= NULL
)
71 (*OutputRoutine
)(OutputBuffer
);
75 DbgPrint(OutputBuffer
);
81 PerformTests(TestOutputRoutine OutputRoutine
, LPSTR TestName
)
83 PLIST_ENTRY CurrentEntry
;
84 PLIST_ENTRY NextEntry
;
86 PERFORM_TEST_ARGS Args
;
88 char OutputBuffer
[1024];
92 Args
.OutputRoutine
= OutputRoutine
;
95 CurrentEntry
= AllTests
.Flink
;
96 for (; CurrentEntry
!= &AllTests
; CurrentEntry
= NextEntry
)
98 NextEntry
= CurrentEntry
->Flink
;
99 Current
= CONTAINING_RECORD(CurrentEntry
, ROS_TEST
, ListEntry
);
102 /* Get name of test */
103 memset(Name
, 0, sizeof(Name
));
107 (Current
->Routine
)(TESTCMD_TESTNAME
);
108 if (_Result
!= TS_OK
)
110 if (TestName
!= NULL
)
114 strcpy(Name
, "Unnamed");
117 if (TestName
!= NULL
)
119 if (_stricmp(Name
, TestName
) != 0)
125 /* Get timeout for test */
128 _Buffer
= (char *)&TimeOut
;
129 (Current
->Routine
)(TESTCMD_TIMEOUT
);
130 if (_Result
!= TS_OK
|| TimeOut
== INFINITE
)
135 /* Run test in thread */
136 hThread
= _CreateThread(NULL
, 0, PerformTest
, (PVOID
)&Args
, 0, NULL
);
139 sprintf(OutputBuffer
,
140 "ROSREGTEST: |%s| Status: Failed (CreateThread failed: 0x%x)\n",
141 Name
, (unsigned int)GetLastError());
143 else if (_WaitForSingleObject(hThread
, TimeOut
) == WAIT_TIMEOUT
)
145 if (!_TerminateThread(hThread
, 0))
147 sprintf(OutputBuffer
,
148 "ROSREGTEST: |%s| Status: Failed (Test timed out - %d ms, TerminateThread failed: 0x%x)\n",
149 Name
, (int)TimeOut
, (unsigned int)GetLastError());
153 sprintf(OutputBuffer
, "ROSREGTEST: |%s| Status: Failed (Test timed out - %d ms)\n", Name
, (int)TimeOut
);
161 if (OutputRoutine
!= NULL
)
163 (*OutputRoutine
)(OutputBuffer
);
167 DbgPrint(OutputBuffer
);
173 AddTest(TestRoutine Routine
)
177 Test
= (PROS_TEST
) malloc(sizeof(ROS_TEST
));
180 DbgPrint("Out of memory");
184 Test
->Routine
= Routine
;
186 InsertTailList(&AllTests
, &Test
->ListEntry
);
190 FrameworkGetHook(ULONG index
)
192 return FrameworkGetHookInternal(index
);