49 #define CATEGORY "/main/json/"
70 static void json_debug_free(
void *p)
89 ast_test_status_update(test,
90 "JSON test leaked %zu allocations!\n",
alloc_count);
104 info->
name =
"type_false";
106 info->
summary =
"Testing fundamental JSON false value.";
107 info->
description =
"Test JSON abstraction library.";
108 return AST_TEST_NOT_RUN;
114 ast_test_validate(test, NULL != uut);
120 return AST_TEST_PASS;
129 info->
name =
"type_true";
131 info->
summary =
"Testing JSON true value.";
132 info->
description =
"Test JSON abstraction library.";
133 return AST_TEST_NOT_RUN;
139 ast_test_validate(test, NULL != uut);
145 return AST_TEST_PASS;
154 info->
name =
"type_bool0";
156 info->
summary =
"Testing JSON boolean function (false).";
157 info->
description =
"Test JSON abstraction library.";
158 return AST_TEST_NOT_RUN;
164 ast_test_validate(test, NULL != uut);
172 return AST_TEST_PASS;
181 info->
name =
"type_bool1";
183 info->
summary =
"Testing JSON boolean function (true).";
184 info->
description =
"Test JSON abstraction library.";
185 return AST_TEST_NOT_RUN;
191 ast_test_validate(test, NULL != uut);
199 return AST_TEST_PASS;
208 info->
name =
"type_null";
210 info->
summary =
"Testing JSON null value.";
211 info->
description =
"Test JSON abstraction library.";
212 return AST_TEST_NOT_RUN;
218 ast_test_validate(test, NULL != uut);
224 return AST_TEST_PASS;
231 info->
name =
"null_val";
233 info->
summary =
"Testing JSON handling of NULL.";
234 info->
description =
"Test JSON abstraction library.";
235 return AST_TEST_NOT_RUN;
250 return AST_TEST_PASS;
260 info->
name =
"type_string";
262 info->
summary =
"Basic string tests.";
263 info->
description =
"Test JSON abstraction library.";
264 return AST_TEST_NOT_RUN;
270 ast_test_validate(test, NULL != uut);
275 ast_test_validate(test, -1 == uut_res);
279 ast_test_validate(test, -1 == uut_res);
283 ast_test_validate(test, 0 == uut_res);
287 ast_test_validate(test, 0 == uut_res);
290 return AST_TEST_PASS;
299 info->
name =
"string_null";
301 info->
summary =
"JSON string NULL tests.";
302 info->
description =
"Test JSON abstraction library.";
303 return AST_TEST_NOT_RUN;
310 ast_test_validate(test, NULL == uut);
322 return AST_TEST_PASS;
332 info->
name =
"stringf";
334 info->
summary =
"Basic string formatting tests.";
335 info->
description =
"Test JSON abstraction library.";
336 return AST_TEST_NOT_RUN;
343 ast_test_validate(test, NULL == uut);
347 ast_test_validate(test, NULL == uut);
352 ast_test_validate(test, NULL != uut);
355 return AST_TEST_PASS;
365 info->
name =
"type_int";
367 info->
summary =
"Basic JSON integer tests.";
368 info->
description =
"Test JSON abstraction library.";
369 return AST_TEST_NOT_RUN;
376 ast_test_validate(test, NULL != uut);
381 ast_test_validate(test, 0 == uut_res);
385 ast_test_validate(test, 0 == uut_res);
389 ast_test_validate(test, 0 == uut_res);
393 ast_test_validate(test, 0 == uut_res);
396 return AST_TEST_PASS;
405 info->
name =
"non_int";
407 info->
summary =
"Testing integer functions with non-integer types.";
408 info->
description =
"Test JSON abstraction library.";
409 return AST_TEST_NOT_RUN;
426 ast_test_validate(test, NULL != uut);
434 return AST_TEST_PASS;
443 info->
name =
"array_create";
445 info->
summary =
"Testing creating JSON arrays.";
446 info->
description =
"Test JSON abstraction library.";
447 return AST_TEST_NOT_RUN;
454 ast_test_validate(test, NULL != uut);
458 return AST_TEST_PASS;
468 info->
name =
"array_append";
470 info->
summary =
"Testing appending to JSON arrays.";
471 info->
description =
"Test JSON abstraction library.";
472 return AST_TEST_NOT_RUN;
480 ast_test_validate(test, 0 == uut_res);
487 return AST_TEST_PASS;
497 info->
name =
"array_insert";
499 info->
summary =
"Testing inserting into JSON arrays.";
500 info->
description =
"Test JSON abstraction library.";
501 return AST_TEST_NOT_RUN;
509 ast_test_validate(test, 0 == uut_res);
514 return AST_TEST_PASS;
524 info->
name =
"array_set";
526 info->
summary =
"Testing setting a value in JSON arrays.";
527 info->
description =
"Test JSON abstraction library.";
528 return AST_TEST_NOT_RUN;
536 ast_test_validate(test, 0 == uut_res);
541 return AST_TEST_PASS;
552 info->
name =
"array_remove";
554 info->
summary =
"Testing removing a value from JSON arrays.";
555 info->
description =
"Test JSON abstraction library.";
556 return AST_TEST_NOT_RUN;
565 ast_test_validate(test, 0 == uut_res);
568 return AST_TEST_PASS;
578 info->
name =
"array_clear";
580 info->
summary =
"Testing clearing JSON arrays.";
581 info->
description =
"Test JSON abstraction library.";
582 return AST_TEST_NOT_RUN;
590 ast_test_validate(test, 0 == uut_res);
593 return AST_TEST_PASS;
605 info->
name =
"array_extend";
607 info->
summary =
"Testing extending JSON arrays.";
608 info->
description =
"Test JSON abstraction library.";
609 return AST_TEST_NOT_RUN;
634 ast_test_validate(test, 0 == uut_res);
639 return AST_TEST_PASS;
648 info->
name =
"array_null";
650 info->
summary =
"Testing NULL conditions for JSON arrays.";
651 info->
description =
"Test JSON abstraction library.";
652 return AST_TEST_NOT_RUN;
670 return AST_TEST_PASS;
679 info->
name =
"object_alloc";
681 info->
summary =
"Testing creating JSON objects.";
682 info->
description =
"Test JSON abstraction library.";
683 return AST_TEST_NOT_RUN;
690 ast_test_validate(test, NULL != uut);
694 return AST_TEST_PASS;
705 info->
name =
"object_set";
707 info->
summary =
"Testing setting values in JSON objects.";
708 info->
description =
"Test JSON abstraction library.";
709 return AST_TEST_NOT_RUN;
715 expected =
ast_json_pack(
"{s: i, s: i, s: i}",
"one", 1,
"two", 2,
"three", 3);
718 ast_test_validate(test, 0 == uut_res);
720 ast_test_validate(test, 0 == uut_res);
722 ast_test_validate(test, 0 == uut_res);
726 return AST_TEST_PASS;
736 info->
name =
"object_set_overwriting";
738 info->
summary =
"Testing changing values in JSON objects.";
739 info->
description =
"Test JSON abstraction library.";
740 return AST_TEST_NOT_RUN;
746 uut =
ast_json_pack(
"{s: i, s: i, s: i}",
"one", 1,
"two", 2,
"three", 3);
748 ast_test_validate(test, 0 == uut_res);
751 return AST_TEST_PASS;
760 info->
name =
"object_get";
762 info->
summary =
"Testing getting values from JSON objects.";
763 info->
description =
"Test JSON abstraction library.";
764 return AST_TEST_NOT_RUN;
770 uut =
ast_json_pack(
"{s: i, s: i, s: i}",
"one", 1,
"two", 2,
"three", 3);
775 return AST_TEST_PASS;
786 info->
name =
"object_del";
788 info->
summary =
"Testing deleting values from JSON objects.";
789 info->
description =
"Test JSON abstraction library.";
790 return AST_TEST_NOT_RUN;
799 ast_test_validate(test, 0 == uut_res);
802 ast_test_validate(test, -1 == uut_res);
804 return AST_TEST_PASS;
814 info->
name =
"object_clear";
816 info->
summary =
"Testing clearing values from JSON objects.";
817 info->
description =
"Test JSON abstraction library.";
818 return AST_TEST_NOT_RUN;
829 ast_test_validate(test, 0 == uut_res);
832 return AST_TEST_PASS;
844 info->
name =
"object_alloc";
846 info->
summary =
"Testing merging JSON objects.";
847 info->
description =
"Test JSON abstraction library.";
848 return AST_TEST_NOT_RUN;
872 ast_test_validate(test, 0 == uut_res);
877 return AST_TEST_PASS;
889 info->
name =
"object_alloc";
891 info->
summary =
"Testing merging JSON objects, updating only existing fields.";
892 info->
description =
"Test JSON abstraction library.";
893 return AST_TEST_NOT_RUN;
915 ast_test_validate(test, 0 == uut_res);
920 return AST_TEST_PASS;
932 info->
name =
"object_merge_missing";
934 info->
summary =
"Testing merging JSON objects, adding only missing fields.";
935 info->
description =
"Test JSON abstraction library.";
936 return AST_TEST_NOT_RUN;
960 ast_test_validate(test, 0 == uut_res);
965 return AST_TEST_PASS;
974 info->
name =
"object_null";
976 info->
summary =
"Testing JSON object NULL behavior.";
977 info->
description =
"Test JSON abstraction library.";
978 return AST_TEST_NOT_RUN;
1000 return AST_TEST_PASS;
1012 info->
name =
"object_iter";
1014 info->
summary =
"Testing iterating through JSON objects.";
1015 info->
description =
"Test JSON abstraction library.";
1016 return AST_TEST_NOT_RUN;
1022 uut =
ast_json_pack(
"{s: i, s: i, s: i, s: i, s: i}",
"one", 1,
"two", 2,
"three", 3,
"four", 4,
"five", 5);
1026 ast_test_validate(test, NULL != iter);
1028 while (NULL != iter) {
1041 ast_test_validate(test, 0);
1046 ast_test_validate(test, 5 == count);
1050 ast_test_validate(test, NULL == iter);
1054 ast_test_validate(test, NULL != iter);
1060 ast_test_validate(test, 0 == uut_res);
1063 return AST_TEST_PASS;
1072 info->
name =
"object_iter_null";
1074 info->
summary =
"Testing JSON object iterator NULL testings.";
1075 info->
description =
"Test JSON abstraction library.";
1076 return AST_TEST_NOT_RUN;
1092 return AST_TEST_PASS;
1104 info->
name =
"object_create_vars";
1106 info->
summary =
"Testing JSON object creation initialized using Asterisk variables.";
1107 info->
description =
"Test JSON abstraction library.";
1108 return AST_TEST_NOT_RUN;
1117 ast_test_validate(test, (new_var = ast_variable_new(
"foo",
"bar",
"")));
1118 ast_variable_list_append(&vars, new_var);
1119 ast_test_validate(test, (new_var = ast_variable_new(
"bar",
"baz",
"")));
1120 ast_variable_list_append(&vars, new_var);
1126 ast_test_validate(test, !strcmp(
"bar", value));
1128 ast_test_validate(test, !strcmp(
"baz", value));
1135 ast_test_validate(test, !strcmp(
"baz", value));
1141 ast_test_validate(test, !strcmp(
"baz", value));
1147 ast_test_validate(test, !strcmp(
"baz", value));
1149 return AST_TEST_PASS;
1156 RAII_VAR(
char *, str, NULL, json_debug_free);
1160 info->
name =
"dump_load_string";
1162 info->
summary =
"Testing dumping strings from JSON.";
1163 info->
description =
"Test JSON abstraction library.";
1164 return AST_TEST_NOT_RUN;
1170 ast_test_validate(test, NULL != str);
1172 ast_test_validate(test, NULL != uut);
1178 return AST_TEST_PASS;
1190 info->
name =
"dump_load_str";
1192 info->
summary =
"Testing dumping ast_str from JSON.";
1193 info->
description =
"Test JSON abstraction library.";
1194 return AST_TEST_NOT_RUN;
1202 uut_res = ast_json_dump_str(expected, &astr);
1203 ast_test_validate(test, 0 == uut_res);
1205 ast_test_validate(test, NULL != uut);
1208 return AST_TEST_PASS;
1220 info->
name =
"dump_str_fail";
1222 info->
summary =
"Testing dumping to ast_str when it can't grow.";
1223 info->
description =
"Test JSON abstraction library.";
1224 return AST_TEST_NOT_RUN;
1231 astr = ast_str_alloca(1);
1232 uut_res = ast_json_dump_str(expected, &astr);
1233 ast_test_validate(test, 0 != uut_res);
1235 return AST_TEST_PASS;
1245 info->
name =
"load_buffer";
1247 info->
summary =
"Testing loading JSON from buffer.";
1248 info->
description =
"Test JSON abstraction library.";
1249 return AST_TEST_NOT_RUN;
1255 str =
"{ \"one\": 1 } trailing garbage";
1257 ast_test_validate(test, NULL == uut);
1259 ast_test_validate(test, NULL != uut);
1261 return AST_TEST_PASS;
1277 char filename[] =
"/tmp/ast_json.XXXXXX";
1278 RAII_VAR(
char *, rm_on_exit, filename, unlink);
1284 info->
name =
"dump_load_file";
1286 info->
summary =
"Testing dumping/loading JSON to/from file by FILE *.";
1287 info->
description =
"Test JSON abstraction library.";
1288 return AST_TEST_NOT_RUN;
1296 ast_test_validate(test, NULL != file);
1297 uut_res = ast_json_dump_file(expected, file);
1298 ast_test_validate(test, 0 == uut_res);
1300 file = fopen(filename,
"r");
1301 ast_test_validate(test, NULL != file);
1305 return AST_TEST_PASS;
1312 char filename[] =
"/tmp/ast_json.XXXXXX";
1313 RAII_VAR(
char *, rm_on_exit, filename, unlink);
1319 info->
name =
"dump_load_new_file";
1321 info->
summary =
"Testing dumping/load JSON to/from file by filename.";
1322 info->
description =
"Test JSON abstraction library.";
1323 return AST_TEST_NOT_RUN;
1331 ast_test_validate(test, NULL != file);
1332 uut_res = ast_json_dump_new_file(expected, filename);
1333 ast_test_validate(test, 0 == uut_res);
1337 return AST_TEST_PASS;
1343 char filename[] =
"/tmp/ast_json.XXXXXX";
1344 RAII_VAR(
char *, rm_on_exit, filename, unlink);
1349 info->
name =
"dump_load_null";
1351 info->
summary =
"Testing NULL handling of dump/load functions.";
1352 info->
description =
"Test JSON abstraction library.";
1353 return AST_TEST_NOT_RUN;
1360 ast_test_validate(test, NULL != uut);
1362 ast_test_validate(test, NULL != file);
1364 ast_test_validate(test, -1 == ast_json_dump_file(NULL, file));
1365 ast_test_validate(test, -1 == ast_json_dump_file(uut, NULL));
1366 ast_test_validate(test, -1 == ast_json_dump_file(NULL, NULL));
1367 ast_test_validate(test, -1 == ast_json_dump_new_file(uut, NULL));
1368 ast_test_validate(test, -1 == ast_json_dump_new_file(NULL, filename));
1369 ast_test_validate(test, -1 == ast_json_dump_new_file(NULL, NULL));
1375 return AST_TEST_PASS;
1384 info->
name =
"parse_errors";
1386 info->
summary =
"Testing various parse errors.";
1387 info->
description =
"Test JSON abstraction library.";
1388 return AST_TEST_NOT_RUN;
1403 return AST_TEST_PASS;
1413 info->
name =
"pack";
1415 info->
summary =
"Testing json_pack function.";
1416 info->
description =
"Test JSON abstraction library.";
1417 return AST_TEST_NOT_RUN;
1430 ast_test_validate(test, NULL != uut);
1433 return AST_TEST_PASS;
1442 info->
name =
"pack_ownership";
1444 info->
summary =
"Testing json_pack failure conditions.";
1445 info->
description =
"Test JSON abstraction library.";
1446 return AST_TEST_NOT_RUN;
1453 return AST_TEST_PASS;
1462 info->
name =
"object_alloc";
1464 info->
summary =
"Testing json_pack failure conditions.";
1465 info->
description =
"Test JSON abstraction library.";
1466 return AST_TEST_NOT_RUN;
1473 ast_test_validate(test, NULL ==
ast_json_pack(
"{s:i",
"no curly", 911));
1474 ast_test_validate(test, NULL ==
ast_json_pack(
"[s, s",
"no",
"square"));
1476 return AST_TEST_PASS;
1486 info->
name =
"copy";
1488 info->
summary =
"Testing copying JSON.";
1489 info->
description =
"Test JSON abstraction library.";
1490 return AST_TEST_NOT_RUN;
1496 expected =
ast_json_pack(
"{s: {s: i}}",
"outer",
"inner", 8675309);
1498 ast_test_validate(test, NULL != uut);
1502 return AST_TEST_PASS;
1512 info->
name =
"deep_copy";
1514 info->
summary =
"Testing deep copying of JSON.";
1515 info->
description =
"Test JSON abstraction library.";
1516 return AST_TEST_NOT_RUN;
1522 expected =
ast_json_pack(
"{s: {s: i}}",
"outer",
"inner", 8675309);
1524 ast_test_validate(test, NULL != uut);
1531 return AST_TEST_PASS;
1538 info->
name =
"copy_null";
1540 info->
summary =
"Testing NULL handling of copy functions.";
1541 info->
description =
"Test JSON abstraction library.";
1542 return AST_TEST_NOT_RUN;
1551 return AST_TEST_PASS;
1561 info->
name =
"circular_object";
1563 info->
summary =
"Object cannot be added to itself.";
1564 info->
description =
"Test JSON abstraction library.";
1565 return AST_TEST_NOT_RUN;
1574 ast_test_validate(test, -1 == uut_res);
1577 return AST_TEST_PASS;
1587 info->
name =
"circular_array";
1589 info->
summary =
"Array cannot be added to itself.";
1590 info->
description =
"Test JSON abstraction library.";
1591 return AST_TEST_NOT_RUN;
1599 ast_test_validate(test, -1 == uut_res);
1602 return AST_TEST_PASS;
1609 RAII_VAR(
char *, str, NULL, json_debug_free);
1614 info->
name =
"clever_circle";
1616 info->
summary =
"JSON with circular references cannot be encoded.";
1617 info->
description =
"Test JSON abstraction library.";
1618 return AST_TEST_NOT_RUN;
1627 ast_test_validate(test, 0 == uut_res);
1629 ast_test_validate(test, 0 == uut_res);
1631 ast_test_validate(test, NULL == str);
1635 return AST_TEST_PASS;
1638 static int test_name_number(
const char *name,
const char *
number)
1646 "number", number ?:
"");
1660 info->
name =
"name_number";
1662 info->
summary =
"JSON encoding of name/number pair.";
1663 info->
description =
"Test JSON abstraction library.";
1664 return AST_TEST_NOT_RUN;
1669 ast_test_validate(test, test_name_number(
"name", NULL));
1670 ast_test_validate(test, test_name_number(NULL,
"1234"));
1671 ast_test_validate(test, test_name_number(NULL, NULL));
1672 ast_test_validate(test, test_name_number(
"Jenny",
"867-5309"));
1674 return AST_TEST_PASS;
1681 struct timeval tv = {};
1685 info->
name =
"type_timeval";
1687 info->
summary =
"JSON encoding of timevals.";
1688 info->
description =
"Test JSON abstraction library.";
1689 return AST_TEST_NOT_RUN;
1696 tv.tv_sec = 1360251154;
1697 tv.tv_usec = 314159;
1702 return AST_TEST_PASS;
1714 info->
summary =
"JSON with circular references cannot be encoded.";
1715 info->
description =
"Test JSON abstraction library.";
1716 return AST_TEST_NOT_RUN;
1743 return AST_TEST_PASS;
1746 static int unload_module(
void)
1748 AST_TEST_UNREGISTER(json_test_false);
1749 AST_TEST_UNREGISTER(json_test_true);
1750 AST_TEST_UNREGISTER(json_test_bool0);
1751 AST_TEST_UNREGISTER(json_test_bool1);
1752 AST_TEST_UNREGISTER(json_test_null);
1753 AST_TEST_UNREGISTER(json_test_null_val);
1754 AST_TEST_UNREGISTER(json_test_string);
1755 AST_TEST_UNREGISTER(json_test_string_null);
1756 AST_TEST_UNREGISTER(json_test_stringf);
1757 AST_TEST_UNREGISTER(json_test_int);
1758 AST_TEST_UNREGISTER(json_test_non_int);
1759 AST_TEST_UNREGISTER(json_test_array_create);
1760 AST_TEST_UNREGISTER(json_test_array_append);
1761 AST_TEST_UNREGISTER(json_test_array_inset);
1762 AST_TEST_UNREGISTER(json_test_array_set);
1763 AST_TEST_UNREGISTER(json_test_array_remove);
1764 AST_TEST_UNREGISTER(json_test_array_clear);
1765 AST_TEST_UNREGISTER(json_test_array_extend);
1766 AST_TEST_UNREGISTER(json_test_array_null);
1767 AST_TEST_UNREGISTER(json_test_object_alloc);
1768 AST_TEST_UNREGISTER(json_test_object_set);
1769 AST_TEST_UNREGISTER(json_test_object_set_overwrite);
1770 AST_TEST_UNREGISTER(json_test_object_get);
1771 AST_TEST_UNREGISTER(json_test_object_del);
1772 AST_TEST_UNREGISTER(json_test_object_clear);
1773 AST_TEST_UNREGISTER(json_test_object_merge_all);
1774 AST_TEST_UNREGISTER(json_test_object_merge_existing);
1775 AST_TEST_UNREGISTER(json_test_object_merge_missing);
1776 AST_TEST_UNREGISTER(json_test_object_null);
1777 AST_TEST_UNREGISTER(json_test_object_iter);
1778 AST_TEST_UNREGISTER(json_test_object_iter_null);
1779 AST_TEST_UNREGISTER(json_test_object_create_vars);
1780 AST_TEST_UNREGISTER(json_test_dump_load_string);
1781 AST_TEST_UNREGISTER(json_test_dump_load_str);
1782 AST_TEST_UNREGISTER(json_test_dump_str_fail);
1783 AST_TEST_UNREGISTER(json_test_load_buffer);
1784 AST_TEST_UNREGISTER(json_test_dump_load_file);
1785 AST_TEST_UNREGISTER(json_test_dump_load_new_file);
1786 AST_TEST_UNREGISTER(json_test_dump_load_null);
1787 AST_TEST_UNREGISTER(json_test_parse_errors);
1788 AST_TEST_UNREGISTER(json_test_pack);
1789 AST_TEST_UNREGISTER(json_test_pack_ownership);
1790 AST_TEST_UNREGISTER(json_test_pack_errors);
1791 AST_TEST_UNREGISTER(json_test_copy);
1792 AST_TEST_UNREGISTER(json_test_deep_copy);
1793 AST_TEST_UNREGISTER(json_test_copy_null);
1794 AST_TEST_UNREGISTER(json_test_circular_object);
1795 AST_TEST_UNREGISTER(json_test_circular_array);
1796 AST_TEST_UNREGISTER(json_test_clever_circle);
1797 AST_TEST_UNREGISTER(json_test_name_number);
1798 AST_TEST_UNREGISTER(json_test_timeval);
1799 AST_TEST_UNREGISTER(json_test_cep);
1803 static int load_module(
void)
1805 AST_TEST_REGISTER(json_test_false);
1806 AST_TEST_REGISTER(json_test_true);
1807 AST_TEST_REGISTER(json_test_bool0);
1808 AST_TEST_REGISTER(json_test_bool1);
1809 AST_TEST_REGISTER(json_test_null);
1810 AST_TEST_REGISTER(json_test_null_val);
1811 AST_TEST_REGISTER(json_test_string);
1812 AST_TEST_REGISTER(json_test_string_null);
1813 AST_TEST_REGISTER(json_test_stringf);
1814 AST_TEST_REGISTER(json_test_int);
1815 AST_TEST_REGISTER(json_test_non_int);
1816 AST_TEST_REGISTER(json_test_array_create);
1817 AST_TEST_REGISTER(json_test_array_append);
1818 AST_TEST_REGISTER(json_test_array_inset);
1819 AST_TEST_REGISTER(json_test_array_set);
1820 AST_TEST_REGISTER(json_test_array_remove);
1821 AST_TEST_REGISTER(json_test_array_clear);
1822 AST_TEST_REGISTER(json_test_array_extend);
1823 AST_TEST_REGISTER(json_test_array_null);
1824 AST_TEST_REGISTER(json_test_object_alloc);
1825 AST_TEST_REGISTER(json_test_object_set);
1826 AST_TEST_REGISTER(json_test_object_set_overwrite);
1827 AST_TEST_REGISTER(json_test_object_get);
1828 AST_TEST_REGISTER(json_test_object_del);
1829 AST_TEST_REGISTER(json_test_object_clear);
1830 AST_TEST_REGISTER(json_test_object_merge_all);
1831 AST_TEST_REGISTER(json_test_object_merge_existing);
1832 AST_TEST_REGISTER(json_test_object_merge_missing);
1833 AST_TEST_REGISTER(json_test_object_null);
1834 AST_TEST_REGISTER(json_test_object_iter);
1835 AST_TEST_REGISTER(json_test_object_iter_null);
1836 AST_TEST_REGISTER(json_test_object_create_vars);
1837 AST_TEST_REGISTER(json_test_dump_load_string);
1838 AST_TEST_REGISTER(json_test_dump_load_str);
1839 AST_TEST_REGISTER(json_test_dump_str_fail);
1840 AST_TEST_REGISTER(json_test_load_buffer);
1841 AST_TEST_REGISTER(json_test_dump_load_file);
1842 AST_TEST_REGISTER(json_test_dump_load_new_file);
1843 AST_TEST_REGISTER(json_test_dump_load_null);
1844 AST_TEST_REGISTER(json_test_parse_errors);
1845 AST_TEST_REGISTER(json_test_pack);
1846 AST_TEST_REGISTER(json_test_pack_ownership);
1847 AST_TEST_REGISTER(json_test_pack_errors);
1848 AST_TEST_REGISTER(json_test_copy);
1849 AST_TEST_REGISTER(json_test_deep_copy);
1850 AST_TEST_REGISTER(json_test_copy_null);
1851 AST_TEST_REGISTER(json_test_circular_object);
1852 AST_TEST_REGISTER(json_test_circular_array);
1853 AST_TEST_REGISTER(json_test_clever_circle);
1854 AST_TEST_REGISTER(json_test_name_number);
1855 AST_TEST_REGISTER(json_test_timeval);
1856 AST_TEST_REGISTER(json_test_cep);
1858 ast_test_register_init(
CATEGORY, json_test_init);
1859 ast_test_register_cleanup(
CATEGORY, json_test_cleanup);
1865 .support_level = AST_MODULE_SUPPORT_CORE,
1866 .load = load_module,
1867 .unload = unload_module
int ast_json_array_extend(struct ast_json *array, struct ast_json *tail)
Append all elements from tail to array.
Contains all the initialization information required to store a new test definition.
const char * summary
Short summary of test.
struct ast_json * ast_json_ref(struct ast_json *value)
Increase refcount on value.
Asterisk main include file. File version handling, generic pbx functions.
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
struct ast_json * ast_json_load_buf(const char *buffer, size_t buflen, struct ast_json_error *error)
Parse buffer with known length into a JSON object or array.
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
size_t ast_json_object_size(struct ast_json *object)
Get size of JSON object.
int ast_json_array_set(struct ast_json *array, size_t index, struct ast_json *value)
Change an element in an array.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
int ast_json_object_clear(struct ast_json *object)
Delete all elements from a JSON object.
int ast_json_array_clear(struct ast_json *array)
Remove all elements from an array.
Iterator for JSON object key/values.
int ast_json_object_update(struct ast_json *object, struct ast_json *other)
Update object with all of the fields of other.
int ast_json_object_update_existing(struct ast_json *object, struct ast_json *other)
Update existing fields in object with the fields of other.
int ast_json_object_del(struct ast_json *object, const char *key)
Delete a field from a JSON object.
void ast_json_free(void *p)
Asterisk's custom JSON allocator. Exposed for use by unit tests.
struct ast_json_iter * ast_json_object_iter(struct ast_json *object)
Get an iterator pointing to the first field in a JSON object.
int ast_json_is_true(const struct ast_json *value)
Check if value is JSON true.
Structure for variables, used for configurations and for channel variables.
#define ast_json_dump_string(root)
Encode a JSON value to a compact string.
struct ast_json * ast_json_stringf(const char *format,...)
Create a JSON string, printf style.
struct ast_json * ast_json_load_string(const char *input, struct ast_json_error *error)
Parse null terminated string into a JSON object or array.
struct ast_json * ast_json_load_str(const struct ast_str *input, struct ast_json_error *error)
Parse ast_str into a JSON object or array.
Generic File Format Support. Should be included by clients of the file handling routines. File service providers should instead include mod_format.h.
int ast_json_is_null(const struct ast_json *value)
Check if value is JSON null.
int ast_json_array_insert(struct ast_json *array, size_t index, struct ast_json *value)
Insert into an array.
int ast_json_object_set(struct ast_json *object, const char *key, struct ast_json *value)
Set a field in a JSON object.
struct ast_json * ast_json_dialplan_cep_app(const char *context, const char *exten, int priority, const char *app_name, const char *app_data)
Construct a context/exten/priority/application/application_data as JSON.
struct ast_json * ast_json_null(void)
Get the JSON null value.
Configuration File Parser.
struct ast_json * ast_json_name_number(const char *name, const char *number)
Common JSON rendering functions for common 'objects'.
Asterisk JSON abstraction layer.
struct ast_json * ast_json_object_iter_value(struct ast_json_iter *iter)
Get the value from an iterator.
struct ast_json * ast_json_string_create(const char *value)
Construct a JSON string from value.
int ast_json_object_iter_set(struct ast_json *object, struct ast_json_iter *iter, struct ast_json *value)
Set the value of the field pointed to by an iterator.
#define ast_json_object_string_get(object, key)
Get a string field from a JSON object.
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
const char * ast_json_object_iter_key(struct ast_json_iter *iter)
Get the key from an iterator.
const char * description
More detailed description of test.
const char * name
name of test, unique to category
int ast_json_is_false(const struct ast_json *value)
Check if value is JSON false.
struct ast_json * ast_json_array_create(void)
Create a empty JSON array.
struct ast_json * ast_json_timeval(const struct timeval tv, const char *zone)
Construct a timeval as JSON.
int ast_json_array_append(struct ast_json *array, struct ast_json *value)
Append to an array.
struct ast_json * ast_json_object_create_vars(const struct ast_variable *variables, const char *excludes)
Create a new JSON object using the given variables.
static size_t alloc_count
struct ast_json * ast_json_load_new_file(const char *path, struct ast_json_error *error)
Parse file at path into JSON object or array.
Support for dynamic strings.
int ast_json_integer_set(struct ast_json *integer, intmax_t value)
Set the value of a JSON integer.
const char * category
test category
int ast_json_array_remove(struct ast_json *array, size_t index)
Remove an element from an array.
void ast_json_set_alloc_funcs(void *(*malloc_fn)(size_t), void(*free_fn)(void *))
Set custom allocators instead of the standard ast_malloc() and ast_free().
struct ast_json * ast_json_load_file(FILE *input, struct ast_json_error *error)
Parse a FILE into JSON object or array.
enum ast_json_type ast_json_typeof(const struct ast_json *value)
Get the type of value.
int ast_json_object_update_missing(struct ast_json *object, struct ast_json *other)
Add new fields to object with the fields of other.
struct ast_json * ast_json_object_create(void)
Create a new JSON object.
struct ast_json * ast_json_false(void)
Get the JSON false value.
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
int ast_json_equal(const struct ast_json *lhs, const struct ast_json *rhs)
Compare two JSON objects.
FILE * ast_file_mkftemp(char *template_name, mode_t mode)
same as mkstemp, but return a FILE
size_t ast_json_array_size(const struct ast_json *array)
Get the size of a JSON array.
#define AST_TEST_DEFINE(hdr)
Abstract JSON element (object, array, string, int, ...).
struct ast_json * ast_json_boolean(int value)
Get the JSON boolean corresponding to value.
static void * json_debug_malloc(size_t size)
void * ast_json_malloc(size_t size)
Asterisk's custom JSON allocator. Exposed for use by unit tests.
struct ast_json_iter * ast_json_object_iter_at(struct ast_json *object, const char *key)
Get an iterator pointing to a specified key in object.
int ast_json_string_set(struct ast_json *string, const char *value)
Change the value of a JSON string.
#define ASTERISK_GPL_KEY
The text the key() function should return.
Asterisk module definitions.
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
struct ast_json * ast_json_array_get(const struct ast_json *array, size_t index)
Get an element from an array.
static int safe_fclose(FILE *f)
fclose isn't NULL safe.
struct ast_json * ast_json_copy(const struct ast_json *value)
Copy a JSON value, but not its children.
void ast_json_reset_alloc_funcs(void)
Change alloc funcs back to the resource module defaults.
struct ast_json * ast_json_true(void)
Get the JSON true value.
struct ast_json * ast_json_deep_copy(const struct ast_json *value)
Copy a JSON value, and its children.
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
struct ast_json_iter * ast_json_object_iter_next(struct ast_json *object, struct ast_json_iter *iter)
Get the next iterator.
struct ast_json * ast_json_integer_create(intmax_t value)
Create a JSON integer.