Test that jq works in threads

This patch implements test that searches a key in simple
json in pthread.
This commit is contained in:
Tomas Halman authored and Nico Williams committed 2023-07-24 11:55:15 -05:00
1 parent 2dbae5610b
commit cca0087ee6
1 file changed
+93 -3
+93 -3
View File
@@ -2,12 +2,17 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef HAVE_PTHREAD
#include <pthread.h>
#endif
#include "jv.h" #include "jv.h"
#include "jq.h" #include "jq.h"
static void jv_test(); static void jv_test();
static void run_jq_tests(jv, int, FILE *, int, int); 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[]) { int jq_testsuite(jv libdirs, int verbose, int argc, char* argv[]) {
FILE *testdata = stdin; 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); run_jq_tests(libdirs, verbose, testdata, skip, take);
#ifdef HAVE_PTHREAD
run_jq_pthread_tests();
#endif
return 0; 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')) if (buf[0] == '\n' || (buf[0] == '\r' && buf[1] == '\n'))
break; break;
} }
must_fail = 0; must_fail = 0;
check_msg = 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; 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); passed, tests, invalid, total_skipped);
if (skip > 0) { 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() { static void jv_test() {
/// JSON parser regression tests /// JSON parser regression tests
{ {