mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-31 17:05:16 +00:00
Add test case for parsing JSON docs
While investigating some memory leaks it was unclear whether the JSON code correctly free'd all memory during parsing. Add a test case which can be run under valgrind to clearly demonstrate that the parser is leak free. * tests/Makefile.am: Add 'jsontest' * tests/jsontest.c: A few simple JSON parsing tests
This commit is contained in:
parent
e44bec2e34
commit
06da1805bf
@ -14,6 +14,7 @@ INCLUDES = \
|
||||
$(SASL_CFLAGS) \
|
||||
$(SELINUX_CFLAGS) \
|
||||
$(APPARMOR_CFLAGS) \
|
||||
$(YAJL_CFLAGS) \
|
||||
$(COVERAGE_CFLAGS) \
|
||||
$(WARN_CFLAGS)
|
||||
|
||||
@ -29,6 +30,7 @@ LDADDS = \
|
||||
$(SASL_LIBS) \
|
||||
$(SELINUX_LIBS) \
|
||||
$(APPARMOR_LIBS) \
|
||||
$(YAJL_LIBS) \
|
||||
$(WARN_CFLAGS) \
|
||||
../src/libvirt_test.la \
|
||||
../gnulib/lib/libgnu.la \
|
||||
@ -113,6 +115,10 @@ if WITH_CIL
|
||||
check_PROGRAMS += object-locking
|
||||
endif
|
||||
|
||||
if HAVE_YAJL
|
||||
check_PROGRAMS += jsontest
|
||||
endif
|
||||
|
||||
check_PROGRAMS += networkxml2xmltest
|
||||
|
||||
check_PROGRAMS += networkxml2argvtest
|
||||
@ -196,6 +202,10 @@ TESTS = virshtest \
|
||||
virnetsockettest \
|
||||
$(test_scripts)
|
||||
|
||||
if HAVE_YAJL
|
||||
TESTS += jsontest
|
||||
endif
|
||||
|
||||
if WITH_XEN
|
||||
TESTS += xml2sexprtest \
|
||||
sexpr2xmltest \
|
||||
@ -444,6 +454,10 @@ hashtest_SOURCES = \
|
||||
hashtest.c hashdata.h testutils.h testutils.c
|
||||
hashtest_LDADD = $(LDADDS)
|
||||
|
||||
jsontest_SOURCES = \
|
||||
jsontest.c jsondata.h testutils.h testutils.c
|
||||
jsontest_LDADD = $(LDADDS)
|
||||
|
||||
if WITH_LIBVIRTD
|
||||
eventtest_SOURCES = \
|
||||
eventtest.c testutils.h testutils.c
|
||||
|
111
tests/jsontest.c
Normal file
111
tests/jsontest.c
Normal file
@ -0,0 +1,111 @@
|
||||
#include <config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include "json.h"
|
||||
#include "testutils.h"
|
||||
|
||||
struct testInfo {
|
||||
const char *doc;
|
||||
bool pass;
|
||||
};
|
||||
|
||||
|
||||
static int
|
||||
testJSONFromString(const void *data)
|
||||
{
|
||||
const struct testInfo *info = data;
|
||||
virJSONValuePtr json;
|
||||
int ret = -1;
|
||||
|
||||
json = virJSONValueFromString(info->doc);
|
||||
|
||||
if (info->pass) {
|
||||
if (!json) {
|
||||
if (virTestGetVerbose())
|
||||
fprintf(stderr, "Fail to parse %s\n", info->doc);
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
} else {
|
||||
if (virTestGetDebug())
|
||||
fprintf(stderr, "Parsed %s\n", info->doc);
|
||||
}
|
||||
} else {
|
||||
if (json) {
|
||||
if (virTestGetVerbose())
|
||||
fprintf(stderr, "Should not have parsed %s\n", info->doc);
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
} else {
|
||||
if (virTestGetDebug())
|
||||
fprintf(stderr, "Fail to parse %s\n", info->doc);
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virJSONValueFree(json);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
mymain(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
#define DO_TEST_FULL(name, cmd, doc, pass) \
|
||||
do { \
|
||||
struct testInfo info = { doc, pass }; \
|
||||
if (virtTestRun(name, 1, testJSON ## cmd, &info) < 0) \
|
||||
ret = -1; \
|
||||
} while (0)
|
||||
|
||||
#define DO_TEST_PARSE(name, doc) \
|
||||
DO_TEST_FULL(name, FromString, doc, true)
|
||||
|
||||
DO_TEST_PARSE("Simple", "{\"return\": {}, \"id\": \"libvirt-1\"}");
|
||||
DO_TEST_PARSE("NotSoSimple", "{\"QMP\": {\"version\": {\"qemu\":"
|
||||
"{\"micro\": 91, \"minor\": 13, \"major\": 0},"
|
||||
"\"package\": \" (qemu-kvm-devel)\"}, \"capabilities\": []}}");
|
||||
|
||||
|
||||
DO_TEST_PARSE("Harder", "{\"return\": [{\"filename\": "
|
||||
"\"unix:/home/berrange/.libvirt/qemu/lib/tck.monitor,server\","
|
||||
"\"label\": \"charmonitor\"}, {\"filename\": \"pty:/dev/pts/158\","
|
||||
"\"label\": \"charserial0\"}], \"id\": \"libvirt-3\"}");
|
||||
|
||||
DO_TEST_PARSE("VeryHard", "{\"return\": [{\"name\": \"quit\"}, {\"name\":"
|
||||
"\"eject\"}, {\"name\": \"change\"}, {\"name\": \"screendump\"},"
|
||||
"{\"name\": \"stop\"}, {\"name\": \"cont\"}, {\"name\": "
|
||||
"\"system_reset\"}, {\"name\": \"system_powerdown\"}, "
|
||||
"{\"name\": \"device_add\"}, {\"name\": \"device_del\"}, "
|
||||
"{\"name\": \"cpu\"}, {\"name\": \"memsave\"}, {\"name\": "
|
||||
"\"pmemsave\"}, {\"name\": \"migrate\"}, {\"name\": "
|
||||
"\"migrate_cancel\"}, {\"name\": \"migrate_set_speed\"},"
|
||||
"{\"name\": \"client_migrate_info\"}, {\"name\": "
|
||||
"\"migrate_set_downtime\"}, {\"name\": \"netdev_add\"}, "
|
||||
"{\"name\": \"netdev_del\"}, {\"name\": \"block_resize\"},"
|
||||
"{\"name\": \"balloon\"}, {\"name\": \"set_link\"}, {\"name\":"
|
||||
"\"getfd\"}, {\"name\": \"closefd\"}, {\"name\": \"block_passwd\"},"
|
||||
"{\"name\": \"set_password\"}, {\"name\": \"expire_password\"},"
|
||||
"{\"name\": \"qmp_capabilities\"}, {\"name\": "
|
||||
"\"human-monitor-command\"}, {\"name\": \"query-version\"},"
|
||||
"{\"name\": \"query-commands\"}, {\"name\": \"query-chardev\"},"
|
||||
"{\"name\": \"query-block\"}, {\"name\": \"query-blockstats\"}, "
|
||||
"{\"name\": \"query-cpus\"}, {\"name\": \"query-pci\"}, {\"name\":"
|
||||
"\"query-kvm\"}, {\"name\": \"query-status\"}, {\"name\": "
|
||||
"\"query-mice\"}, {\"name\": \"query-vnc\"}, {\"name\": "
|
||||
"\"query-spice\"}, {\"name\": \"query-name\"}, {\"name\": "
|
||||
"\"query-uuid\"}, {\"name\": \"query-migrate\"}, {\"name\": "
|
||||
"\"query-balloon\"}], \"id\": \"libvirt-2\"}");
|
||||
|
||||
return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
}
|
||||
|
||||
VIRT_TEST_MAIN(mymain)
|
Loading…
x
Reference in New Issue
Block a user