[PATCH 1/3] Add support for table-driven testing.
The new TEST_P macro takes a function name and a "data" argument to point to an arbitrary array of known size of test data. This allows multiple tests to be run with different datasets. The array is stored as a void * but advanced by a known size on each iteration. The data for each invocation of the test is provided as a "data" argument, it is the responsibility of the test to cast it to something sensible. Also fixed single-test running to only run the tests specified --- tests/weston-test-runner.c | 123 - tests/weston-test-runner.h | 52 +-- 2 files changed, 113 insertions(+), 62 deletions(-) diff --git a/tests/weston-test-runner.c b/tests/weston-test-runner.c index 27ea9e4..646e1c3 100644 --- a/tests/weston-test-runner.c +++ b/tests/weston-test-runner.c @@ -46,18 +46,81 @@ find_test(const char *name) } static void -run_test(const struct weston_test *t) +run_test(const struct weston_test *t, void *data) { - t->run(); + t->run(data); exit(EXIT_SUCCESS); } +static int +exec_and_report_test(const struct weston_test *t, void *test_data, int iteration) +{ + int success = 0; + int hardfail = 0; + siginfo_t info; + + pid_t pid = fork(); + assert(pid >= 0); + + if (pid == 0) + run_test(t, test_data); /* never returns */ + + if (waitid(P_ALL, 0, &info, WEXITED)) { + fprintf(stderr, "waitid failed: %m\n"); + abort(); + } + + if (test_data) + fprintf(stderr, "test \"%s/%i\":\t", t->name, iteration); + else + fprintf(stderr, "test \"%s\":\t", t->name); + + switch (info.si_code) { + case CLD_EXITED: + fprintf(stderr, "exit status %d", info.si_status); + if (info.si_status == EXIT_SUCCESS) + success = 1; + break; + case CLD_KILLED: + case CLD_DUMPED: + fprintf(stderr, "signal %d", info.si_status); + if (info.si_status != SIGABRT) + hardfail = 1; + break; + } + + if (t->must_fail) + success = !success; + + if (success && !hardfail) { + fprintf(stderr, ", pass.\n"); + return 1; + } else { + fprintf(stderr, ", fail.\n"); + return 0; + } +} + +/* Returns number of tests and number of pass / fail in param args */ +static int +iterate_test(const struct weston_test *t, int *passed) +{ + int i; + void *current_test_data = (void *) t->table_data; + for (i = 0; i < t->n_elements; ++i, current_test_data += t->element_size) + { + if (exec_and_report_test(t, current_test_data, i)) + ++(*passed); + } + + return t->n_elements; +} + int main(int argc, char *argv[]) { const struct weston_test *t; - pid_t pid; - int total, pass; - siginfo_t info; + int total = 0; + int pass = 0; if (argc == 2) { t = find_test(argv[1]); @@ -66,51 +129,19 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - run_test(t); + int number_passed_in_test = 0; + total += iterate_test(t, &number_passed_in_test); + pass += number_passed_in_test; } - - pass = 0; - for (t = &__start_test_section; t < &__stop_test_section; t++) { - int success = 0; - int hardfail = 0; - - pid = fork(); - assert(pid >= 0); - - if (pid == 0) - run_test(t); /* never returns */ - - if (waitid(P_ALL, 0, &info, WEXITED)) { - fprintf(stderr, "waitid failed: %m\n"); - abort(); + else + { + for (t = &__start_test_section; t < &__stop_test_section; t++) { + int number_passed_in_test = 0; + total += iterate_test(t, &number_passed_in_test); + pass += number_passed_in_test; } - - fprintf(stderr, "test \"%s\":\t", t->name); - switch (info.si_code) { - case CLD_EXITED: - fprintf(stderr, "exit status %d", info.si_status); - if (info.si_status == EXIT_SUCCESS) - success = 1; - break; - case CLD_KILLED: - case CLD_DUMPED: - fprintf(stderr, "signal %d", info.si_status); - if (info.si_status != SIGABRT) - hardfail = 1; - break; - } - - if (t->must_fail) - success = !success; - - if (success && !hardfai
RE: [PATCH 1/3] Add support for table-driven testing.
> -Original Message- > From: Sam Spilsbury [mailto:smspil...@gmail.com] > Sent: Tuesday, September 10, 2013 5:33 PM > To: Eoff, Ullysses A > Cc: wayland-devel@lists.freedesktop.org > Subject: Re: [PATCH 1/3] Add support for table-driven testing. > > Hi, > > > On Wed, Sep 11, 2013 at 1:37 AM, Eoff, Ullysses A > wrote: > > > > > -Original Message- > > > From: > > > wayland-devel-bounces+ullysses.a.eoff=intel@lists.freedesktop.org > > > [mailto:wayland-devel- > > > bounces+ullysses.a.eoff=intel@lists.freedesktop.org] On Behalf Of Sam > > > Spilsbury > > > Sent: Tuesday, September 10, 2013 9:15 AM > > > To: wayland-devel@lists.freedesktop.org > > > Cc: Sam Spilsbury > > > Subject: [PATCH 1/3] Add support for table-driven testing. > > > > > > The new TEST_P macro takes a function name and a "data" argument to > > > point to an arbitrary array of known size of test data. This allows > > > multiple tests to be run with different datasets. The array is stored > > > as a void * but advanced by a known size on each iteration. > > > > > > The data for each invocation of the test is provided as a "data" argument, > > > it is the responsibility of the test to cast it to something sensible. > > > --- > > > tests/weston-test-runner.c | 117 > > > - > > > tests/weston-test-runner.h | 52 +--- > > > 2 files changed, 108 insertions(+), 61 deletions(-) > > > > > > diff --git a/tests/weston-test-runner.c b/tests/weston-test-runner.c > > > index 27ea9e4..1eb93ea 100644 > > > --- a/tests/weston-test-runner.c > > > +++ b/tests/weston-test-runner.c > > > @@ -46,18 +46,81 @@ find_test(const char *name) > > > } > > > > > > static void > > > -run_test(const struct weston_test *t) > > > +run_test(const struct weston_test *t, void *data) > > > { > > > - t->run(); > > > + t->run(data); > > > exit(EXIT_SUCCESS); > > > } > > > > > > +static int > > > +exec_and_report_test(const struct weston_test *t, void *test_data, int > > > iteration) > > > +{ > > > + int success = 0; > > > + int hardfail = 0; > > > + siginfo_t info; > > > + > > > + pid_t pid = fork(); > > > + assert(pid >= 0); > > > + > > > + if (pid == 0) > > > + run_test(t, test_data); /* never returns */ > > > + > > > + if (waitid(P_ALL, 0, &info, WEXITED)) { > > > + fprintf(stderr, "waitid failed: %m\n"); > > > + abort(); > > > + } > > > + > > > + if (test_data) > > > + fprintf(stderr, "test \"%s/%i\":\t", t->name, iteration); > > > + else > > > + fprintf(stderr, "test \"%s\":\t", t->name); > > > + > > > + switch (info.si_code) { > > > + case CLD_EXITED: > > > + fprintf(stderr, "exit status %d", info.si_status); > > > + if (info.si_status == EXIT_SUCCESS) > > > + success = 1; > > > + break; > > > + case CLD_KILLED: > > > + case CLD_DUMPED: > > > + fprintf(stderr, "signal %d", info.si_status); > > > + if (info.si_status != SIGABRT) > > > + hardfail = 1; > > > + break; > > > + } > > > + > > > + if (t->must_fail) > > > + success = !success; > > > + > > > + if (success && !hardfail) { > > > + fprintf(stderr, ", pass.\n"); > > > + return 1; > > > + } else { > > > + fprintf(stderr, ", fail.\n"); > > > + return 0; > > > + } > > > +} > > > + > > > +/* Returns number of tests and number of pass / fail in param args */ > > > +static int > > > +iterate_test(const struct weston_test *t, int *passed) > > > +{ > > > + int i; > > > + void *current_test_data = (void *) t->table_data; > > > + for (i = 0; i < t->n_elements; ++i, current_test_data += > > > t->element_size) > > > + { > > > +
[PATCH 1/3] Add support for table-driven testing.
The new TEST_P macro takes a function name and a "data" argument to point to an arbitrary array of known size of test data. This allows multiple tests to be run with different datasets. The array is stored as a void * but advanced by a known size on each iteration. The data for each invocation of the test is provided as a "data" argument, it is the responsibility of the test to cast it to something sensible. --- tests/weston-test-runner.c | 117 - tests/weston-test-runner.h | 52 +--- 2 files changed, 108 insertions(+), 61 deletions(-) diff --git a/tests/weston-test-runner.c b/tests/weston-test-runner.c index 27ea9e4..1eb93ea 100644 --- a/tests/weston-test-runner.c +++ b/tests/weston-test-runner.c @@ -46,18 +46,81 @@ find_test(const char *name) } static void -run_test(const struct weston_test *t) +run_test(const struct weston_test *t, void *data) { - t->run(); + t->run(data); exit(EXIT_SUCCESS); } +static int +exec_and_report_test(const struct weston_test *t, void *test_data, int iteration) +{ + int success = 0; + int hardfail = 0; + siginfo_t info; + + pid_t pid = fork(); + assert(pid >= 0); + + if (pid == 0) + run_test(t, test_data); /* never returns */ + + if (waitid(P_ALL, 0, &info, WEXITED)) { + fprintf(stderr, "waitid failed: %m\n"); + abort(); + } + + if (test_data) + fprintf(stderr, "test \"%s/%i\":\t", t->name, iteration); + else + fprintf(stderr, "test \"%s\":\t", t->name); + + switch (info.si_code) { + case CLD_EXITED: + fprintf(stderr, "exit status %d", info.si_status); + if (info.si_status == EXIT_SUCCESS) + success = 1; + break; + case CLD_KILLED: + case CLD_DUMPED: + fprintf(stderr, "signal %d", info.si_status); + if (info.si_status != SIGABRT) + hardfail = 1; + break; + } + + if (t->must_fail) + success = !success; + + if (success && !hardfail) { + fprintf(stderr, ", pass.\n"); + return 1; + } else { + fprintf(stderr, ", fail.\n"); + return 0; + } +} + +/* Returns number of tests and number of pass / fail in param args */ +static int +iterate_test(const struct weston_test *t, int *passed) +{ + int i; + void *current_test_data = (void *) t->table_data; + for (i = 0; i < t->n_elements; ++i, current_test_data += t->element_size) + { + if (exec_and_report_test(t, current_test_data, i)) + ++(*passed); + } + + return t->n_elements; +} + int main(int argc, char *argv[]) { const struct weston_test *t; - pid_t pid; - int total, pass; - siginfo_t info; + int total = 0; + int pass = 0; if (argc == 2) { t = find_test(argv[1]); @@ -66,51 +129,15 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - run_test(t); + run_test(t, (void *) t->table_data); } - pass = 0; for (t = &__start_test_section; t < &__stop_test_section; t++) { - int success = 0; - int hardfail = 0; - - pid = fork(); - assert(pid >= 0); - - if (pid == 0) - run_test(t); /* never returns */ - - if (waitid(P_ALL, 0, &info, WEXITED)) { - fprintf(stderr, "waitid failed: %m\n"); - abort(); - } - - fprintf(stderr, "test \"%s\":\t", t->name); - switch (info.si_code) { - case CLD_EXITED: - fprintf(stderr, "exit status %d", info.si_status); - if (info.si_status == EXIT_SUCCESS) - success = 1; - break; - case CLD_KILLED: - case CLD_DUMPED: - fprintf(stderr, "signal %d", info.si_status); - if (info.si_status != SIGABRT) - hardfail = 1; - break; - } - - if (t->must_fail) - success = !success; - - if (success && !hardfail) { - pass++; - fprintf(stderr, ", pass.\n"); - } else - fprintf(stderr, ", fail.\n"); + int number_passed_in_test = 0; + total += iterate_test(t, &number_passed_in_test); + pass += number_passed_in_test; } - total = &__stop_test_section - &__start_test_section; fprintf(stderr, "%d tests, %d pass, %d fail\n",
Re: [PATCH 1/3] Add support for table-driven testing.
Hi, On Wed, Sep 11, 2013 at 1:37 AM, Eoff, Ullysses A wrote: > > > -Original Message- > > From: wayland-devel-bounces+ullysses.a.eoff=intel@lists.freedesktop.org > > [mailto:wayland-devel- > > bounces+ullysses.a.eoff=intel@lists.freedesktop.org] On Behalf Of Sam > > Spilsbury > > Sent: Tuesday, September 10, 2013 9:15 AM > > To: wayland-devel@lists.freedesktop.org > > Cc: Sam Spilsbury > > Subject: [PATCH 1/3] Add support for table-driven testing. > > > > The new TEST_P macro takes a function name and a "data" argument to > > point to an arbitrary array of known size of test data. This allows > > multiple tests to be run with different datasets. The array is stored > > as a void * but advanced by a known size on each iteration. > > > > The data for each invocation of the test is provided as a "data" argument, > > it is the responsibility of the test to cast it to something sensible. > > --- > > tests/weston-test-runner.c | 117 > > - > > tests/weston-test-runner.h | 52 +--- > > 2 files changed, 108 insertions(+), 61 deletions(-) > > > > diff --git a/tests/weston-test-runner.c b/tests/weston-test-runner.c > > index 27ea9e4..1eb93ea 100644 > > --- a/tests/weston-test-runner.c > > +++ b/tests/weston-test-runner.c > > @@ -46,18 +46,81 @@ find_test(const char *name) > > } > > > > static void > > -run_test(const struct weston_test *t) > > +run_test(const struct weston_test *t, void *data) > > { > > - t->run(); > > + t->run(data); > > exit(EXIT_SUCCESS); > > } > > > > +static int > > +exec_and_report_test(const struct weston_test *t, void *test_data, int > > iteration) > > +{ > > + int success = 0; > > + int hardfail = 0; > > + siginfo_t info; > > + > > + pid_t pid = fork(); > > + assert(pid >= 0); > > + > > + if (pid == 0) > > + run_test(t, test_data); /* never returns */ > > + > > + if (waitid(P_ALL, 0, &info, WEXITED)) { > > + fprintf(stderr, "waitid failed: %m\n"); > > + abort(); > > + } > > + > > + if (test_data) > > + fprintf(stderr, "test \"%s/%i\":\t", t->name, iteration); > > + else > > + fprintf(stderr, "test \"%s\":\t", t->name); > > + > > + switch (info.si_code) { > > + case CLD_EXITED: > > + fprintf(stderr, "exit status %d", info.si_status); > > + if (info.si_status == EXIT_SUCCESS) > > + success = 1; > > + break; > > + case CLD_KILLED: > > + case CLD_DUMPED: > > + fprintf(stderr, "signal %d", info.si_status); > > + if (info.si_status != SIGABRT) > > + hardfail = 1; > > + break; > > + } > > + > > + if (t->must_fail) > > + success = !success; > > + > > + if (success && !hardfail) { > > + fprintf(stderr, ", pass.\n"); > > + return 1; > > + } else { > > + fprintf(stderr, ", fail.\n"); > > + return 0; > > + } > > +} > > + > > +/* Returns number of tests and number of pass / fail in param args */ > > +static int > > +iterate_test(const struct weston_test *t, int *passed) > > +{ > > + int i; > > + void *current_test_data = (void *) t->table_data; > > + for (i = 0; i < t->n_elements; ++i, current_test_data += > > t->element_size) > > + { > > + if (exec_and_report_test(t, current_test_data, i)) > > + ++(*passed); > > + } > > + > > + return t->n_elements; > > +} > > + > > int main(int argc, char *argv[]) > > { > > const struct weston_test *t; > > - pid_t pid; > > - int total, pass; > > - siginfo_t info; > > + int total = 0; > > + int pass = 0; > > > > if (argc == 2) { > > t = find_test(argv[1]); > > @@ -66,51 +129,15 @@ int main(int argc, char *argv[]) > > exit(EXIT_FAILURE); > > } > > > > - run_test(t); > > + run_test(t, (void *) t->table
RE: [PATCH 1/3] Add support for table-driven testing.
> -Original Message- > From: wayland-devel-bounces+ullysses.a.eoff=intel@lists.freedesktop.org > [mailto:wayland-devel- > bounces+ullysses.a.eoff=intel@lists.freedesktop.org] On Behalf Of Sam > Spilsbury > Sent: Tuesday, September 10, 2013 9:15 AM > To: wayland-devel@lists.freedesktop.org > Cc: Sam Spilsbury > Subject: [PATCH 1/3] Add support for table-driven testing. > > The new TEST_P macro takes a function name and a "data" argument to > point to an arbitrary array of known size of test data. This allows > multiple tests to be run with different datasets. The array is stored > as a void * but advanced by a known size on each iteration. > > The data for each invocation of the test is provided as a "data" argument, > it is the responsibility of the test to cast it to something sensible. > --- > tests/weston-test-runner.c | 117 > - > tests/weston-test-runner.h | 52 +--- > 2 files changed, 108 insertions(+), 61 deletions(-) > > diff --git a/tests/weston-test-runner.c b/tests/weston-test-runner.c > index 27ea9e4..1eb93ea 100644 > --- a/tests/weston-test-runner.c > +++ b/tests/weston-test-runner.c > @@ -46,18 +46,81 @@ find_test(const char *name) > } > > static void > -run_test(const struct weston_test *t) > +run_test(const struct weston_test *t, void *data) > { > - t->run(); > + t->run(data); > exit(EXIT_SUCCESS); > } > > +static int > +exec_and_report_test(const struct weston_test *t, void *test_data, int > iteration) > +{ > + int success = 0; > + int hardfail = 0; > + siginfo_t info; > + > + pid_t pid = fork(); > + assert(pid >= 0); > + > + if (pid == 0) > + run_test(t, test_data); /* never returns */ > + > + if (waitid(P_ALL, 0, &info, WEXITED)) { > + fprintf(stderr, "waitid failed: %m\n"); > + abort(); > + } > + > + if (test_data) > + fprintf(stderr, "test \"%s/%i\":\t", t->name, iteration); > + else > + fprintf(stderr, "test \"%s\":\t", t->name); > + > + switch (info.si_code) { > + case CLD_EXITED: > + fprintf(stderr, "exit status %d", info.si_status); > + if (info.si_status == EXIT_SUCCESS) > + success = 1; > + break; > + case CLD_KILLED: > + case CLD_DUMPED: > + fprintf(stderr, "signal %d", info.si_status); > + if (info.si_status != SIGABRT) > + hardfail = 1; > + break; > + } > + > + if (t->must_fail) > + success = !success; > + > + if (success && !hardfail) { > + fprintf(stderr, ", pass.\n"); > + return 1; > + } else { > + fprintf(stderr, ", fail.\n"); > + return 0; > + } > +} > + > +/* Returns number of tests and number of pass / fail in param args */ > +static int > +iterate_test(const struct weston_test *t, int *passed) > +{ > + int i; > + void *current_test_data = (void *) t->table_data; > + for (i = 0; i < t->n_elements; ++i, current_test_data += > t->element_size) > + { > + if (exec_and_report_test(t, current_test_data, i)) > + ++(*passed); > + } > + > + return t->n_elements; > +} > + > int main(int argc, char *argv[]) > { > const struct weston_test *t; > - pid_t pid; > - int total, pass; > - siginfo_t info; > + int total = 0; > + int pass = 0; > > if (argc == 2) { > t = find_test(argv[1]); > @@ -66,51 +129,15 @@ int main(int argc, char *argv[]) > exit(EXIT_FAILURE); > } > > - run_test(t); > + run_test(t, (void *) t->table_data); Should we be iterating though each table_data element here, too? > } > > - pass = 0; > for (t = &__start_test_section; t < &__stop_test_section; t++) { > - int success = 0; > - int hardfail = 0; > - > - pid = fork(); > - assert(pid >= 0); > - > - if (pid == 0) > - run_test(t); /* never returns */ > - > - if (waitid(P_ALL, 0, &info, WEXITED)) { > - fprintf(stderr, "waitid failed: %m\n"); > - abort(); > - } > - >
[PATCH 1/3] Add support for table-driven testing.
The new TEST_P macro takes a function name and a "data" argument to point to an arbitrary array of known size of test data. This allows multiple tests to be run with different datasets. The array is stored as a void * but advanced by a known size on each iteration. The data for each invocation of the test is provided as a "data" argument, it is the responsibility of the test to cast it to something sensible. --- tests/weston-test-runner.c | 117 - tests/weston-test-runner.h | 52 +--- 2 files changed, 108 insertions(+), 61 deletions(-) diff --git a/tests/weston-test-runner.c b/tests/weston-test-runner.c index 27ea9e4..1eb93ea 100644 --- a/tests/weston-test-runner.c +++ b/tests/weston-test-runner.c @@ -46,18 +46,81 @@ find_test(const char *name) } static void -run_test(const struct weston_test *t) +run_test(const struct weston_test *t, void *data) { - t->run(); + t->run(data); exit(EXIT_SUCCESS); } +static int +exec_and_report_test(const struct weston_test *t, void *test_data, int iteration) +{ + int success = 0; + int hardfail = 0; + siginfo_t info; + + pid_t pid = fork(); + assert(pid >= 0); + + if (pid == 0) + run_test(t, test_data); /* never returns */ + + if (waitid(P_ALL, 0, &info, WEXITED)) { + fprintf(stderr, "waitid failed: %m\n"); + abort(); + } + + if (test_data) + fprintf(stderr, "test \"%s/%i\":\t", t->name, iteration); + else + fprintf(stderr, "test \"%s\":\t", t->name); + + switch (info.si_code) { + case CLD_EXITED: + fprintf(stderr, "exit status %d", info.si_status); + if (info.si_status == EXIT_SUCCESS) + success = 1; + break; + case CLD_KILLED: + case CLD_DUMPED: + fprintf(stderr, "signal %d", info.si_status); + if (info.si_status != SIGABRT) + hardfail = 1; + break; + } + + if (t->must_fail) + success = !success; + + if (success && !hardfail) { + fprintf(stderr, ", pass.\n"); + return 1; + } else { + fprintf(stderr, ", fail.\n"); + return 0; + } +} + +/* Returns number of tests and number of pass / fail in param args */ +static int +iterate_test(const struct weston_test *t, int *passed) +{ + int i; + void *current_test_data = (void *) t->table_data; + for (i = 0; i < t->n_elements; ++i, current_test_data += t->element_size) + { + if (exec_and_report_test(t, current_test_data, i)) + ++(*passed); + } + + return t->n_elements; +} + int main(int argc, char *argv[]) { const struct weston_test *t; - pid_t pid; - int total, pass; - siginfo_t info; + int total = 0; + int pass = 0; if (argc == 2) { t = find_test(argv[1]); @@ -66,51 +129,15 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - run_test(t); + run_test(t, (void *) t->table_data); } - pass = 0; for (t = &__start_test_section; t < &__stop_test_section; t++) { - int success = 0; - int hardfail = 0; - - pid = fork(); - assert(pid >= 0); - - if (pid == 0) - run_test(t); /* never returns */ - - if (waitid(P_ALL, 0, &info, WEXITED)) { - fprintf(stderr, "waitid failed: %m\n"); - abort(); - } - - fprintf(stderr, "test \"%s\":\t", t->name); - switch (info.si_code) { - case CLD_EXITED: - fprintf(stderr, "exit status %d", info.si_status); - if (info.si_status == EXIT_SUCCESS) - success = 1; - break; - case CLD_KILLED: - case CLD_DUMPED: - fprintf(stderr, "signal %d", info.si_status); - if (info.si_status != SIGABRT) - hardfail = 1; - break; - } - - if (t->must_fail) - success = !success; - - if (success && !hardfail) { - pass++; - fprintf(stderr, ", pass.\n"); - } else - fprintf(stderr, ", fail.\n"); + int number_passed_in_test = 0; + total += iterate_test(t, &number_passed_in_test); + pass += number_passed_in_test; } - total = &__stop_test_section - &__start_test_section; fprintf(stderr, "%d tests, %d pass, %d fail\n",