Test that jq works in threads
This patch implements test that searches a key in simple json in pthread.
This commit is contained in:
1 parent
2dbae5610b
commit
cca0087ee6
1 file changed
+93
-3
+93
-3
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user