2011-06-30 18:08:29 +04:00
# include <config.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <time.h>
# include "internal.h"
2012-12-12 21:53:50 +04:00
# include "virjson.h"
2011-06-30 18:08:29 +04:00
# include "testutils.h"
2017-06-26 19:02:35 +03:00
# define VIR_FROM_THIS VIR_FROM_NONE
2011-06-30 18:08:29 +04:00
struct testInfo {
const char * doc ;
2013-04-26 18:59:02 +04:00
const char * expect ;
2011-06-30 18:08:29 +04:00
bool pass ;
} ;
static int
testJSONFromString ( const void * data )
{
const struct testInfo * info = data ;
virJSONValuePtr json ;
2017-07-03 16:37:21 +03:00
const char * expectstr = info - > expect ? info - > expect : info - > doc ;
char * formatted = NULL ;
2011-06-30 18:08:29 +04:00
int ret = - 1 ;
json = virJSONValueFromString ( info - > doc ) ;
2017-07-03 16:02:38 +03:00
if ( ! json ) {
if ( info - > pass ) {
2015-04-23 20:38:00 +03:00
VIR_TEST_VERBOSE ( " Fail to parse %s \n " , info - > doc ) ;
2011-06-30 18:08:29 +04:00
goto cleanup ;
} else {
2015-04-23 20:38:00 +03:00
VIR_TEST_DEBUG ( " Fail to parse %s \n " , info - > doc ) ;
2017-07-03 16:02:38 +03:00
ret = 0 ;
goto cleanup ;
2011-06-30 18:08:29 +04:00
}
}
2017-07-03 16:02:38 +03:00
if ( ! info - > pass ) {
VIR_TEST_VERBOSE ( " Should not have parsed %s \n " , info - > doc ) ;
goto cleanup ;
}
VIR_TEST_DEBUG ( " Parsed %s \n " , info - > doc ) ;
2017-07-03 16:37:21 +03:00
if ( ! ( formatted = virJSONValueToString ( json , false ) ) ) {
VIR_TEST_VERBOSE ( " Failed to format json data \n " ) ;
goto cleanup ;
}
if ( STRNEQ ( expectstr , formatted ) ) {
virTestDifference ( stderr , expectstr , formatted ) ;
goto cleanup ;
}
2011-06-30 18:08:29 +04:00
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2017-07-03 16:37:21 +03:00
VIR_FREE ( formatted ) ;
2011-06-30 18:08:29 +04:00
virJSONValueFree ( json ) ;
return ret ;
}
2013-04-26 18:59:02 +04:00
static int
testJSONAddRemove ( const void * data )
{
const struct testInfo * info = data ;
virJSONValuePtr json ;
2013-08-01 23:54:51 +04:00
virJSONValuePtr name = NULL ;
2013-04-26 18:59:02 +04:00
char * result = NULL ;
int ret = - 1 ;
json = virJSONValueFromString ( info - > doc ) ;
2013-08-01 23:54:51 +04:00
if ( ! json ) {
2015-04-23 20:38:00 +03:00
VIR_TEST_VERBOSE ( " Fail to parse %s \n " , info - > doc ) ;
2013-08-01 23:54:51 +04:00
ret = - 1 ;
goto cleanup ;
}
2013-04-26 18:59:02 +04:00
switch ( virJSONValueObjectRemoveKey ( json , " name " , & name ) ) {
case 1 :
if ( ! info - > pass ) {
2015-04-23 20:38:00 +03:00
VIR_TEST_VERBOSE ( " should not remove from non-object %s \n " ,
2015-05-12 15:40:34 +03:00
info - > doc ) ;
2013-04-26 18:59:02 +04:00
goto cleanup ;
}
break ;
case - 1 :
if ( ! info - > pass )
ret = 0 ;
2015-04-23 20:38:00 +03:00
else
VIR_TEST_VERBOSE ( " Fail to recognize non-object %s \n " , info - > doc ) ;
2013-04-26 18:59:02 +04:00
goto cleanup ;
default :
2015-04-23 20:38:00 +03:00
VIR_TEST_VERBOSE ( " unexpected result when removing from %s \n " ,
2015-05-12 15:40:34 +03:00
info - > doc ) ;
2013-04-26 18:59:02 +04:00
goto cleanup ;
}
if ( STRNEQ_NULLABLE ( virJSONValueGetString ( name ) , " sample " ) ) {
2015-04-23 20:38:00 +03:00
VIR_TEST_VERBOSE ( " unexpected value after removing name: %s \n " ,
2015-05-12 15:40:34 +03:00
NULLSTR ( virJSONValueGetString ( name ) ) ) ;
2013-04-26 18:59:02 +04:00
goto cleanup ;
}
if ( virJSONValueObjectRemoveKey ( json , " name " , NULL ) ) {
2015-04-23 20:38:00 +03:00
VIR_TEST_VERBOSE ( " %s " ,
2015-05-12 15:40:34 +03:00
" unexpected success when removing missing key \n " ) ;
2013-04-26 18:59:02 +04:00
goto cleanup ;
}
if ( virJSONValueObjectAppendString ( json , " newname " , " foo " ) < 0 ) {
2015-04-23 20:38:00 +03:00
VIR_TEST_VERBOSE ( " %s " , " unexpected failure adding new key \n " ) ;
2013-04-26 18:59:02 +04:00
goto cleanup ;
}
if ( ! ( result = virJSONValueToString ( json , false ) ) ) {
2015-04-23 20:38:00 +03:00
VIR_TEST_VERBOSE ( " %s " , " failed to stringize result \n " ) ;
2013-04-26 18:59:02 +04:00
goto cleanup ;
}
if ( STRNEQ ( info - > expect , result ) ) {
2016-05-26 18:01:51 +03:00
virTestDifference ( stderr , info - > expect , result ) ;
2013-04-26 18:59:02 +04:00
goto cleanup ;
}
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2013-04-26 18:59:02 +04:00
virJSONValueFree ( json ) ;
virJSONValueFree ( name ) ;
VIR_FREE ( result ) ;
return ret ;
}
2015-06-20 02:13:03 +03:00
static int
testJSONLookup ( const void * data )
{
const struct testInfo * info = data ;
virJSONValuePtr json ;
virJSONValuePtr value = NULL ;
char * result = NULL ;
int rc ;
int number ;
const char * str ;
int ret = - 1 ;
json = virJSONValueFromString ( info - > doc ) ;
if ( ! json ) {
VIR_TEST_VERBOSE ( " Fail to parse %s \n " , info - > doc ) ;
ret = - 1 ;
goto cleanup ;
}
value = virJSONValueObjectGetObject ( json , " a " ) ;
if ( value ) {
if ( ! info - > pass ) {
VIR_TEST_VERBOSE ( " lookup for 'a' in '%s' should have failed \n " ,
info - > doc ) ;
goto cleanup ;
} else {
result = virJSONValueToString ( value , false ) ;
if ( STRNEQ_NULLABLE ( result , " {} " ) ) {
VIR_TEST_VERBOSE ( " lookup for 'a' in '%s' found '%s' but "
" should have found '{}' \n " ,
info - > doc , NULLSTR ( result ) ) ;
goto cleanup ;
}
VIR_FREE ( result ) ;
}
} else if ( info - > pass ) {
VIR_TEST_VERBOSE ( " lookup for 'a' in '%s' should have succeeded \n " ,
info - > doc ) ;
goto cleanup ;
}
number = 2 ;
rc = virJSONValueObjectGetNumberInt ( json , " b " , & number ) ;
if ( rc = = 0 ) {
if ( ! info - > pass ) {
VIR_TEST_VERBOSE ( " lookup for 'b' in '%s' should have failed \n " ,
info - > doc ) ;
goto cleanup ;
} else if ( number ! = 1 ) {
VIR_TEST_VERBOSE ( " lookup for 'b' in '%s' found %d but "
" should have found 1 \n " ,
info - > doc , number ) ;
goto cleanup ;
}
} else if ( info - > pass ) {
VIR_TEST_VERBOSE ( " lookup for 'b' in '%s' should have succeeded \n " ,
info - > doc ) ;
goto cleanup ;
}
str = virJSONValueObjectGetString ( json , " c " ) ;
if ( str ) {
if ( ! info - > pass ) {
VIR_TEST_VERBOSE ( " lookup for 'c' in '%s' should have failed \n " ,
info - > doc ) ;
goto cleanup ;
} else if ( STRNEQ ( str , " str " ) ) {
VIR_TEST_VERBOSE ( " lookup for 'c' in '%s' found '%s' but "
" should have found 'str' \n " , info - > doc , str ) ;
goto cleanup ;
}
} else if ( info - > pass ) {
VIR_TEST_VERBOSE ( " lookup for 'c' in '%s' should have succeeded \n " ,
info - > doc ) ;
goto cleanup ;
}
value = virJSONValueObjectGetArray ( json , " d " ) ;
if ( value ) {
if ( ! info - > pass ) {
VIR_TEST_VERBOSE ( " lookup for 'd' in '%s' should have failed \n " ,
info - > doc ) ;
goto cleanup ;
} else {
result = virJSONValueToString ( value , false ) ;
if ( STRNEQ_NULLABLE ( result , " [] " ) ) {
VIR_TEST_VERBOSE ( " lookup for 'd' in '%s' found '%s' but "
" should have found '[]' \n " ,
info - > doc , NULLSTR ( result ) ) ;
goto cleanup ;
}
VIR_FREE ( result ) ;
}
} else if ( info - > pass ) {
VIR_TEST_VERBOSE ( " lookup for 'd' in '%s' should have succeeded \n " ,
info - > doc ) ;
goto cleanup ;
}
ret = 0 ;
cleanup :
virJSONValueFree ( json ) ;
VIR_FREE ( result ) ;
return ret ;
}
2014-08-21 14:23:41 +04:00
static int
testJSONCopy ( const void * data )
{
const struct testInfo * info = data ;
virJSONValuePtr json = NULL ;
virJSONValuePtr jsonCopy = NULL ;
char * result = NULL ;
char * resultCopy = NULL ;
int ret = - 1 ;
json = virJSONValueFromString ( info - > doc ) ;
if ( ! json ) {
2017-07-11 15:40:05 +03:00
VIR_TEST_VERBOSE ( " Failed to parse %s \n " , info - > doc ) ;
2014-08-21 14:23:41 +04:00
goto cleanup ;
}
jsonCopy = virJSONValueCopy ( json ) ;
if ( ! jsonCopy ) {
2017-07-11 15:40:05 +03:00
VIR_TEST_VERBOSE ( " Failed to copy JSON data \n " ) ;
2014-08-21 14:23:41 +04:00
goto cleanup ;
}
result = virJSONValueToString ( json , false ) ;
if ( ! result ) {
2017-07-11 15:40:05 +03:00
VIR_TEST_VERBOSE ( " Failed to format original JSON data \n " ) ;
2014-08-21 14:23:41 +04:00
goto cleanup ;
}
resultCopy = virJSONValueToString ( json , false ) ;
if ( ! resultCopy ) {
2017-07-11 15:40:05 +03:00
VIR_TEST_VERBOSE ( " Failed to format copied JSON data \n " ) ;
2014-08-21 14:23:41 +04:00
goto cleanup ;
}
if ( STRNEQ ( result , resultCopy ) ) {
if ( virTestGetVerbose ( ) )
2016-05-26 18:01:51 +03:00
virTestDifference ( stderr , result , resultCopy ) ;
2014-08-21 14:23:41 +04:00
goto cleanup ;
}
VIR_FREE ( result ) ;
VIR_FREE ( resultCopy ) ;
result = virJSONValueToString ( json , true ) ;
if ( ! result ) {
2017-07-11 15:40:05 +03:00
VIR_TEST_VERBOSE ( " Failed to format original JSON data \n " ) ;
2014-08-21 14:23:41 +04:00
goto cleanup ;
}
resultCopy = virJSONValueToString ( json , true ) ;
if ( ! resultCopy ) {
2017-07-11 15:40:05 +03:00
VIR_TEST_VERBOSE ( " Failed to format copied JSON data \n " ) ;
2014-08-21 14:23:41 +04:00
goto cleanup ;
}
if ( STRNEQ ( result , resultCopy ) ) {
if ( virTestGetVerbose ( ) )
2016-05-26 18:01:51 +03:00
virTestDifference ( stderr , result , resultCopy ) ;
2014-08-21 14:23:41 +04:00
goto cleanup ;
}
ret = 0 ;
cleanup :
VIR_FREE ( result ) ;
VIR_FREE ( resultCopy ) ;
virJSONValueFree ( json ) ;
virJSONValueFree ( jsonCopy ) ;
return ret ;
}
2017-06-26 19:02:35 +03:00
static int
testJSONDeflatten ( const void * data )
{
const struct testInfo * info = data ;
virJSONValuePtr injson = NULL ;
virJSONValuePtr deflattened = NULL ;
char * infile = NULL ;
char * indata = NULL ;
char * outfile = NULL ;
char * actual = NULL ;
int ret = - 1 ;
if ( virAsprintf ( & infile , " %s/virjsondata/deflatten-%s-in.json " ,
abs_srcdir , info - > doc ) < 0 | |
virAsprintf ( & outfile , " %s/virjsondata/deflatten-%s-out.json " ,
abs_srcdir , info - > doc ) < 0 )
goto cleanup ;
if ( virTestLoadFile ( infile , & indata ) < 0 )
goto cleanup ;
if ( ! ( injson = virJSONValueFromString ( indata ) ) )
goto cleanup ;
if ( ( deflattened = virJSONValueObjectDeflatten ( injson ) ) ) {
if ( ! info - > pass ) {
VIR_TEST_VERBOSE ( " %s: deflattening should have failed \n " , info - > doc ) ;
goto cleanup ;
}
} else {
if ( ! info - > pass )
ret = 0 ;
goto cleanup ;
}
if ( ! ( actual = virJSONValueToString ( deflattened , true ) ) )
goto cleanup ;
if ( virTestCompareToFile ( actual , outfile ) < 0 )
goto cleanup ;
ret = 0 ;
cleanup :
virJSONValueFree ( injson ) ;
virJSONValueFree ( deflattened ) ;
VIR_FREE ( infile ) ;
VIR_FREE ( indata ) ;
VIR_FREE ( outfile ) ;
VIR_FREE ( actual ) ;
return ret ;
2017-07-03 17:39:21 +03:00
}
static int
testJSONEscapeObj ( const void * data ATTRIBUTE_UNUSED )
{
virJSONValuePtr json = NULL ;
virJSONValuePtr nestjson = NULL ;
virJSONValuePtr parsejson = NULL ;
char * neststr = NULL ;
char * result = NULL ;
const char * parsednestedstr ;
int ret = - 1 ;
if ( virJSONValueObjectCreate ( & nestjson ,
" s:stringkey " , " stringvalue " ,
" i:numberkey " , 1234 ,
" b:booleankey " , false , NULL ) < 0 ) {
VIR_TEST_VERBOSE ( " failed to create nested json object " ) ;
goto cleanup ;
}
if ( ! ( neststr = virJSONValueToString ( nestjson , false ) ) ) {
VIR_TEST_VERBOSE ( " failed to format nested json object " ) ;
goto cleanup ;
}
if ( virJSONValueObjectCreate ( & json , " s:test " , neststr , NULL ) < 0 ) {
VIR_TEST_VERBOSE ( " Failed to create json object " ) ;
goto cleanup ;
}
if ( ! ( result = virJSONValueToString ( json , false ) ) ) {
VIR_TEST_VERBOSE ( " Failed to format json object " ) ;
goto cleanup ;
}
if ( ! ( parsejson = virJSONValueFromString ( result ) ) ) {
VIR_TEST_VERBOSE ( " Failed to parse JSON with nested JSON in string " ) ;
goto cleanup ;
}
if ( ! ( parsednestedstr = virJSONValueObjectGetString ( parsejson , " test " ) ) ) {
VIR_TEST_VERBOSE ( " Failed to retrieve string containing nested json " ) ;
goto cleanup ;
}
2017-06-26 19:02:35 +03:00
2017-07-03 17:39:21 +03:00
if ( STRNEQ ( parsednestedstr , neststr ) ) {
virTestDifference ( stderr , neststr , parsednestedstr ) ;
goto cleanup ;
}
ret = 0 ;
cleanup :
VIR_FREE ( neststr ) ;
VIR_FREE ( result ) ;
virJSONValueFree ( json ) ;
virJSONValueFree ( nestjson ) ;
virJSONValueFree ( parsejson ) ;
return ret ;
2017-06-26 19:02:35 +03:00
}
2011-06-30 18:08:29 +04:00
static int
mymain ( void )
{
int ret = 0 ;
2017-11-03 15:09:47 +03:00
# define DO_TEST_FULL(name, cmd, doc, expect, pass) \
do { \
struct testInfo info = { doc , expect , pass } ; \
if ( virTestRun ( name , testJSON # # cmd , & info ) < 0 ) \
ret = - 1 ; \
2011-06-30 18:08:29 +04:00
} while ( 0 )
2017-07-03 16:37:21 +03:00
/**
* DO_TEST_PARSE :
* @ name : test name
* @ doc : source JSON string
* @ expect : expected output JSON formatted from parsed @ doc
*
* Parses @ doc and formats it back . If @ expect is NULL the result has to be
* identical to @ doc .
*/
2017-11-03 15:09:47 +03:00
# define DO_TEST_PARSE(name, doc, expect) \
2017-07-03 16:37:21 +03:00
DO_TEST_FULL ( name , FromString , doc , expect , true )
2011-06-30 18:08:29 +04:00
2017-11-03 15:09:47 +03:00
# define DO_TEST_PARSE_FAIL(name, doc) \
2013-10-14 17:37:06 +04:00
DO_TEST_FULL ( name , FromString , doc , NULL , false )
2017-07-03 16:37:21 +03:00
DO_TEST_PARSE ( " Simple " , " { \" return \" : {}, \" id \" : \" libvirt-1 \" } " ,
" { \" return \" :{}, \" id \" : \" libvirt-1 \" } " ) ;
2011-06-30 18:08:29 +04:00
DO_TEST_PARSE ( " NotSoSimple " , " { \" QMP \" : { \" version \" : { \" qemu \" : "
2015-05-12 15:40:34 +03:00
" { \" micro \" : 91, \" minor \" : 13, \" major \" : 0}, "
2017-07-03 16:37:21 +03:00
" \" package \" : \" (qemu-kvm-devel) \" }, \" capabilities \" : []}} " ,
" { \" QMP \" :{ \" version \" :{ \" qemu \" : "
" { \" micro \" :91, \" minor \" :13, \" major \" :0}, "
" \" package \" : \" (qemu-kvm-devel) \" }, \" capabilities \" :[]}} " ) ;
2011-06-30 18:08:29 +04:00
DO_TEST_PARSE ( " Harder " , " { \" return \" : [{ \" filename \" : "
" \" unix:/home/berrange/.libvirt/qemu/lib/tck.monitor,server \" , "
" \" label \" : \" charmonitor \" }, { \" filename \" : \" pty:/dev/pts/158 \" , "
2017-07-03 16:37:21 +03:00
" \" label \" : \" charserial0 \" }], \" id \" : \" libvirt-3 \" } " ,
" { \" return \" :[{ \" filename \" : "
" \" unix:/home/berrange/.libvirt/qemu/lib/tck.monitor,server \" , "
" \" label \" : \" charmonitor \" },{ \" filename \" : \" pty:/dev/pts/158 \" , "
" \" label \" : \" charserial0 \" }], \" id \" : \" libvirt-3 \" } " ) ;
2011-06-30 18:08:29 +04:00
2017-07-03 16:16:02 +03:00
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 \" : "
2017-07-03 16:37:21 +03:00
" \" query-balloon \" }], \" id \" : \" libvirt-2 \" } " , NULL ) ;
2011-06-30 18:08:29 +04:00
2013-04-26 18:59:02 +04:00
DO_TEST_FULL ( " add and remove " , AddRemove ,
" { \" name \" : \" sample \" , \" value \" : true} " ,
" { \" value \" :true, \" newname \" : \" foo \" } " ,
true ) ;
DO_TEST_FULL ( " add and remove " , AddRemove ,
" [ 1 ] " , NULL , false ) ;
2014-08-21 14:23:41 +04:00
DO_TEST_FULL ( " copy and free " , Copy ,
" { \" 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 \" } " , NULL , true ) ;
2013-10-14 17:37:06 +04:00
2017-07-03 16:37:21 +03:00
DO_TEST_PARSE ( " almost nothing " , " [] " , NULL ) ;
2013-10-14 17:37:06 +04:00
DO_TEST_PARSE_FAIL ( " nothing " , " " ) ;
2017-07-03 16:37:21 +03:00
DO_TEST_PARSE ( " number without garbage " , " [ 234545 ] " , " [234545] " ) ;
2013-10-14 17:37:06 +04:00
DO_TEST_PARSE_FAIL ( " number with garbage " , " [ 2345b45 ] " ) ;
2017-07-03 16:37:21 +03:00
DO_TEST_PARSE ( " float without garbage " , " [ 0.0314159e+100 ] " , " [0.0314159e+100] " ) ;
2013-10-14 17:37:06 +04:00
DO_TEST_PARSE_FAIL ( " float with garbage " , " [ 0.0314159ee+100 ] " ) ;
2017-07-03 16:37:21 +03:00
DO_TEST_PARSE ( " string " , " [ \" The meaning of life \" ] " ,
" [ \" The meaning of life \" ] " ) ;
2013-11-04 17:50:11 +04:00
DO_TEST_PARSE_FAIL ( " unterminated string " , " [ \" The meaning of lif ] " ) ;
2017-07-03 16:37:21 +03:00
DO_TEST_PARSE ( " integer " , " 1 " , NULL ) ;
DO_TEST_PARSE ( " boolean " , " true " , NULL ) ;
DO_TEST_PARSE ( " null " , " null " , NULL ) ;
2017-07-03 17:39:21 +03:00
DO_TEST_PARSE ( " escaping symbols " , " [ \" \\ \" \\ t \\ n \\ \\ \" ] " , NULL ) ;
DO_TEST_PARSE ( " escaped strings " , " [ \" { \\ \" blurb \\ \" : \\ \" test \\ \" } \" ] " , NULL ) ;
2015-06-20 02:28:22 +03:00
DO_TEST_PARSE_FAIL ( " incomplete keyword " , " tr " ) ;
2015-06-22 23:18:32 +03:00
DO_TEST_PARSE_FAIL ( " overdone keyword " , " [ truest ] " ) ;
2015-06-20 02:28:22 +03:00
DO_TEST_PARSE_FAIL ( " unknown keyword " , " huh " ) ;
2015-06-22 23:18:33 +03:00
DO_TEST_PARSE_FAIL ( " comments " , " [ /* nope */ \n 1 // not this either \n ] " ) ;
2015-06-22 23:18:34 +03:00
DO_TEST_PARSE_FAIL ( " trailing garbage " , " [] [] " ) ;
DO_TEST_PARSE_FAIL ( " list without array " , " 1, 1 " ) ;
2015-06-23 00:01:15 +03:00
DO_TEST_PARSE_FAIL ( " parser abuse " , " 1] [2 " ) ;
2015-06-23 00:14:04 +03:00
DO_TEST_PARSE_FAIL ( " invalid UTF-8 " , " \" \x80 \" " ) ;
2013-10-14 17:37:06 +04:00
DO_TEST_PARSE_FAIL ( " object with numeric keys " , " { 1:1, 2:1, 3:2 } " ) ;
2013-11-04 17:50:11 +04:00
DO_TEST_PARSE_FAIL ( " unterminated object " , " { \" 1 \" :1, \" 2 \" :1, \" 3 \" :2 " ) ;
DO_TEST_PARSE_FAIL ( " unterminated array of objects " ,
" [ { \" name \" : \" John \" }, { \" name \" : \" Paul \" }, " ) ;
2013-10-14 17:37:06 +04:00
DO_TEST_PARSE_FAIL ( " array of an object with an array as a key " ,
" [ {[ \" key1 \" , \" key2 \" ]: \" value \" } ] " ) ;
2013-11-04 17:50:11 +04:00
DO_TEST_PARSE_FAIL ( " object with unterminated key " , " { \" key:7 } " ) ;
2015-06-23 00:14:04 +03:00
DO_TEST_PARSE_FAIL ( " duplicate key " , " { \" a \" : 1, \" a \" : 1 } " ) ;
2013-10-14 17:37:06 +04:00
2015-06-20 02:13:03 +03:00
DO_TEST_FULL ( " lookup on array " , Lookup ,
" [ 1 ] " , NULL , false ) ;
DO_TEST_FULL ( " lookup on string " , Lookup ,
" \" str \" " , NULL , false ) ;
DO_TEST_FULL ( " lookup on integer " , Lookup ,
" 1 " , NULL , false ) ;
DO_TEST_FULL ( " lookup with missing key " , Lookup ,
" { } " , NULL , false ) ;
DO_TEST_FULL ( " lookup with wrong type " , Lookup ,
" { \" a \" : 1, \" b \" : \" str \" , \" c \" : [], \" d \" : {} } " ,
NULL , false ) ;
DO_TEST_FULL ( " lookup with correct type " , Lookup ,
" { \" a \" : {}, \" b \" : 1, \" c \" : \" str \" , \" d \" : [] } " ,
NULL , true ) ;
2017-07-03 17:39:21 +03:00
DO_TEST_FULL ( " create object with nested json in attribute " , EscapeObj ,
NULL , NULL , true ) ;
2015-06-20 02:13:03 +03:00
2017-06-26 19:02:35 +03:00
# define DO_TEST_DEFLATTEN(name, pass) \
DO_TEST_FULL ( name , Deflatten , name , NULL , pass )
DO_TEST_DEFLATTEN ( " unflattened " , true ) ;
DO_TEST_DEFLATTEN ( " basic-file " , true ) ;
2017-06-27 14:48:56 +03:00
DO_TEST_DEFLATTEN ( " basic-generic " , true ) ;
2017-06-26 19:02:35 +03:00
DO_TEST_DEFLATTEN ( " deep-file " , true ) ;
2017-06-27 14:48:56 +03:00
DO_TEST_DEFLATTEN ( " deep-generic " , true ) ;
2017-06-26 19:02:35 +03:00
DO_TEST_DEFLATTEN ( " nested " , true ) ;
2017-06-27 14:48:56 +03:00
DO_TEST_DEFLATTEN ( " double-key " , false ) ;
2017-06-26 19:02:35 +03:00
DO_TEST_DEFLATTEN ( " concat " , true ) ;
2017-06-27 14:48:56 +03:00
DO_TEST_DEFLATTEN ( " concat-double-key " , false ) ;
2017-06-26 20:42:06 +03:00
DO_TEST_DEFLATTEN ( " qemu-sheepdog " , true ) ;
2017-06-26 19:02:35 +03:00
2011-06-30 18:08:29 +04:00
return ( ret = = 0 ) ? EXIT_SUCCESS : EXIT_FAILURE ;
}
2017-03-29 17:45:42 +03:00
VIR_TEST_MAIN ( mymain )