aschiffler@6717
|
1 |
/*
|
aschiffler@6717
|
2 |
Simple DirectMedia Layer
|
aschiffler@6717
|
3 |
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
|
aschiffler@6717
|
4 |
|
aschiffler@6717
|
5 |
This software is provided 'as-is', without any express or implied
|
aschiffler@6717
|
6 |
warranty. In no event will the authors be held liable for any damages
|
aschiffler@6717
|
7 |
arising from the use of this software.
|
aschiffler@6717
|
8 |
|
aschiffler@6717
|
9 |
Permission is granted to anyone to use this software for any purpose,
|
aschiffler@6717
|
10 |
including commercial applications, and to alter it and redistribute it
|
aschiffler@6717
|
11 |
freely, subject to the following restrictions:
|
aschiffler@6717
|
12 |
|
aschiffler@6717
|
13 |
1. The origin of this software must not be misrepresented; you must not
|
aschiffler@6717
|
14 |
claim that you wrote the original software. If you use this software
|
aschiffler@6717
|
15 |
in a product, an acknowledgment in the product documentation would be
|
aschiffler@6717
|
16 |
appreciated but is not required.
|
aschiffler@6717
|
17 |
2. Altered source versions must be plainly marked as such, and must not be
|
aschiffler@6717
|
18 |
misrepresented as being the original software.
|
aschiffler@6717
|
19 |
3. This notice may not be removed or altered from any source distribution.
|
aschiffler@6717
|
20 |
*/
|
aschiffler@6717
|
21 |
|
aschiffler@6717
|
22 |
#include "SDL_config.h"
|
aschiffler@6717
|
23 |
|
aschiffler@6717
|
24 |
#include "SDL_test.h"
|
aschiffler@6717
|
25 |
|
aschiffler@6721
|
26 |
#include <stdio.h>
|
aschiffler@6721
|
27 |
#include <stdlib.h>
|
aschiffler@6718
|
28 |
#include <string.h>
|
aschiffler@6721
|
29 |
#include <time.h>
|
aschiffler@6718
|
30 |
|
aschiffler@6721
|
31 |
/* Assert check message format */
|
aschiffler@6721
|
32 |
const char *SDLTest_TestCheckFmt = "Test '%s': %s";
|
aschiffler@6721
|
33 |
|
aschiffler@6721
|
34 |
/* Invalid test name/description message format */
|
aschiffler@6721
|
35 |
const char *SDLTest_InvalidNameFmt = "(Invalid)";
|
aschiffler@6721
|
36 |
|
aschiffler@6721
|
37 |
/*! \brief Timeout for single test case execution */
|
aschiffler@6721
|
38 |
static Uint32 SDLTest_TestCaseTimeout = 3600;
|
aschiffler@6717
|
39 |
|
aschiffler@6717
|
40 |
/**
|
aschiffler@6717
|
41 |
* Generates a random run seed string for the harness. The generated seed
|
aschiffler@6717
|
42 |
* will contain alphanumeric characters (0-9A-Z).
|
aschiffler@6717
|
43 |
*
|
aschiffler@6717
|
44 |
* Note: The returned string needs to be deallocated by the caller.
|
aschiffler@6717
|
45 |
*
|
aschiffler@6717
|
46 |
* \param length The length of the seed string to generate
|
aschiffler@6717
|
47 |
*
|
aschiffler@6717
|
48 |
* \returns The generated seed string
|
aschiffler@6717
|
49 |
*/
|
aschiffler@6717
|
50 |
char *
|
aschiffler@6717
|
51 |
SDLTest_GenerateRunSeed(const int length)
|
aschiffler@6717
|
52 |
{
|
aschiffler@6717
|
53 |
char *seed = NULL;
|
aschiffler@6717
|
54 |
SDLTest_RandomContext randomContext;
|
aschiffler@6717
|
55 |
int counter;
|
aschiffler@6717
|
56 |
|
aschiffler@6717
|
57 |
// Sanity check input
|
aschiffler@6717
|
58 |
if (length <= 0) {
|
aschiffler@6717
|
59 |
SDLTest_LogError("The length of the harness seed must be >0.");
|
aschiffler@6717
|
60 |
return NULL;
|
aschiffler@6717
|
61 |
}
|
aschiffler@6717
|
62 |
|
aschiffler@6717
|
63 |
// Allocate output buffer
|
aschiffler@6717
|
64 |
seed = (char *)SDL_malloc((length + 1) * sizeof(char));
|
aschiffler@6717
|
65 |
if (seed == NULL) {
|
aschiffler@6717
|
66 |
SDLTest_LogError("SDL_malloc for run seed output buffer failed.");
|
aschiffler@6717
|
67 |
return NULL;
|
aschiffler@6717
|
68 |
}
|
aschiffler@6717
|
69 |
|
aschiffler@6717
|
70 |
// Generate a random string of alphanumeric characters
|
aschiffler@6717
|
71 |
SDLTest_RandomInitTime(&randomContext);
|
aschiffler@6717
|
72 |
for (counter = 0; counter < length - 1; ++counter) {
|
aschiffler@6717
|
73 |
unsigned int number = SDLTest_Random(&randomContext);
|
aschiffler@6717
|
74 |
char ch = (char) (number % (91 - 48)) + 48;
|
aschiffler@6717
|
75 |
if (ch >= 58 && ch <= 64) {
|
aschiffler@6717
|
76 |
ch = 65;
|
aschiffler@6717
|
77 |
}
|
aschiffler@6717
|
78 |
seed[counter] = ch;
|
aschiffler@6717
|
79 |
}
|
aschiffler@6717
|
80 |
seed[counter] = '\0';
|
aschiffler@6717
|
81 |
|
aschiffler@6717
|
82 |
return seed;
|
aschiffler@6717
|
83 |
}
|
aschiffler@6717
|
84 |
|
aschiffler@6717
|
85 |
/**
|
aschiffler@6717
|
86 |
* Generates an execution key for the fuzzer.
|
aschiffler@6717
|
87 |
*
|
aschiffler@6717
|
88 |
* \param runSeed The run seed to use
|
aschiffler@6717
|
89 |
* \param suiteName The name of the test suite
|
aschiffler@6717
|
90 |
* \param testName The name of the test
|
aschiffler@6717
|
91 |
* \param iteration The iteration count
|
aschiffler@6717
|
92 |
*
|
aschiffler@6717
|
93 |
* \returns The generated execution key to initialize the fuzzer with.
|
aschiffler@6717
|
94 |
*
|
aschiffler@6717
|
95 |
*/
|
aschiffler@6717
|
96 |
Uint64
|
aschiffler@6717
|
97 |
SDLTest_GenerateExecKey(char *runSeed, char *suiteName, char *testName, int iteration)
|
aschiffler@6717
|
98 |
{
|
aschiffler@6717
|
99 |
SDLTest_Md5Context md5Context;
|
aschiffler@6717
|
100 |
Uint64 *keys;
|
aschiffler@6717
|
101 |
char iterationString[16];
|
aschiffler@6717
|
102 |
Uint32 runSeedLength;
|
aschiffler@6717
|
103 |
Uint32 suiteNameLength;
|
aschiffler@6717
|
104 |
Uint32 testNameLength;
|
aschiffler@6717
|
105 |
Uint32 iterationStringLength;
|
aschiffler@6717
|
106 |
Uint32 entireStringLength;
|
aschiffler@6717
|
107 |
char *buffer;
|
aschiffler@6717
|
108 |
|
aschiffler@6717
|
109 |
if (runSeed == NULL || strlen(runSeed)==0) {
|
aschiffler@6717
|
110 |
SDLTest_LogError("Invalid runSeed string.");
|
aschiffler@6717
|
111 |
return -1;
|
aschiffler@6717
|
112 |
}
|
aschiffler@6717
|
113 |
|
aschiffler@6717
|
114 |
if (suiteName == NULL || strlen(suiteName)==0) {
|
aschiffler@6717
|
115 |
SDLTest_LogError("Invalid suiteName string.");
|
aschiffler@6717
|
116 |
return -1;
|
aschiffler@6717
|
117 |
}
|
aschiffler@6717
|
118 |
|
aschiffler@6717
|
119 |
if (testName == NULL || strlen(testName)==0) {
|
aschiffler@6717
|
120 |
SDLTest_LogError("Invalid testName string.");
|
aschiffler@6717
|
121 |
return -1;
|
aschiffler@6717
|
122 |
}
|
aschiffler@6717
|
123 |
|
aschiffler@6717
|
124 |
if (iteration <= 0) {
|
aschiffler@6717
|
125 |
SDLTest_LogError("Invalid iteration count.");
|
aschiffler@6717
|
126 |
return -1;
|
aschiffler@6717
|
127 |
}
|
aschiffler@6717
|
128 |
|
aschiffler@6717
|
129 |
// Convert iteration number into a string
|
aschiffler@6717
|
130 |
memset(iterationString, 0, sizeof(iterationString));
|
aschiffler@6717
|
131 |
SDL_snprintf(iterationString, sizeof(iterationString) - 1, "%d", iteration);
|
aschiffler@6717
|
132 |
|
aschiffler@6717
|
133 |
// Combine the parameters into single string
|
aschiffler@6717
|
134 |
runSeedLength = strlen(runSeed);
|
aschiffler@6717
|
135 |
suiteNameLength = strlen(suiteName);
|
aschiffler@6717
|
136 |
testNameLength = strlen(testName);
|
aschiffler@6717
|
137 |
iterationStringLength = strlen(iterationString);
|
aschiffler@6717
|
138 |
entireStringLength = runSeedLength + suiteNameLength + testNameLength + iterationStringLength + 1;
|
aschiffler@6717
|
139 |
buffer = (char *)SDL_malloc(entireStringLength);
|
aschiffler@6717
|
140 |
if (buffer == NULL) {
|
aschiffler@6717
|
141 |
SDLTest_LogError("SDL_malloc failed to allocate buffer for execKey generation.");
|
aschiffler@6717
|
142 |
return 0;
|
aschiffler@6717
|
143 |
}
|
aschiffler@6717
|
144 |
SDL_snprintf(buffer, entireStringLength, "%s%s%s%d", runSeed, suiteName, testName, iteration);
|
aschiffler@6717
|
145 |
|
aschiffler@6717
|
146 |
// Hash string and use half of the digest as 64bit exec key
|
aschiffler@6717
|
147 |
SDLTest_Md5Init(&md5Context);
|
aschiffler@6717
|
148 |
SDLTest_Md5Update(&md5Context, (unsigned char *)buffer, entireStringLength);
|
aschiffler@6717
|
149 |
SDLTest_Md5Final(&md5Context);
|
aschiffler@6717
|
150 |
SDL_free(buffer);
|
aschiffler@6717
|
151 |
keys = (Uint64 *)md5Context.digest;
|
aschiffler@6717
|
152 |
|
aschiffler@6717
|
153 |
return keys[0];
|
aschiffler@6717
|
154 |
}
|
aschiffler@6718
|
155 |
|
aschiffler@6718
|
156 |
/**
|
aschiffler@6718
|
157 |
* \brief Set timeout handler for test.
|
aschiffler@6718
|
158 |
*
|
aschiffler@6718
|
159 |
* Note: SDL_Init(SDL_INIT_TIMER) will be called if it wasn't done so before.
|
aschiffler@6718
|
160 |
*
|
aschiffler@6718
|
161 |
* \param timeout Timeout interval in seconds.
|
aschiffler@6718
|
162 |
* \param callback Function that will be called after timeout has elapsed.
|
aschiffler@6718
|
163 |
*
|
aschiffler@6718
|
164 |
* \return Timer id or -1 on failure.
|
aschiffler@6718
|
165 |
*/
|
aschiffler@6718
|
166 |
SDL_TimerID
|
aschiffler@6721
|
167 |
SDLTest_SetTestTimeout(int timeout, void (*callback)())
|
aschiffler@6718
|
168 |
{
|
aschiffler@6718
|
169 |
Uint32 timeoutInMilliseconds;
|
aschiffler@6718
|
170 |
SDL_TimerID timerID;
|
aschiffler@6718
|
171 |
|
aschiffler@6718
|
172 |
if (callback == NULL) {
|
aschiffler@6718
|
173 |
SDLTest_LogError("Timeout callback can't be NULL");
|
aschiffler@6718
|
174 |
return -1;
|
aschiffler@6718
|
175 |
}
|
aschiffler@6718
|
176 |
|
aschiffler@6718
|
177 |
if (timeout < 0) {
|
aschiffler@6718
|
178 |
SDLTest_LogError("Timeout value must be bigger than zero.");
|
aschiffler@6718
|
179 |
return -1;
|
aschiffler@6718
|
180 |
}
|
aschiffler@6718
|
181 |
|
aschiffler@6718
|
182 |
/* Init SDL timer if not initialized before */
|
aschiffler@6718
|
183 |
if (SDL_WasInit(SDL_INIT_TIMER) == 0) {
|
aschiffler@6718
|
184 |
if (SDL_InitSubSystem(SDL_INIT_TIMER)) {
|
aschiffler@6718
|
185 |
SDLTest_LogError("Failed to init timer subsystem: %s", SDL_GetError());
|
aschiffler@6718
|
186 |
return -1;
|
aschiffler@6718
|
187 |
}
|
aschiffler@6718
|
188 |
}
|
aschiffler@6718
|
189 |
|
aschiffler@6718
|
190 |
/* Set timer */
|
aschiffler@6718
|
191 |
timeoutInMilliseconds = timeout * 1000;
|
aschiffler@6718
|
192 |
timerID = SDL_AddTimer(timeoutInMilliseconds, (SDL_TimerCallback)callback, 0x0);
|
aschiffler@6718
|
193 |
if (timerID == 0) {
|
aschiffler@6718
|
194 |
SDLTest_LogError("Creation of SDL timer failed: %s", SDL_GetError());
|
aschiffler@6718
|
195 |
return -1;
|
aschiffler@6718
|
196 |
}
|
aschiffler@6718
|
197 |
|
aschiffler@6718
|
198 |
return timerID;
|
aschiffler@6718
|
199 |
}
|
aschiffler@6721
|
200 |
|
aschiffler@6721
|
201 |
void
|
aschiffler@6721
|
202 |
SDLTest_BailOut()
|
aschiffler@6721
|
203 |
{
|
aschiffler@6721
|
204 |
SDLTest_LogError("TestCaseTimeout timer expired. Aborting test run.");
|
aschiffler@6721
|
205 |
exit(TEST_ABORTED); // bail out from the test
|
aschiffler@6721
|
206 |
}
|
aschiffler@6721
|
207 |
|
aschiffler@6721
|
208 |
/**
|
aschiffler@6721
|
209 |
* \brief Execute a test using the given execution key.
|
aschiffler@6721
|
210 |
*
|
aschiffler@6721
|
211 |
* \param testSuite Suite containing the test case.
|
aschiffler@6721
|
212 |
* \param testCase Case to execute.
|
aschiffler@6721
|
213 |
* \param execKey Execution key for the fuzzer.
|
aschiffler@6721
|
214 |
*
|
aschiffler@6721
|
215 |
* \returns Test case result.
|
aschiffler@6721
|
216 |
*/
|
aschiffler@6721
|
217 |
int
|
aschiffler@6721
|
218 |
SDLTest_RunTest(SDLTest_TestSuiteReference *testSuite, SDLTest_TestCaseReference *testCase, Uint64 execKey)
|
aschiffler@6721
|
219 |
{
|
aschiffler@6721
|
220 |
SDL_TimerID timer = 0;
|
aschiffler@6721
|
221 |
|
aschiffler@6721
|
222 |
if (testSuite==NULL || testCase==NULL || testSuite->name==NULL || testCase->name==NULL)
|
aschiffler@6721
|
223 |
{
|
aschiffler@6721
|
224 |
SDLTest_LogError("Setup failure: testSuite or testCase references NULL");
|
aschiffler@6721
|
225 |
return TEST_RESULT_SETUP_FAILURE;
|
aschiffler@6721
|
226 |
}
|
aschiffler@6721
|
227 |
|
aschiffler@6721
|
228 |
if (!testCase->enabled)
|
aschiffler@6721
|
229 |
{
|
aschiffler@6721
|
230 |
SDLTest_Log((char *)SDLTest_TestCheckFmt, testCase->name, "Skipped");
|
aschiffler@6721
|
231 |
return TEST_RESULT_SKIPPED;
|
aschiffler@6721
|
232 |
}
|
aschiffler@6721
|
233 |
|
aschiffler@6721
|
234 |
// Initialize fuzzer
|
aschiffler@6721
|
235 |
SDLTest_FuzzerInit(execKey);
|
aschiffler@6721
|
236 |
|
aschiffler@6721
|
237 |
// Reset assert tracker
|
aschiffler@6721
|
238 |
SDLTest_ResetAssertSummary();
|
aschiffler@6721
|
239 |
|
aschiffler@6721
|
240 |
// Set timeout timer
|
aschiffler@6721
|
241 |
timer = SDLTest_SetTestTimeout(SDLTest_TestCaseTimeout, SDLTest_BailOut);
|
aschiffler@6721
|
242 |
|
aschiffler@6721
|
243 |
// Maybe run suite initalizer function
|
aschiffler@6721
|
244 |
if (testSuite->testSetUp) {
|
aschiffler@6721
|
245 |
testSuite->testSetUp(0x0);
|
aschiffler@6721
|
246 |
if (SDLTest_AssertsFailed > 0) {
|
aschiffler@6721
|
247 |
SDLTest_LogError((char *)SDLTest_TestCheckFmt, testSuite->name, "Failed");
|
aschiffler@6721
|
248 |
return TEST_RESULT_SETUP_FAILURE;
|
aschiffler@6721
|
249 |
}
|
aschiffler@6721
|
250 |
}
|
aschiffler@6721
|
251 |
|
aschiffler@6721
|
252 |
// Run test case function
|
aschiffler@6721
|
253 |
testCase->testCase(0x0);
|
aschiffler@6721
|
254 |
|
aschiffler@6721
|
255 |
// Maybe run suite cleanup function
|
aschiffler@6721
|
256 |
if (testSuite->testTearDown) {
|
aschiffler@6721
|
257 |
testSuite->testTearDown(0x0);
|
aschiffler@6721
|
258 |
}
|
aschiffler@6721
|
259 |
|
aschiffler@6721
|
260 |
// Cancel timeout timer
|
aschiffler@6721
|
261 |
if (timer) {
|
aschiffler@6721
|
262 |
SDL_RemoveTimer(timer);
|
aschiffler@6721
|
263 |
}
|
aschiffler@6721
|
264 |
|
aschiffler@6721
|
265 |
// Report on asserts and fuzzer usage
|
aschiffler@6721
|
266 |
SDLTest_Log("Fuzzer invocations: %d", SDLTest_GetFuzzerInvocationCount());
|
aschiffler@6721
|
267 |
SDLTest_LogAssertSummary();
|
aschiffler@6721
|
268 |
|
aschiffler@6721
|
269 |
// Analyze assert count to determine test case result
|
aschiffler@6721
|
270 |
if (SDLTest_AssertsFailed > 0) {
|
aschiffler@6721
|
271 |
SDLTest_LogError((char *)SDLTest_TestCheckFmt, testCase->name, "Failed");
|
aschiffler@6721
|
272 |
return TEST_RESULT_FAILED;
|
aschiffler@6721
|
273 |
} else {
|
aschiffler@6721
|
274 |
if (SDLTest_AssertsPassed > 0) {
|
aschiffler@6721
|
275 |
SDLTest_Log((char *)SDLTest_TestCheckFmt, testCase->name, "Passed");
|
aschiffler@6721
|
276 |
return TEST_RESULT_PASSED;
|
aschiffler@6721
|
277 |
} else {
|
aschiffler@6721
|
278 |
SDLTest_LogError((char *)SDLTest_TestCheckFmt, testCase->name, "No Asserts");
|
aschiffler@6721
|
279 |
return TEST_RESULT_NO_ASSERT;
|
aschiffler@6721
|
280 |
}
|
aschiffler@6721
|
281 |
}
|
aschiffler@6721
|
282 |
}
|
aschiffler@6721
|
283 |
|
aschiffler@6721
|
284 |
/* Prints summary of all suites/tests contained in the given reference */
|
aschiffler@6721
|
285 |
void SDLTest_LogTestSuiteSummary(SDLTest_TestSuiteReference *testSuites)
|
aschiffler@6721
|
286 |
{
|
aschiffler@6721
|
287 |
int suiteCounter;
|
aschiffler@6721
|
288 |
int testCounter;
|
aschiffler@6721
|
289 |
SDLTest_TestSuiteReference *testSuite;
|
aschiffler@6721
|
290 |
SDLTest_TestCaseReference *testCase;
|
aschiffler@6721
|
291 |
|
aschiffler@6721
|
292 |
// Loop over all suites
|
aschiffler@6721
|
293 |
suiteCounter = 0;
|
aschiffler@6721
|
294 |
while(&testSuites[suiteCounter]) {
|
aschiffler@6721
|
295 |
testSuite=&testSuites[suiteCounter];
|
aschiffler@6721
|
296 |
suiteCounter++;
|
aschiffler@6721
|
297 |
SDLTest_Log("Test Suite %i - %s\n", suiteCounter,
|
aschiffler@6721
|
298 |
(testSuite->name) ? testSuite->name : SDLTest_InvalidNameFmt);
|
aschiffler@6721
|
299 |
|
aschiffler@6721
|
300 |
// Loop over all test cases
|
aschiffler@6721
|
301 |
testCounter = 0;
|
aschiffler@6721
|
302 |
while(testSuite->testCases[testCounter])
|
aschiffler@6721
|
303 |
{
|
aschiffler@6721
|
304 |
testCase=(SDLTest_TestCaseReference *)testSuite->testCases[testCounter];
|
aschiffler@6721
|
305 |
testCounter++;
|
aschiffler@6721
|
306 |
SDLTest_Log(" Test Case %i - %s: %s", testCounter,
|
aschiffler@6721
|
307 |
(testCase->name) ? testCase->name : SDLTest_InvalidNameFmt,
|
aschiffler@6721
|
308 |
(testCase->description) ? testCase->description : SDLTest_InvalidNameFmt);
|
aschiffler@6721
|
309 |
}
|
aschiffler@6721
|
310 |
}
|
aschiffler@6721
|
311 |
}
|
aschiffler@6721
|
312 |
|
aschiffler@6721
|
313 |
|
aschiffler@6721
|
314 |
/**
|
aschiffler@6721
|
315 |
* \brief Execute a test using the given execution key.
|
aschiffler@6721
|
316 |
*
|
aschiffler@6721
|
317 |
* \param testSuites Suites containing the test case.
|
aschiffler@6721
|
318 |
* \param userRunSeed Custom run seed provided by user, or NULL to autogenerate one.
|
aschiffler@6721
|
319 |
* \param userExecKey Custom execution key provided by user, or 0 to autogenerate one.
|
aschiffler@6721
|
320 |
* \param testIterations Number of iterations to run each test case.
|
aschiffler@6721
|
321 |
*
|
aschiffler@6721
|
322 |
* \returns Test run result; 0 when all tests passed, 1 if any tests failed.
|
aschiffler@6721
|
323 |
*/
|
aschiffler@6721
|
324 |
int
|
aschiffler@6721
|
325 |
SDLTest_RunSuites(SDLTest_TestSuiteReference *testSuites, char *userRunSeed, Uint64 userExecKey, int testIterations)
|
aschiffler@6721
|
326 |
{
|
aschiffler@6721
|
327 |
int suiteCounter;
|
aschiffler@6721
|
328 |
int testCounter;
|
aschiffler@6721
|
329 |
int iterationCounter;
|
aschiffler@6721
|
330 |
SDLTest_TestSuiteReference *testSuite;
|
aschiffler@6721
|
331 |
SDLTest_TestCaseReference *testCase;
|
aschiffler@6721
|
332 |
char *runSeed;
|
aschiffler@6721
|
333 |
Uint64 execKey;
|
aschiffler@6721
|
334 |
Uint32 runStartTicks;
|
aschiffler@6721
|
335 |
time_t runStartTimestamp;
|
aschiffler@6721
|
336 |
Uint32 suiteStartTicks;
|
aschiffler@6721
|
337 |
time_t suiteStartTimestamp;
|
aschiffler@6721
|
338 |
Uint32 testStartTicks;
|
aschiffler@6721
|
339 |
time_t testStartTimestamp;
|
aschiffler@6721
|
340 |
Uint32 runEndTicks;
|
aschiffler@6721
|
341 |
time_t runEndTimestamp;
|
aschiffler@6721
|
342 |
Uint32 suiteEndTicks;
|
aschiffler@6721
|
343 |
time_t suiteEndTimestamp;
|
aschiffler@6721
|
344 |
Uint32 testEndTicks;
|
aschiffler@6721
|
345 |
time_t testEndTimestamp;
|
aschiffler@6721
|
346 |
int testResult;
|
aschiffler@6721
|
347 |
int totalTestFailedCount, totalTestPassedCount, totalTestSkippedCount;
|
aschiffler@6721
|
348 |
int testFailedCount, testPassedCount, testSkippedCount;
|
aschiffler@6721
|
349 |
|
aschiffler@6721
|
350 |
// Sanitize test iterations
|
aschiffler@6721
|
351 |
if (testIterations < 1) {
|
aschiffler@6721
|
352 |
testIterations = 1;
|
aschiffler@6721
|
353 |
}
|
aschiffler@6721
|
354 |
|
aschiffler@6721
|
355 |
// Generate run see if we don't have one already
|
aschiffler@6721
|
356 |
if (userRunSeed == NULL || strlen(userRunSeed) == 0) {
|
aschiffler@6721
|
357 |
runSeed = SDLTest_GenerateRunSeed(16);
|
aschiffler@6721
|
358 |
if (runSeed == NULL) {
|
aschiffler@6721
|
359 |
SDLTest_LogError("Generating a random run seed failed");
|
aschiffler@6721
|
360 |
return 2;
|
aschiffler@6721
|
361 |
}
|
aschiffler@6721
|
362 |
}
|
aschiffler@6721
|
363 |
|
aschiffler@6721
|
364 |
// Reset per-run counters
|
aschiffler@6721
|
365 |
totalTestFailedCount = totalTestPassedCount = totalTestSkippedCount = 0;
|
aschiffler@6721
|
366 |
|
aschiffler@6721
|
367 |
// Take time - run start
|
aschiffler@6721
|
368 |
runStartTicks = SDL_GetTicks();
|
aschiffler@6721
|
369 |
runStartTimestamp = time(0);
|
aschiffler@6721
|
370 |
|
aschiffler@6721
|
371 |
// TODO log run started
|
aschiffler@6721
|
372 |
|
aschiffler@6721
|
373 |
// Loop over all suites
|
aschiffler@6721
|
374 |
suiteCounter = 0;
|
aschiffler@6721
|
375 |
while(&testSuites[suiteCounter]) {
|
aschiffler@6721
|
376 |
testSuite=&testSuites[suiteCounter];
|
aschiffler@6721
|
377 |
suiteCounter++;
|
aschiffler@6721
|
378 |
|
aschiffler@6721
|
379 |
// Reset per-suite counters
|
aschiffler@6721
|
380 |
testFailedCount = testPassedCount = testSkippedCount = 0;
|
aschiffler@6721
|
381 |
|
aschiffler@6721
|
382 |
// Take time - suite start
|
aschiffler@6721
|
383 |
suiteStartTicks = SDL_GetTicks();
|
aschiffler@6721
|
384 |
suiteStartTimestamp = time(0);
|
aschiffler@6721
|
385 |
|
aschiffler@6721
|
386 |
// TODO log suite started
|
aschiffler@6721
|
387 |
SDLTest_Log("Test Suite %i - %s\n", suiteCounter,
|
aschiffler@6721
|
388 |
(testSuite->name) ? testSuite->name : SDLTest_InvalidNameFmt);
|
aschiffler@6721
|
389 |
|
aschiffler@6721
|
390 |
// Loop over all test cases
|
aschiffler@6721
|
391 |
testCounter = 0;
|
aschiffler@6721
|
392 |
while(testSuite->testCases[testCounter])
|
aschiffler@6721
|
393 |
{
|
aschiffler@6721
|
394 |
testCase=(SDLTest_TestCaseReference *)testSuite->testCases[testCounter];
|
aschiffler@6721
|
395 |
testCounter++;
|
aschiffler@6721
|
396 |
|
aschiffler@6721
|
397 |
// Take time - test start
|
aschiffler@6721
|
398 |
testStartTicks = SDL_GetTicks();
|
aschiffler@6721
|
399 |
testStartTimestamp = time(0);
|
aschiffler@6721
|
400 |
|
aschiffler@6721
|
401 |
// TODO log test started
|
aschiffler@6721
|
402 |
SDLTest_Log("Test Case %i - %s: %s", testCounter,
|
aschiffler@6721
|
403 |
(testCase->name) ? testCase->name : SDLTest_InvalidNameFmt,
|
aschiffler@6721
|
404 |
(testCase->description) ? testCase->description : SDLTest_InvalidNameFmt);
|
aschiffler@6721
|
405 |
|
aschiffler@6721
|
406 |
// Loop over all iterations
|
aschiffler@6721
|
407 |
iterationCounter = 0;
|
aschiffler@6721
|
408 |
while(iterationCounter < testIterations)
|
aschiffler@6721
|
409 |
{
|
aschiffler@6721
|
410 |
iterationCounter++;
|
aschiffler@6721
|
411 |
|
aschiffler@6721
|
412 |
if(userExecKey != 0) {
|
aschiffler@6721
|
413 |
execKey = userExecKey;
|
aschiffler@6721
|
414 |
} else {
|
aschiffler@6721
|
415 |
execKey = SDLTest_GenerateExecKey(runSeed, testSuite->name, testCase->name, iterationCounter);
|
aschiffler@6721
|
416 |
}
|
aschiffler@6721
|
417 |
|
aschiffler@6721
|
418 |
SDLTest_Log("Test Iteration %i: execKey %d", iterationCounter, execKey);
|
aschiffler@6721
|
419 |
testResult = SDLTest_RunTest(testSuite, testCase, execKey);
|
aschiffler@6721
|
420 |
|
aschiffler@6721
|
421 |
if (testResult == TEST_RESULT_PASSED) {
|
aschiffler@6721
|
422 |
testPassedCount++;
|
aschiffler@6721
|
423 |
totalTestPassedCount++;
|
aschiffler@6721
|
424 |
} else if (testResult == TEST_RESULT_SKIPPED) {
|
aschiffler@6721
|
425 |
testSkippedCount++;
|
aschiffler@6721
|
426 |
totalTestSkippedCount++;
|
aschiffler@6721
|
427 |
} else {
|
aschiffler@6721
|
428 |
testFailedCount++;
|
aschiffler@6721
|
429 |
totalTestFailedCount++;
|
aschiffler@6721
|
430 |
}
|
aschiffler@6721
|
431 |
}
|
aschiffler@6721
|
432 |
|
aschiffler@6721
|
433 |
// Take time - test end
|
aschiffler@6721
|
434 |
testEndTicks = SDL_GetTicks();
|
aschiffler@6721
|
435 |
testEndTimestamp = time(0);
|
aschiffler@6721
|
436 |
|
aschiffler@6721
|
437 |
// TODO log test ended
|
aschiffler@6721
|
438 |
}
|
aschiffler@6721
|
439 |
|
aschiffler@6721
|
440 |
// Take time - suite end
|
aschiffler@6721
|
441 |
suiteEndTicks = SDL_GetTicks();
|
aschiffler@6721
|
442 |
suiteEndTimestamp = time(0);
|
aschiffler@6721
|
443 |
|
aschiffler@6721
|
444 |
// TODO log suite ended
|
aschiffler@6721
|
445 |
}
|
aschiffler@6721
|
446 |
|
aschiffler@6721
|
447 |
// Take time - run end
|
aschiffler@6721
|
448 |
runEndTicks = SDL_GetTicks();
|
aschiffler@6721
|
449 |
runEndTimestamp = time(0);
|
aschiffler@6721
|
450 |
|
aschiffler@6721
|
451 |
// TODO log run ended
|
aschiffler@6721
|
452 |
|
aschiffler@6721
|
453 |
return (totalTestFailedCount ? 1 : 0);
|
aschiffler@6721
|
454 |
}
|