|
|
@@ -0,0 +1,100 @@ |
|
|
|
/* |
|
|
|
* Tests if binary strings are supported. |
|
|
|
*/ |
|
|
|
|
|
|
|
#include "config.h" |
|
|
|
#include <stdio.h> |
|
|
|
#include <string.h> |
|
|
|
|
|
|
|
#include "json_inttypes.h" |
|
|
|
#include "json_object.h" |
|
|
|
#include "json_tokener.h" |
|
|
|
|
|
|
|
int main(void) |
|
|
|
{ |
|
|
|
/* this test has embedded null characters in the key and value. |
|
|
|
* check that it's still included after deserializing. */ |
|
|
|
const char *input = "{ \"biff\\u0000\": null, \"\\u0000zxcvbnm\": 178 }"; |
|
|
|
const char *expected_biff = "biff\0"; |
|
|
|
const int expected_biff_len = 5; |
|
|
|
const char *expected_biff_printable = "biff\\u0000"; |
|
|
|
const char *expected_zxcv = "\0zxcvbnm"; |
|
|
|
const int expected_zxcv_len = 8; |
|
|
|
const char *expected_zxcv_printable = "\\u0000zxcvbnm"; |
|
|
|
|
|
|
|
struct json_object *parsed = json_tokener_parse(input); |
|
|
|
struct json_object *val; |
|
|
|
json_bool key_present; |
|
|
|
|
|
|
|
printf("Parsed input: %s\n", input); |
|
|
|
printf("Result is "); |
|
|
|
if (parsed == NULL) |
|
|
|
{ |
|
|
|
printf("NULL (error!)\n"); |
|
|
|
return 1; // Error somewhere |
|
|
|
} |
|
|
|
else if (!json_object_is_type(parsed, json_type_object)) |
|
|
|
{ |
|
|
|
printf("not `json_type_object` (error!)\n"); |
|
|
|
return 1; // Error somewhere |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
printf("`json_type_object`\n"); |
|
|
|
} |
|
|
|
|
|
|
|
// Check nothing odd happened in parsing |
|
|
|
if (json_object_object_length(parsed) != 2) |
|
|
|
{ |
|
|
|
printf("Should contain two fields (has %d) (error!)", |
|
|
|
json_object_object_length(parsed)); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
key_present = json_object_object_get_ex_len(parsed, expected_biff, expected_biff_len, &val); |
|
|
|
if (!key_present || !json_object_is_type(val, json_type_null)) |
|
|
|
{ |
|
|
|
printf("The key \"%s\" should be present and should be NULL (error!)\n", |
|
|
|
expected_biff_printable); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
key_present = json_object_object_get_ex_len(parsed, expected_zxcv, expected_zxcv_len, &val); |
|
|
|
if (!key_present || !json_object_is_type(val, json_type_int) || |
|
|
|
json_object_get_int(val) != 178) |
|
|
|
{ |
|
|
|
printf("The key \"%s\" should be present and should be 178 (error!)\n", |
|
|
|
expected_zxcv_printable); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
printf("Expected keys (\"%s\" and \"%s\") present with expected values\n", |
|
|
|
expected_biff_printable, expected_zxcv_printable); |
|
|
|
|
|
|
|
// Delete one key |
|
|
|
json_object_object_del_len(parsed, expected_zxcv, expected_zxcv_len); |
|
|
|
|
|
|
|
// Check it is gone |
|
|
|
if (json_object_object_length(parsed) != 1) |
|
|
|
{ |
|
|
|
printf("Should contain only one field (has %d) (error!)", |
|
|
|
json_object_object_length(parsed)); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
key_present = json_object_object_get_ex_len(parsed, expected_biff, expected_biff_len, &val); |
|
|
|
if (!key_present || !json_object_is_type(val, json_type_null)) |
|
|
|
{ |
|
|
|
printf("The key \"%s\" should be present and should be NULL (error!)\n", |
|
|
|
expected_biff_printable); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
key_present = json_object_object_get_ex_len(parsed, expected_zxcv, expected_zxcv_len, &val); |
|
|
|
if (key_present) |
|
|
|
{ |
|
|
|
printf("The key \"%s\" should not be present (error!)\n", expected_zxcv_printable); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
printf("Key deleted properly\n"); |
|
|
|
|
|
|
|
json_object_put(parsed); |
|
|
|
printf("PASS\n"); |
|
|
|
return 0; |
|
|
|
} |