runtest.c
2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include "runtest.h"
#define TEST_OK_CHAR '.'
#define TEST_FAILED_CHAR 'F'
#define TEST_ERROR_CHAR 'E'
const char results[3] = {
TEST_OK_CHAR,
TEST_FAILED_CHAR,
TEST_ERROR_CHAR
};
void *
load_symbol(void * dlhandle, const char * const symbol)
{
void * sym = dlsym(dlhandle, symbol);
char * error;
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
return sym;
}
void
runtests(
const char * const filename,
size_t * _count,
size_t * failures,
size_t * errors)
{
size_t * count;
testfunc * tests;
const char * const testname;
//char * const * funcnames;
size_t index;
void * dlhandle;
dlhandle = dlopen("./cclass.test", RTLD_LAZY);
if (!dlhandle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
* (void **) (&count) = load_symbol(dlhandle, "count");
* (void **) (&tests) = load_symbol(dlhandle, "tests");
* (void **) (&testname) = load_symbol(dlhandle, "testname");
// * (void **) (&funcnames) = load_symbol(dlhandle, "funcnames");
*_count += *count;
printf("running tests for %s\n", testname);
for (index=0; index<*count; index++) {
int result = tests[index]();
switch (result) {
case TEST_FAILED: (*failures)++; break;
case TEST_ERROR: (*errors)++; break;
}
putchar(results[result]);
if (79 == index%80) {
putchar('\n');
}
fflush(stdout);
}
puts("\n");
dlclose(dlhandle);
}
int
main(int argc, char * argv[])
{
size_t count = 0;
size_t errors = 0;
size_t failures = 0;
size_t assertions = 0;
DIR * dir;
struct dirent * dirent;
dir = opendir(".");
dirent = readdir(dir);
while (dirent) {
if (0 == strcmp(".test", dirent->d_name + strlen(dirent->d_name) - 5)) {
runtests(dirent->d_name, &count, &failures, &errors);
}
dirent = readdir(dir);
}
closedir(dir);
printf("running %lu tests: %lu - OK, %lu - FAILED, %lu - ERRORS\n",
count,
count - errors - failures,
failures,
errors);
return 0;
}
// vim: set et ts=4 sw=4: