Moving gating to use tmt format for finding/running tests. Also adding test to cover segfault bug. Adding perf test script from Thomas Halman for jqspeed.sh. Dropping log collection in favor of printing on failure for upstream tests. Related: RHEL-12896 Related: RHEL-13431
91 lines
2.0 KiB
C
91 lines
2.0 KiB
C
#include <stdlib.h>
|
|
#include <jq.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <pthread.h>
|
|
|
|
int my_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;
|
|
|
|
while (jv_is_valid(result = jq_next(jq))) {
|
|
jv dumped = jv_dump_string(result, 0);
|
|
const char *str = jv_string_value(dumped);
|
|
printf("dumped: %s\n", str);
|
|
}
|
|
|
|
jv_free(result);
|
|
value = jv_parser_next(parser);
|
|
}
|
|
|
|
if (jv_invalid_has_msg(jv_copy(value))) {
|
|
jv msg = jv_invalid_get_msg(value);
|
|
printf("invalid: %s\n", jv_string_value(msg));
|
|
jv_free(msg);
|
|
rv = 1;
|
|
} else {
|
|
jv_free(value);
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
void *run(void *not_used) {
|
|
int rv;
|
|
jq_state *jq;
|
|
const char *prg = ".data";
|
|
|
|
jq = jq_init();
|
|
printf("jq_init jq: %p prg: %s\n", jq, prg);
|
|
if (jq_compile(jq, prg) == 0) {
|
|
jq_teardown(&jq);
|
|
return NULL;
|
|
}
|
|
printf("compiled\n");
|
|
|
|
struct jv_parser *parser = jv_parser_new(0);
|
|
const char *buf = "{ \"data\": 1 }";
|
|
jv_parser_set_buf(parser, buf, strlen(buf), 0);
|
|
rv = my_jq_parse(jq, parser);
|
|
if (rv != 0) {
|
|
printf("my_jq_parse failed!\n");
|
|
}
|
|
|
|
jv_parser_free(parser);
|
|
jq_teardown(&jq);
|
|
return NULL;
|
|
}
|
|
|
|
#define THREADS 2
|
|
/* calling run() twice works fine */
|
|
/* calling them in threads causes core-dump */
|
|
int main (int argc, char *argv[])
|
|
{
|
|
pthread_t threads[THREADS];
|
|
int createerror;
|
|
int a;
|
|
|
|
memset(&threads, 0, sizeof(threads));
|
|
for (a = 0; a < THREADS; ++a) {
|
|
// sleep(1); // < if you want to run threads sequentionally
|
|
createerror = pthread_create(&threads[a], NULL, run, NULL);
|
|
if (createerror) {
|
|
printf("create thread error %d\n", a);
|
|
}
|
|
}
|
|
for(a = 0; a < THREADS; ++a) {
|
|
if (threads[a] != 0) {
|
|
pthread_join(threads[a], NULL);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|