2 * PROJECT: ReactOS kernel
3 * FILE: regtests/shared/regtests.h
4 * PURPOSE: Regression testing
5 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * 06-07-2003 CSH Created
13 /* Valid values for Command parameter of TestRoutine */
14 #define TESTCMD_RUN 0 /* Buffer contains information about what failed */
15 #define TESTCMD_TESTNAME 1 /* Buffer contains description of test */
17 /* Valid values for return values of TestRoutine */
18 #define TS_EXCEPTION -1
25 /* Macros to simplify tests */
26 #define DISPATCHER(FunctionName, TestName) \
28 FunctionName(int Command) \
35 case TESTCMD_TESTNAME: \
36 strcpy(_Buffer, TestName); \
39 _Result = TS_FAILED; \
45 AppendAssertion(char *message
)
47 if (strlen(_Buffer
) != 0)
48 strcat(_Buffer
, "\n");
49 strcat(_Buffer
, message
);
53 #define _AssertTrue(_Condition) \
58 sprintf(_message, "Condition was not true at %s:%d", \
59 __FILE__, __LINE__); \
60 AppendAssertion(_message); \
64 #define _AssertFalse(_Condition) \
69 sprintf(_message, "Condition was not false at %s:%d", \
70 __FILE__, __LINE__); \
71 AppendAssertion(_message); \
75 #define _AssertEqualValue(_Expected, _Actual) \
77 ULONG __Expected = (ULONG) (_Expected); \
78 ULONG __Actual = (ULONG) (_Actual); \
79 if ((__Expected) != (__Actual)) \
82 sprintf(_message, "Expected %d/0x%.08x was %d/0x%.08x at %s:%d", \
83 (__Expected), (__Expected), (__Actual), (__Actual), __FILE__, __LINE__); \
84 AppendAssertion(_message); \
88 #define _AssertEqualWideString(_Expected, _Actual) \
90 LPWSTR __Expected = (LPWSTR) (_Expected); \
91 LPWSTR __Actual = (LPWSTR) (_Actual); \
92 if (wcscmp((__Expected), (__Actual)) != 0) \
95 sprintf(_message, "Expected %S was %S at %s:%d", \
96 (__Expected), (__Actual), __FILE__, __LINE__); \
97 AppendAssertion(_message); \
101 #define _AssertNotEqualValue(_Expected, _Actual) \
103 ULONG __Expected = (ULONG) (_Excepted); \
104 ULONG __Actual = (ULONG) (_Actual); \
105 if ((__Expected) == (__Actual)) \
107 char _message[100]; \
108 sprintf(_message, "Actual value expected to be different from %d/0x%.08x at %s:%d", \
109 (__Expected), (__Expected), __FILE__, __LINE__); \
110 AppendAssertion(_message); \
116 * Test routine prototype
117 * Command - The command to process
119 typedef void (*TestRoutine
)(int Command
);
122 * Test output routine prototype
123 * Buffer - Address of buffer with text to output
125 typedef void (*TestOutputRoutine
)(char *Buffer
);
128 * Test driver entry routine.
129 * OutputRoutine - Output routine.
130 * TestName - If NULL all tests are run. If non-NULL specifies the test to be run
132 typedef void STDCALL (*TestDriverMain
)(TestOutputRoutine OutputRoutine
, char *TestName
);
134 typedef struct _ROS_TEST
136 LIST_ENTRY ListEntry
;
138 } ROS_TEST
, *PROS_TEST
;
140 extern LIST_ENTRY AllTests
;
142 extern VOID
InitializeTests();
143 extern VOID
RegisterTests();
144 extern VOID
PerformTests(TestOutputRoutine OutputRoutine
, LPSTR TestName
);
147 typedef struct _API_DESCRIPTION
151 PCHAR ForwardedFunctionName
;
152 PVOID FunctionAddress
;
153 PVOID MockFunctionAddress
;
154 } API_DESCRIPTION
, *PAPI_DESCRIPTION
;
156 extern API_DESCRIPTION ExternalDependencies
[];
157 extern ULONG MaxExternalDependency
;
160 _GetModuleHandleA(LPCSTR lpModuleName
);
163 _GetProcAddress(HMODULE hModule
,
167 _LoadLibraryA(LPCSTR lpLibFileName
);
170 FrameworkGetExportedFunctionNameInternal(PAPI_DESCRIPTION ApiDescription
)
172 if (ApiDescription
->ForwardedFunctionName
!= NULL
)
174 return ApiDescription
->ForwardedFunctionName
;
178 return ApiDescription
->FunctionName
;
183 FrameworkGetFunction(PAPI_DESCRIPTION ApiDescription
)
187 PCHAR exportedFunctionName
;
189 exportedFunctionName
= FrameworkGetExportedFunctionNameInternal(ApiDescription
);
191 hModule
= _GetModuleHandleA(ApiDescription
->FileName
);
194 function
= _GetProcAddress(hModule
, exportedFunctionName
);
198 hModule
= _LoadLibraryA(ApiDescription
->FileName
);
201 function
= _GetProcAddress(hModule
, exportedFunctionName
);
202 //FreeLibrary(hModule);
209 FrameworkGetHookInternal(ULONG index
)
212 PCHAR exportedFunctionName
;
214 if (index
> MaxExternalDependency
)
217 if (ExternalDependencies
[index
].MockFunctionAddress
!= NULL
)
218 return ExternalDependencies
[index
].MockFunctionAddress
;
220 if (ExternalDependencies
[index
].FunctionAddress
!= NULL
)
221 return ExternalDependencies
[index
].FunctionAddress
;
223 exportedFunctionName
= FrameworkGetExportedFunctionNameInternal(&ExternalDependencies
[index
]);
225 printf("Calling function '%s' in DLL '%s'.\n",
226 exportedFunctionName
,
227 ExternalDependencies
[index
].FileName
);
229 address
= FrameworkGetFunction(&ExternalDependencies
[index
]);
233 printf("Function '%s' not found in DLL '%s'.\n",
234 exportedFunctionName
,
235 ExternalDependencies
[index
].FileName
);
237 ExternalDependencies
[index
].FunctionAddress
= address
;
247 PAPI_DESCRIPTION api
;
250 for (index
= 0; index
<= MaxExternalDependency
; index
++)
252 api
= &ExternalDependencies
[index
];
253 if (strcmp(api
->FunctionName
, name
) == 0)
255 api
->MockFunctionAddress
= address
;
264 PVOID FunctionAddress
;
268 _SetHooks(PHOOK hookTable
)
272 hook
= &hookTable
[0];
273 while (hook
->FunctionName
!= NULL
)
275 _SetHook(hook
->FunctionName
,
276 hook
->FunctionAddress
);
282 _UnsetHooks(PHOOK hookTable
)
286 hook
= &hookTable
[0];
287 while (hook
->FunctionName
!= NULL
)
289 _SetHook(hook
->FunctionName
,
298 PAPI_DESCRIPTION api
;
301 for (index
= 0; index
<= MaxExternalDependency
; index
++)
303 api
= &ExternalDependencies
[index
];
304 api
->MockFunctionAddress
= NULL
;