diff --git a/src/jq_test.c b/src/jq_test.c index e6e85fcc..4505c19a 100644 --- a/src/jq_test.c +++ b/src/jq_test.c @@ -2,12 +2,17 @@ #include #include #include +#ifdef HAVE_PTHREAD +#include +#endif #include "jv.h" #include "jq.h" static void jv_test(); static void run_jq_tests(jv, int, FILE *, int, int); - +#ifdef HAVE_PTHREAD +static void run_jq_pthread_tests(); +#endif int jq_testsuite(jv libdirs, int verbose, int argc, char* argv[]) { FILE *testdata = stdin; @@ -32,6 +37,9 @@ int jq_testsuite(jv libdirs, int verbose, int argc, char* argv[]) { } } run_jq_tests(libdirs, verbose, testdata, skip, take); +#ifdef HAVE_PTHREAD + run_jq_pthread_tests(); +#endif return 0; } @@ -105,7 +113,7 @@ static void run_jq_tests(jv lib_dirs, int verbose, FILE *testdata, int skip, int if (buf[0] == '\n' || (buf[0] == '\r' && buf[1] == '\n')) break; } - + must_fail = 0; check_msg = 0; @@ -230,7 +238,7 @@ static void run_jq_tests(jv lib_dirs, int verbose, FILE *testdata, int skip, int total_skipped = tests_to_skip - skip; } - printf("%d of %d tests passed (%d malformed, %d skipped)\n", + printf("%d of %d tests passed (%d malformed, %d skipped)\n", passed, tests, invalid, total_skipped); if (skip > 0) { @@ -242,6 +250,88 @@ static void run_jq_tests(jv lib_dirs, int verbose, FILE *testdata, int skip, int } +/// pthread regression test +#ifdef HAVE_PTHREAD +#define NUMBER_OF_THREADS 3 +struct test_pthread_data { + int result; +}; + +static int test_pthread_jq_parse(jq_state *jq, struct jv_parser *parser) +{ + int rv = 0; + jv value; + + value = jv_parser_next(parser); + while (jv_is_valid(value)) { + jq_start(jq, value, 0); + jv result = jq_next(jq); + + while (jv_is_valid(result)) { + jv_free(result); + result = jq_next(jq); + } + jv_free(result); + value = jv_parser_next(parser); + } + jv_free(value); + return rv; +} + +static void *test_pthread_run(void *ptr) { + int rv; + jq_state *jq; + const char *prg = ".data"; + const char *buf = "{ \"data\": 1 }"; + struct test_pthread_data *data = ptr; + + jq = jq_init(); + if (jq_compile(jq, prg) == 0) { + jq_teardown(&jq); + return NULL; + } + + struct jv_parser *parser = jv_parser_new(0); + jv_parser_set_buf(parser, buf, strlen(buf), 0); + rv = test_pthread_jq_parse(jq, parser); + + data->result = rv; + + jv_parser_free(parser); + jq_teardown(&jq); + return NULL; +} + +static void run_jq_pthread_tests() { + pthread_t threads[NUMBER_OF_THREADS]; + struct test_pthread_data data[NUMBER_OF_THREADS]; + int createerror; + int a; + + memset(&threads, 0, sizeof(threads)); + memset(&data, 0, sizeof(data)); + + // Create all threads + for (a = 0; a < NUMBER_OF_THREADS; ++a) { + createerror = pthread_create(&threads[a], NULL, test_pthread_run, &data[a]); + assert(createerror == 0); + } + + // wait for all threads + for(a = 0; a < NUMBER_OF_THREADS; ++a) { + if (threads[a] != 0) { + pthread_join(threads[a], NULL); + } + } + + // check results + for(a = 0; a < NUMBER_OF_THREADS; ++a) { + assert(data[a].result == 0); + } +} +#endif // HAVE_PTHREAD + + static void jv_test() { /// JSON parser regression tests {