Replaced tn/bn prefixes with an actual dependency system in tests/benches

The previous system of relying on test name prefixes for ordering was
simple, but organizing tests by dependencies and topologically sorting
during compilation is 1. more flexible and 2. simplifies test names,
which get typed a lot.

Note these are not "hard" dependencies, each test suite should work fine
in isolation. These "after" dependencies just hint an ordering when all
tests are ran.

As such, it's worth noting the tests should NOT error of a dependency is
missing. This unfortunately makes it a bit hard to catch typos, but
allows faster compilation of a subset of tests.

---

To make this work the way tests are linked has changed from using custom
linker section (fun linker magic!) to a weakly linked array appended to
every source file (also fun linker magic!).

At least with this method test.py has strict control over the test
ordering, and doesn't depend on 1. the order in which the linker merges
sections, and 2. the order tests are passed to test.py. I didn't realize
the previous system was so fragile.
This commit is contained in:
Christopher Haster
2023-08-04 13:33:00 -05:00
parent 2835b17d14
commit 5be7bae518
15 changed files with 579 additions and 463 deletions
+71 -80
View File
@@ -122,15 +122,6 @@ typedef struct bench_id {
} bench_id_t;
// bench suites are linked into a custom ld section
extern struct bench_suite __start__bench_suites;
extern struct bench_suite __stop__bench_suites;
const struct bench_suite *bench_suites = &__start__bench_suites;
#define BENCH_SUITE_COUNT \
((size_t)(&__stop__bench_suites - &__start__bench_suites))
// bench define management
typedef struct bench_define_map {
const bench_define_t *defines;
@@ -852,23 +843,23 @@ static void summary(void) {
struct perm_count_state perms = {0, 0};
for (size_t t = 0; t < bench_id_count; t++) {
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
bench_define_suite(&bench_suites[i]);
for (size_t i = 0; i < bench_suite_count; i++) {
bench_define_suite(bench_suites[i]);
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (bench_ids[t].name && !(
strcmp(bench_ids[t].name,
bench_suites[i].name) == 0
bench_suites[i]->name) == 0
|| strcmp(bench_ids[t].name,
bench_suites[i].cases[j].name) == 0)) {
bench_suites[i]->cases[j].name) == 0)) {
continue;
}
cases += 1;
case_forperm(
&bench_suites[i],
&bench_suites[i].cases[j],
bench_suites[i],
&bench_suites[i]->cases[j],
bench_ids[t].defines,
bench_ids[t].define_count,
perm_count,
@@ -876,7 +867,7 @@ static void summary(void) {
}
suites += 1;
flags |= bench_suites[i].flags;
flags |= bench_suites[i]->flags;
}
}
@@ -897,8 +888,8 @@ static void summary(void) {
static void list_suites(void) {
// at least size so that names fit
unsigned name_width = 23;
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
size_t len = strlen(bench_suites[i].name);
for (size_t i = 0; i < bench_suite_count; i++) {
size_t len = strlen(bench_suites[i]->name);
if (len > name_width) {
name_width = len;
}
@@ -908,26 +899,26 @@ static void list_suites(void) {
printf("%-*s %7s %7s %11s\n",
name_width, "suite", "flags", "cases", "perms");
for (size_t t = 0; t < bench_id_count; t++) {
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
bench_define_suite(&bench_suites[i]);
for (size_t i = 0; i < bench_suite_count; i++) {
bench_define_suite(bench_suites[i]);
size_t cases = 0;
struct perm_count_state perms = {0, 0};
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (bench_ids[t].name && !(
strcmp(bench_ids[t].name,
bench_suites[i].name) == 0
bench_suites[i]->name) == 0
|| strcmp(bench_ids[t].name,
bench_suites[i].cases[j].name) == 0)) {
bench_suites[i]->cases[j].name) == 0)) {
continue;
}
cases += 1;
case_forperm(
&bench_suites[i],
&bench_suites[i].cases[j],
bench_suites[i],
&bench_suites[i]->cases[j],
bench_ids[t].defines,
bench_ids[t].define_count,
perm_count,
@@ -943,11 +934,11 @@ static void list_suites(void) {
sprintf(perm_buf, "%zu/%zu", perms.filtered, perms.total);
char flag_buf[64];
sprintf(flag_buf, "%s%s",
(bench_suites[i].flags & BENCH_INTERNAL) ? "i" : "",
(!bench_suites[i].flags) ? "-" : "");
(bench_suites[i]->flags & BENCH_INTERNAL) ? "i" : "",
(!bench_suites[i]->flags) ? "-" : "");
printf("%-*s %7s %7zu %11s\n",
name_width,
bench_suites[i].name,
bench_suites[i]->name,
flag_buf,
cases,
perm_buf);
@@ -958,9 +949,9 @@ static void list_suites(void) {
static void list_cases(void) {
// at least size so that names fit
unsigned name_width = 23;
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
size_t len = strlen(bench_suites[i].cases[j].name);
for (size_t i = 0; i < bench_suite_count; i++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
size_t len = strlen(bench_suites[i]->cases[j].name);
if (len > name_width) {
name_width = len;
}
@@ -970,23 +961,23 @@ static void list_cases(void) {
printf("%-*s %7s %11s\n", name_width, "case", "flags", "perms");
for (size_t t = 0; t < bench_id_count; t++) {
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
bench_define_suite(&bench_suites[i]);
for (size_t i = 0; i < bench_suite_count; i++) {
bench_define_suite(bench_suites[i]);
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (bench_ids[t].name && !(
strcmp(bench_ids[t].name,
bench_suites[i].name) == 0
bench_suites[i]->name) == 0
|| strcmp(bench_ids[t].name,
bench_suites[i].cases[j].name) == 0)) {
bench_suites[i]->cases[j].name) == 0)) {
continue;
}
struct perm_count_state perms = {0, 0};
case_forperm(
&bench_suites[i],
&bench_suites[i].cases[j],
bench_suites[i],
&bench_suites[i]->cases[j],
bench_ids[t].defines,
bench_ids[t].define_count,
perm_count,
@@ -996,13 +987,13 @@ static void list_cases(void) {
sprintf(perm_buf, "%zu/%zu", perms.filtered, perms.total);
char flag_buf[64];
sprintf(flag_buf, "%s%s",
(bench_suites[i].cases[j].flags & BENCH_INTERNAL)
(bench_suites[i]->cases[j].flags & BENCH_INTERNAL)
? "i" : "",
(!bench_suites[i].cases[j].flags)
(!bench_suites[i]->cases[j].flags)
? "-" : "");
printf("%-*s %7s %11s\n",
name_width,
bench_suites[i].cases[j].name,
bench_suites[i]->cases[j].name,
flag_buf,
perm_buf);
}
@@ -1013,8 +1004,8 @@ static void list_cases(void) {
static void list_suite_paths(void) {
// at least size so that names fit
unsigned name_width = 23;
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
size_t len = strlen(bench_suites[i].name);
for (size_t i = 0; i < bench_suite_count; i++) {
size_t len = strlen(bench_suites[i]->name);
if (len > name_width) {
name_width = len;
}
@@ -1023,16 +1014,16 @@ static void list_suite_paths(void) {
printf("%-*s %s\n", name_width, "suite", "path");
for (size_t t = 0; t < bench_id_count; t++) {
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
for (size_t i = 0; i < bench_suite_count; i++) {
size_t cases = 0;
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (bench_ids[t].name && !(
strcmp(bench_ids[t].name,
bench_suites[i].name) == 0
bench_suites[i]->name) == 0
|| strcmp(bench_ids[t].name,
bench_suites[i].cases[j].name) == 0)) {
bench_suites[i]->cases[j].name) == 0)) {
continue;
cases += 1;
@@ -1046,8 +1037,8 @@ static void list_suite_paths(void) {
printf("%-*s %s\n",
name_width,
bench_suites[i].name,
bench_suites[i].path);
bench_suites[i]->name,
bench_suites[i]->path);
}
}
}
@@ -1055,9 +1046,9 @@ static void list_suite_paths(void) {
static void list_case_paths(void) {
// at least size so that names fit
unsigned name_width = 23;
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
size_t len = strlen(bench_suites[i].cases[j].name);
for (size_t i = 0; i < bench_suite_count; i++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
size_t len = strlen(bench_suites[i]->cases[j].name);
if (len > name_width) {
name_width = len;
}
@@ -1067,21 +1058,21 @@ static void list_case_paths(void) {
printf("%-*s %s\n", name_width, "case", "path");
for (size_t t = 0; t < bench_id_count; t++) {
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
for (size_t i = 0; i < bench_suite_count; i++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (bench_ids[t].name && !(
strcmp(bench_ids[t].name,
bench_suites[i].name) == 0
bench_suites[i]->name) == 0
|| strcmp(bench_ids[t].name,
bench_suites[i].cases[j].name) == 0)) {
bench_suites[i]->cases[j].name) == 0)) {
continue;
}
printf("%-*s %s\n",
name_width,
bench_suites[i].cases[j].name,
bench_suites[i].cases[j].path);
bench_suites[i]->cases[j].name,
bench_suites[i]->cases[j].path);
}
}
}
@@ -1179,22 +1170,22 @@ static void list_defines(void) {
// add defines
for (size_t t = 0; t < bench_id_count; t++) {
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
bench_define_suite(&bench_suites[i]);
for (size_t i = 0; i < bench_suite_count; i++) {
bench_define_suite(bench_suites[i]);
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (bench_ids[t].name && !(
strcmp(bench_ids[t].name,
bench_suites[i].name) == 0
bench_suites[i]->name) == 0
|| strcmp(bench_ids[t].name,
bench_suites[i].cases[j].name) == 0)) {
bench_suites[i]->cases[j].name) == 0)) {
continue;
}
case_forperm(
&bench_suites[i],
&bench_suites[i].cases[j],
bench_suites[i],
&bench_suites[i]->cases[j],
bench_ids[t].defines,
bench_ids[t].define_count,
perm_list_defines,
@@ -1225,22 +1216,22 @@ static void list_permutation_defines(void) {
// add permutation defines
for (size_t t = 0; t < bench_id_count; t++) {
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
bench_define_suite(&bench_suites[i]);
for (size_t i = 0; i < bench_suite_count; i++) {
bench_define_suite(bench_suites[i]);
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (bench_ids[t].name && !(
strcmp(bench_ids[t].name,
bench_suites[i].name) == 0
bench_suites[i]->name) == 0
|| strcmp(bench_ids[t].name,
bench_suites[i].cases[j].name) == 0)) {
bench_suites[i]->cases[j].name) == 0)) {
continue;
}
case_forperm(
&bench_suites[i],
&bench_suites[i].cases[j],
bench_suites[i],
&bench_suites[i]->cases[j],
bench_ids[t].defines,
bench_ids[t].define_count,
perm_list_permutation_defines,
@@ -1445,22 +1436,22 @@ static void run(void) {
signal(SIGPIPE, SIG_IGN);
for (size_t t = 0; t < bench_id_count; t++) {
for (size_t i = 0; i < BENCH_SUITE_COUNT; i++) {
bench_define_suite(&bench_suites[i]);
for (size_t i = 0; i < bench_suite_count; i++) {
bench_define_suite(bench_suites[i]);
for (size_t j = 0; j < bench_suites[i].case_count; j++) {
for (size_t j = 0; j < bench_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (bench_ids[t].name && !(
strcmp(bench_ids[t].name,
bench_suites[i].name) == 0
bench_suites[i]->name) == 0
|| strcmp(bench_ids[t].name,
bench_suites[i].cases[j].name) == 0)) {
bench_suites[i]->cases[j].name) == 0)) {
continue;
}
case_forperm(
&bench_suites[i],
&bench_suites[i].cases[j],
bench_suites[i],
&bench_suites[i]->cases[j],
bench_ids[t].defines,
bench_ids[t].define_count,
perm_run,
+3
View File
@@ -74,6 +74,9 @@ struct bench_suite {
size_t case_count;
};
extern const struct bench_suite *const bench_suites[];
extern const size_t bench_suite_count;
// deterministic prng for pseudo-randomness in benches
uint32_t bench_prng(uint32_t *state);
+73 -82
View File
@@ -135,15 +135,6 @@ typedef struct test_id {
} test_id_t;
// test suites are linked into a custom ld section
extern struct test_suite __start__test_suites;
extern struct test_suite __stop__test_suites;
const struct test_suite *test_suites = &__start__test_suites;
#define TEST_SUITE_COUNT \
((size_t)(&__stop__test_suites - &__start__test_suites))
// test define management
typedef struct test_define_map {
const test_define_t *defines;
@@ -881,23 +872,23 @@ static void summary(void) {
struct perm_count_state perms = {0, 0};
for (size_t t = 0; t < test_id_count; t++) {
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
test_define_suite(&test_suites[i]);
for (size_t i = 0; i < test_suite_count; i++) {
test_define_suite(test_suites[i]);
for (size_t j = 0; j < test_suites[i].case_count; j++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (test_ids[t].name && !(
strcmp(test_ids[t].name,
test_suites[i].name) == 0
test_suites[i]->name) == 0
|| strcmp(test_ids[t].name,
test_suites[i].cases[j].name) == 0)) {
test_suites[i]->cases[j].name) == 0)) {
continue;
}
cases += 1;
case_forperm(
&test_suites[i],
&test_suites[i].cases[j],
test_suites[i],
&test_suites[i]->cases[j],
test_ids[t].defines,
test_ids[t].define_count,
test_ids[t].cycles,
@@ -907,7 +898,7 @@ static void summary(void) {
}
suites += 1;
flags |= test_suites[i].flags;
flags |= test_suites[i]->flags;
}
}
@@ -929,8 +920,8 @@ static void summary(void) {
static void list_suites(void) {
// at least size so that names fit
unsigned name_width = 23;
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
size_t len = strlen(test_suites[i].name);
for (size_t i = 0; i < test_suite_count; i++) {
size_t len = strlen(test_suites[i]->name);
if (len > name_width) {
name_width = len;
}
@@ -940,26 +931,26 @@ static void list_suites(void) {
printf("%-*s %7s %7s %11s\n",
name_width, "suite", "flags", "cases", "perms");
for (size_t t = 0; t < test_id_count; t++) {
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
test_define_suite(&test_suites[i]);
for (size_t i = 0; i < test_suite_count; i++) {
test_define_suite(test_suites[i]);
size_t cases = 0;
struct perm_count_state perms = {0, 0};
for (size_t j = 0; j < test_suites[i].case_count; j++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (test_ids[t].name && !(
strcmp(test_ids[t].name,
test_suites[i].name) == 0
test_suites[i]->name) == 0
|| strcmp(test_ids[t].name,
test_suites[i].cases[j].name) == 0)) {
test_suites[i]->cases[j].name) == 0)) {
continue;
}
cases += 1;
case_forperm(
&test_suites[i],
&test_suites[i].cases[j],
test_suites[i],
&test_suites[i]->cases[j],
test_ids[t].defines,
test_ids[t].define_count,
test_ids[t].cycles,
@@ -977,12 +968,12 @@ static void list_suites(void) {
sprintf(perm_buf, "%zu/%zu", perms.filtered, perms.total);
char flag_buf[64];
sprintf(flag_buf, "%s%s%s",
(test_suites[i].flags & TEST_REENTRANT) ? "r" : "",
(test_suites[i].flags & TEST_INTERNAL) ? "i" : "",
(!test_suites[i].flags) ? "-" : "");
(test_suites[i]->flags & TEST_REENTRANT) ? "r" : "",
(test_suites[i]->flags & TEST_INTERNAL) ? "i" : "",
(!test_suites[i]->flags) ? "-" : "");
printf("%-*s %7s %7zu %11s\n",
name_width,
test_suites[i].name,
test_suites[i]->name,
flag_buf,
cases,
perm_buf);
@@ -993,9 +984,9 @@ static void list_suites(void) {
static void list_cases(void) {
// at least size so that names fit
unsigned name_width = 23;
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
for (size_t j = 0; j < test_suites[i].case_count; j++) {
size_t len = strlen(test_suites[i].cases[j].name);
for (size_t i = 0; i < test_suite_count; i++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
size_t len = strlen(test_suites[i]->cases[j].name);
if (len > name_width) {
name_width = len;
}
@@ -1005,23 +996,23 @@ static void list_cases(void) {
printf("%-*s %7s %11s\n", name_width, "case", "flags", "perms");
for (size_t t = 0; t < test_id_count; t++) {
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
test_define_suite(&test_suites[i]);
for (size_t i = 0; i < test_suite_count; i++) {
test_define_suite(test_suites[i]);
for (size_t j = 0; j < test_suites[i].case_count; j++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (test_ids[t].name && !(
strcmp(test_ids[t].name,
test_suites[i].name) == 0
test_suites[i]->name) == 0
|| strcmp(test_ids[t].name,
test_suites[i].cases[j].name) == 0)) {
test_suites[i]->cases[j].name) == 0)) {
continue;
}
struct perm_count_state perms = {0, 0};
case_forperm(
&test_suites[i],
&test_suites[i].cases[j],
test_suites[i],
&test_suites[i]->cases[j],
test_ids[t].defines,
test_ids[t].define_count,
test_ids[t].cycles,
@@ -1033,15 +1024,15 @@ static void list_cases(void) {
sprintf(perm_buf, "%zu/%zu", perms.filtered, perms.total);
char flag_buf[64];
sprintf(flag_buf, "%s%s%s",
(test_suites[i].cases[j].flags & TEST_REENTRANT)
(test_suites[i]->cases[j].flags & TEST_REENTRANT)
? "r" : "",
(test_suites[i].cases[j].flags & TEST_INTERNAL)
(test_suites[i]->cases[j].flags & TEST_INTERNAL)
? "i" : "",
(!test_suites[i].cases[j].flags)
(!test_suites[i]->cases[j].flags)
? "-" : "");
printf("%-*s %7s %11s\n",
name_width,
test_suites[i].cases[j].name,
test_suites[i]->cases[j].name,
flag_buf,
perm_buf);
}
@@ -1052,8 +1043,8 @@ static void list_cases(void) {
static void list_suite_paths(void) {
// at least size so that names fit
unsigned name_width = 23;
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
size_t len = strlen(test_suites[i].name);
for (size_t i = 0; i < test_suite_count; i++) {
size_t len = strlen(test_suites[i]->name);
if (len > name_width) {
name_width = len;
}
@@ -1062,16 +1053,16 @@ static void list_suite_paths(void) {
printf("%-*s %s\n", name_width, "suite", "path");
for (size_t t = 0; t < test_id_count; t++) {
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
for (size_t i = 0; i < test_suite_count; i++) {
size_t cases = 0;
for (size_t j = 0; j < test_suites[i].case_count; j++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (test_ids[t].name && !(
strcmp(test_ids[t].name,
test_suites[i].name) == 0
test_suites[i]->name) == 0
|| strcmp(test_ids[t].name,
test_suites[i].cases[j].name) == 0)) {
test_suites[i]->cases[j].name) == 0)) {
continue;
}
@@ -1085,8 +1076,8 @@ static void list_suite_paths(void) {
printf("%-*s %s\n",
name_width,
test_suites[i].name,
test_suites[i].path);
test_suites[i]->name,
test_suites[i]->path);
}
}
}
@@ -1094,9 +1085,9 @@ static void list_suite_paths(void) {
static void list_case_paths(void) {
// at least size so that names fit
unsigned name_width = 23;
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
for (size_t j = 0; j < test_suites[i].case_count; j++) {
size_t len = strlen(test_suites[i].cases[j].name);
for (size_t i = 0; i < test_suite_count; i++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
size_t len = strlen(test_suites[i]->cases[j].name);
if (len > name_width) {
name_width = len;
}
@@ -1106,21 +1097,21 @@ static void list_case_paths(void) {
printf("%-*s %s\n", name_width, "case", "path");
for (size_t t = 0; t < test_id_count; t++) {
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
for (size_t j = 0; j < test_suites[i].case_count; j++) {
for (size_t i = 0; i < test_suite_count; i++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (test_ids[t].name && !(
strcmp(test_ids[t].name,
test_suites[i].name) == 0
test_suites[i]->name) == 0
|| strcmp(test_ids[t].name,
test_suites[i].cases[j].name) == 0)) {
test_suites[i]->cases[j].name) == 0)) {
continue;
}
printf("%-*s %s\n",
name_width,
test_suites[i].cases[j].name,
test_suites[i].cases[j].path);
test_suites[i]->cases[j].name,
test_suites[i]->cases[j].path);
}
}
}
@@ -1222,22 +1213,22 @@ static void list_defines(void) {
// add defines
for (size_t t = 0; t < test_id_count; t++) {
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
test_define_suite(&test_suites[i]);
for (size_t i = 0; i < test_suite_count; i++) {
test_define_suite(test_suites[i]);
for (size_t j = 0; j < test_suites[i].case_count; j++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (test_ids[t].name && !(
strcmp(test_ids[t].name,
test_suites[i].name) == 0
test_suites[i]->name) == 0
|| strcmp(test_ids[t].name,
test_suites[i].cases[j].name) == 0)) {
test_suites[i]->cases[j].name) == 0)) {
continue;
}
case_forperm(
&test_suites[i],
&test_suites[i].cases[j],
test_suites[i],
&test_suites[i]->cases[j],
test_ids[t].defines,
test_ids[t].define_count,
test_ids[t].cycles,
@@ -1270,22 +1261,22 @@ static void list_permutation_defines(void) {
// add permutation defines
for (size_t t = 0; t < test_id_count; t++) {
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
test_define_suite(&test_suites[i]);
for (size_t i = 0; i < test_suite_count; i++) {
test_define_suite(test_suites[i]);
for (size_t j = 0; j < test_suites[i].case_count; j++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (test_ids[t].name && !(
strcmp(test_ids[t].name,
test_suites[i].name) == 0
test_suites[i]->name) == 0
|| strcmp(test_ids[t].name,
test_suites[i].cases[j].name) == 0)) {
test_suites[i]->cases[j].name) == 0)) {
continue;
}
case_forperm(
&test_suites[i],
&test_suites[i].cases[j],
test_suites[i],
&test_suites[i]->cases[j],
test_ids[t].defines,
test_ids[t].define_count,
test_ids[t].cycles,
@@ -1977,22 +1968,22 @@ static void run(void) {
signal(SIGPIPE, SIG_IGN);
for (size_t t = 0; t < test_id_count; t++) {
for (size_t i = 0; i < TEST_SUITE_COUNT; i++) {
test_define_suite(&test_suites[i]);
for (size_t i = 0; i < test_suite_count; i++) {
test_define_suite(test_suites[i]);
for (size_t j = 0; j < test_suites[i].case_count; j++) {
for (size_t j = 0; j < test_suites[i]->case_count; j++) {
// does neither suite nor case name match?
if (test_ids[t].name && !(
strcmp(test_ids[t].name,
test_suites[i].name) == 0
test_suites[i]->name) == 0
|| strcmp(test_ids[t].name,
test_suites[i].cases[j].name) == 0)) {
test_suites[i]->cases[j].name) == 0)) {
continue;
}
case_forperm(
&test_suites[i],
&test_suites[i].cases[j],
test_suites[i],
&test_suites[i]->cases[j],
test_ids[t].defines,
test_ids[t].define_count,
test_ids[t].cycles,
+3
View File
@@ -68,6 +68,9 @@ struct test_suite {
size_t case_count;
};
extern const struct test_suite *const test_suites[];
extern const size_t test_suite_count;
// this is defined as true when powerloss-testing
extern bool test_pl;