src/test/SDL_test_harness.c
author Andreas Schiffler <aschiffler@ferzkopp.net>
Tue, 04 Dec 2012 19:21:10 -0800
changeset 6721 53b71f45a53a
parent 6718 918ba414168b
child 6727 1b5280cd5885
permissions -rw-r--r--
Added to harness in test lib (work in progress)
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
}