Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

Runner can execute multiple test suites consecutively.

  • Loading branch information
mkauppila committed Jun 4, 2011
1 parent 323031c commit bb107a8914ddb43cb5a2d71c774a729f5bf31876
Showing with 91 additions and 73 deletions.
  1. +0 −17 test/test-automation/SDL_test.c
  2. +12 −2 test/test-automation/SDL_test.h
  3. +79 −54 test/test-automation/runner.c
@@ -56,15 +56,6 @@ _TestCaseQuit()
return _testReturnValue;
}


/*!
* Assert function. Tests if the expected value equals the actual value, then
* the test assert succeeds, otherwise it fails and warns about it.
*
* \param expected Value user expects to have
* \param actual The actual value of tested variable
* \param message Message that will be printed if assert fails
*/
void
AssertEquals(Uint32 expected, Uint32 actual, char* message, ...)
{
@@ -83,14 +74,6 @@ AssertEquals(Uint32 expected, Uint32 actual, char* message, ...)
}
}

/*!
* Assert function. Tests if the given condition is true. True in
* this case means non-zero value. If the condition is true, the
* assert passes, otherwise it fails.
*
* \param condition Condition which will be evaluated
* \param message Message that will be printed if assert fails
*/
void
AssertTrue(int condition, char *message, ...)
{
@@ -56,12 +56,22 @@ void _TestCaseInit();
int _TestCaseQuit();

/*!
* todo add comment
* Assert function. Tests if the expected value equals the actual value, then
* the test assert succeeds, otherwise it fails and warns about it.
*
* \param expected Value user expects to have
* \param actual The actual value of tested variable
* \param message Message that will be printed if assert fails
*/
void AssertEquals(Uint32 expected, Uint32 actual, char *message, ...);

/*!
* todo add comment
* Assert function. Tests if the given condition is true. True in
* this case means non-zero value. If the condition is true, the
* assert passes, otherwise it fails.
*
* \param condition Condition which will be evaluated
* \param message Message that will be printed if assert fails
*/
void AssertTrue(int condition, char *message, ...);

@@ -37,6 +37,15 @@ typedef int (*TestCaseQuit)(void);
//!< Flag for executing tests in-process
static int execute_inproc = 0;


//!< Temporary array to hold test suite names
#if defined(linux) || defined( __linux)
char *testSuites[] = { "tests/libtest.so", "tests/libtestrect.so", NULL};
#else
char *testSuites[] = { "tests/libtest.dylib", "tests/libtestrect.dylib", NULL};
#endif


/*!
* Returns the name for the dynamic library
* which implements the test suite.
@@ -45,16 +54,11 @@ static int execute_inproc = 0;
* returns the names of the dynamic libraries
* implementing the test suites)
*
* \return Name of the dummy test suite
* \return Array of test suite names
*/
char *
char **
ScanForTestSuites() {
#if defined(linux) || defined( __linux)
char *libName = "tests/libtest.so";
#else
char *libName = "tests/libtest.dylib";
#endif
return libName;
return testSuites;
}


@@ -189,6 +193,49 @@ HandleTestReturnValue(int stat_lock)
return returnValue;
}

/*!
* Executes a test case. Loads the test, executes it and
* returns the tests return value to the caller.
*
* \param suite The suite from which the test will be loaded
* \param testReference TestCaseReference of the test under execution
* \return The return value of the test. Zero means success, non-zero failure.
*/
int
ExecuteTest(void *suite, TestCaseReference *testReference) {
char *testname = testReference->name;

TestCaseInit testCaseInit = LoadTestCaseInit(suite);
TestCaseQuit testCaseQuit = LoadTestCaseQuit(suite);
TestCase test = (TestCase) LoadTestCase(suite, testname);

int retVal = 1;
if(execute_inproc) {
testCaseInit();

test(0x0);

retVal = testCaseQuit();
} else {
int childpid = fork();
if(childpid == 0) {
testCaseInit();

test(0x0);

exit(testCaseQuit());
} else {
int stat_lock = -1;
int child = wait(&stat_lock);

retVal = HandleTestReturnValue(stat_lock);
}
}

return retVal;
}


/*!
* Prints usage information
*/
@@ -243,65 +290,43 @@ main(int argc, char *argv[])

const Uint32 startTicks = SDL_GetTicks();

char *testSuiteName = ScanForTestSuites();
void *suite = LoadTestSuite(testSuiteName);
TestCaseReference **tests = QueryTestCases(suite);

TestCaseReference *reference = NULL;
int counter = 0;
char **testSuiteNames = ScanForTestSuites();

for(reference = tests[counter]; reference; reference = tests[++counter]) {
if(reference->enabled == TEST_DISABLED) {
printf("Test %s (in %s) disabled. Omitting...\n", reference->name, testSuiteName);
} else {
char *testname = reference->name;

printf("Running %s (in %s):\n", testname, testSuiteName);

TestCaseInit testCaseInit = LoadTestCaseInit(suite);
TestCaseQuit testCaseQuit = LoadTestCaseQuit(suite);
TestCase test = (TestCase) LoadTestCase(suite, testname);
char *testSuiteName = NULL;
int suiteCounter = 0;
for(testSuiteName = testSuiteNames[suiteCounter]; testSuiteName; testSuiteName = testSuiteNames[++suiteCounter]) {
void *suite = LoadTestSuite(testSuiteName);
TestCaseReference **tests = QueryTestCases(suite);

int retVal = 1;
if(execute_inproc) {
testCaseInit();
TestCaseReference *reference = NULL;
int counter = 0;

test(0x0);

retVal = testCaseQuit();
for(reference = tests[counter]; reference; reference = tests[++counter]) {
if(reference->enabled == TEST_DISABLED) {
printf("Test %s (in %s) disabled. Omitting...\n", reference->name, testSuiteName);
} else {
int childpid = fork();
if(childpid == 0) {
testCaseInit();
printf("Executing %s (in %s):\n", reference->name, testSuiteName);

test(0x0);
int retVal = ExecuteTest(suite, reference);

return testCaseQuit();
if(retVal) {
failureCount++;
if(retVal == 2) {
printf("%s (in %s): FAILED -> No asserts\n", reference->name, testSuiteName);
} else {
printf("%s (in %s): FAILED\n", reference->name, testSuiteName);
}
} else {
int stat_lock = -1;
int child = wait(&stat_lock);

retVal = HandleTestReturnValue(stat_lock);
passCount++;
printf("%s (in %s): ok\n", reference->name, testSuiteName);
}
}

if(retVal) {
failureCount++;
if(retVal == 2) {
printf("%s (in %s): FAILED -> No asserts\n", testname, testSuiteName);
} else {
printf("%s (in %s): FAILED\n", testname, testSuiteName);
}
} else {
passCount++;
printf("%s (in %s): ok\n", testname, testSuiteName);
}
printf("\n");
}

printf("\n");
SDL_UnloadObject(suite);
}

SDL_UnloadObject(suite);

const Uint32 endTicks = SDL_GetTicks();

0 comments on commit bb107a8

Please sign in to comment.