LCOV - code coverage report
Current view: top level - test - test-json.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 246 246 100.0 %
Date: 2019-08-23 13:36:53 Functions: 9 9 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 171 314 54.5 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include <math.h>
       4                 :            : 
       5                 :            : #include "alloc-util.h"
       6                 :            : #include "fd-util.h"
       7                 :            : #include "fileio.h"
       8                 :            : #include "json-internal.h"
       9                 :            : #include "json.h"
      10                 :            : #include "string-util.h"
      11                 :            : #include "strv.h"
      12                 :            : #include "tests.h"
      13                 :            : #include "util.h"
      14                 :            : 
      15                 :        140 : static void test_tokenizer(const char *data, ...) {
      16                 :        140 :         unsigned line = 0, column = 0;
      17                 :        140 :         void *state = NULL;
      18                 :            :         va_list ap;
      19                 :            : 
      20                 :        140 :         va_start(ap, data);
      21                 :            : 
      22                 :        204 :         for (;;) {
      23                 :            :                 unsigned token_line, token_column;
      24         [ +  + ]:        344 :                 _cleanup_free_ char *str = NULL;
      25                 :        344 :                 JsonValue v = JSON_VALUE_NULL;
      26                 :            :                 int t, tt;
      27                 :            : 
      28                 :        344 :                 t = json_tokenize(&data, &str, &v, &token_line, &token_column, &state, &line, &column);
      29                 :        344 :                 tt = va_arg(ap, int);
      30                 :            : 
      31         [ -  + ]:        344 :                 assert_se(t == tt);
      32                 :            : 
      33   [ +  +  +  + ]:        344 :                 if (t == JSON_TOKEN_END || t < 0)
      34                 :            :                         break;
      35                 :            : 
      36         [ +  + ]:        204 :                 else if (t == JSON_TOKEN_STRING) {
      37                 :            :                         const char *nn;
      38                 :            : 
      39                 :         36 :                         nn = va_arg(ap, const char *);
      40         [ -  + ]:         36 :                         assert_se(streq_ptr(nn, str));
      41                 :            : 
      42         [ +  + ]:        168 :                 } else if (t == JSON_TOKEN_REAL) {
      43                 :            :                         long double d;
      44                 :            : 
      45                 :         24 :                         d = va_arg(ap, long double);
      46                 :            : 
      47                 :            :                         /* Valgrind doesn't support long double calculations and automatically downgrades to 80bit:
      48                 :            :                          * http://www.valgrind.org/docs/manual/manual-core.html#manual-core.limits.
      49                 :            :                          * Some architectures might not support long double either.
      50                 :            :                          */
      51                 :            : 
      52   [ -  +  #  # ]:         24 :                         assert_se(fabsl(d - v.real) < 1e-10 ||
      53                 :            :                                   fabsl((d - v.real) / v.real) < 1e-10);
      54                 :            : 
      55         [ +  + ]:        144 :                 } else if (t == JSON_TOKEN_INTEGER) {
      56                 :            :                         intmax_t i;
      57                 :            : 
      58                 :         20 :                         i = va_arg(ap, intmax_t);
      59         [ -  + ]:         20 :                         assert_se(i == v.integer);
      60                 :            : 
      61         [ +  + ]:        124 :                 } else if (t == JSON_TOKEN_UNSIGNED) {
      62                 :            :                         uintmax_t u;
      63                 :            : 
      64                 :         20 :                         u = va_arg(ap, uintmax_t);
      65         [ -  + ]:         20 :                         assert_se(u == v.unsig);
      66                 :            : 
      67         [ +  + ]:        104 :                 } else if (t == JSON_TOKEN_BOOLEAN) {
      68                 :            :                         bool b;
      69                 :            : 
      70                 :         16 :                         b = va_arg(ap, int);
      71         [ -  + ]:         16 :                         assert_se(b == v.boolean);
      72                 :            :                 }
      73                 :            :         }
      74                 :            : 
      75                 :        140 :         va_end(ap);
      76                 :        140 : }
      77                 :            : 
      78                 :            : typedef void (*Test)(JsonVariant *);
      79                 :            : 
      80                 :         16 : static void test_variant(const char *data, Test test) {
      81                 :         16 :         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL, *w = NULL;
      82                 :         16 :         _cleanup_free_ char *s = NULL;
      83                 :            :         int r;
      84                 :            : 
      85                 :         16 :         r = json_parse(data, &v, NULL, NULL);
      86         [ -  + ]:         16 :         assert_se(r == 0);
      87         [ -  + ]:         16 :         assert_se(v);
      88                 :            : 
      89                 :         16 :         r = json_variant_format(v, 0, &s);
      90         [ -  + ]:         16 :         assert_se(r >= 0);
      91         [ -  + ]:         16 :         assert_se(s);
      92         [ -  + ]:         16 :         assert_se((size_t) r == strlen(s));
      93                 :            : 
      94         [ +  - ]:         16 :         log_info("formatted normally: %s\n", s);
      95                 :            : 
      96                 :         16 :         r = json_parse(data, &w, NULL, NULL);
      97         [ -  + ]:         16 :         assert_se(r == 0);
      98         [ -  + ]:         16 :         assert_se(w);
      99         [ -  + ]:         16 :         assert_se(json_variant_has_type(v, json_variant_type(w)));
     100         [ -  + ]:         16 :         assert_se(json_variant_has_type(w, json_variant_type(v)));
     101         [ -  + ]:         16 :         assert_se(json_variant_equal(v, w));
     102                 :            : 
     103                 :         16 :         s = mfree(s);
     104                 :         16 :         w = json_variant_unref(w);
     105                 :            : 
     106                 :         16 :         r = json_variant_format(v, JSON_FORMAT_PRETTY, &s);
     107         [ -  + ]:         16 :         assert_se(r >= 0);
     108         [ -  + ]:         16 :         assert_se(s);
     109         [ -  + ]:         16 :         assert_se((size_t) r == strlen(s));
     110                 :            : 
     111         [ +  - ]:         16 :         log_info("formatted prettily:\n%s", s);
     112                 :            : 
     113                 :         16 :         r = json_parse(data, &w, NULL, NULL);
     114         [ -  + ]:         16 :         assert_se(r == 0);
     115         [ -  + ]:         16 :         assert_se(w);
     116                 :            : 
     117         [ -  + ]:         16 :         assert_se(json_variant_has_type(v, json_variant_type(w)));
     118         [ -  + ]:         16 :         assert_se(json_variant_has_type(w, json_variant_type(v)));
     119         [ -  + ]:         16 :         assert_se(json_variant_equal(v, w));
     120                 :            : 
     121                 :         16 :         s = mfree(s);
     122                 :         16 :         r = json_variant_format(v, JSON_FORMAT_COLOR, &s);
     123         [ -  + ]:         16 :         assert_se(r >= 0);
     124         [ -  + ]:         16 :         assert_se(s);
     125         [ -  + ]:         16 :         assert_se((size_t) r == strlen(s));
     126                 :         16 :         printf("Normal with color: %s\n", s);
     127                 :            : 
     128                 :         16 :         s = mfree(s);
     129                 :         16 :         r = json_variant_format(v, JSON_FORMAT_COLOR|JSON_FORMAT_PRETTY, &s);
     130         [ -  + ]:         16 :         assert_se(r >= 0);
     131         [ -  + ]:         16 :         assert_se(s);
     132         [ -  + ]:         16 :         assert_se((size_t) r == strlen(s));
     133                 :         16 :         printf("Pretty with color:\n%s\n", s);
     134                 :            : 
     135         [ +  + ]:         16 :         if (test)
     136                 :         12 :                 test(v);
     137                 :         16 : }
     138                 :            : 
     139                 :          4 : static void test_1(JsonVariant *v) {
     140                 :            :         JsonVariant *p, *q;
     141                 :            :         unsigned i;
     142                 :            : 
     143                 :            :         /* 3 keys + 3 values */
     144         [ -  + ]:          4 :         assert_se(json_variant_elements(v) == 6);
     145                 :            : 
     146                 :            :         /* has k */
     147                 :          4 :         p = json_variant_by_key(v, "k");
     148   [ +  -  -  + ]:          4 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_STRING);
     149                 :            : 
     150                 :            :         /* k equals v */
     151         [ -  + ]:          4 :         assert_se(streq(json_variant_string(p), "v"));
     152                 :            : 
     153                 :            :         /* has foo */
     154                 :          4 :         p = json_variant_by_key(v, "foo");
     155   [ +  -  -  +  :          4 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_ARRAY && json_variant_elements(p) == 3);
             +  -  -  + ]
     156                 :            : 
     157                 :            :         /* check  foo[0] = 1, foo[1] = 2, foo[2] = 3 */
     158         [ +  + ]:         16 :         for (i = 0; i < 3; ++i) {
     159                 :         12 :                 q = json_variant_by_index(p, i);
     160   [ +  -  -  +  :         12 :                 assert_se(q && json_variant_type(q) == JSON_VARIANT_UNSIGNED && json_variant_unsigned(q) == (i+1));
             +  -  -  + ]
     161   [ +  -  -  +  :         12 :                 assert_se(q && json_variant_has_type(q, JSON_VARIANT_INTEGER) && json_variant_integer(q) == (i+1));
             +  -  -  + ]
     162                 :            :         }
     163                 :            : 
     164                 :            :         /* has bar */
     165                 :          4 :         p = json_variant_by_key(v, "bar");
     166   [ +  -  -  +  :          4 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_OBJECT && json_variant_elements(p) == 2);
             +  -  -  + ]
     167                 :            : 
     168                 :            :         /* zap is null */
     169                 :          4 :         q = json_variant_by_key(p, "zap");
     170   [ +  -  -  + ]:          4 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_NULL);
     171                 :          4 : }
     172                 :            : 
     173                 :          4 : static void test_2(JsonVariant *v) {
     174                 :            :         JsonVariant *p, *q;
     175                 :            : 
     176                 :            :         /* 2 keys + 2 values */
     177         [ -  + ]:          4 :         assert_se(json_variant_elements(v) == 4);
     178                 :            : 
     179                 :            :         /* has mutant */
     180                 :          4 :         p = json_variant_by_key(v, "mutant");
     181   [ +  -  -  +  :          4 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_ARRAY && json_variant_elements(p) == 4);
             +  -  -  + ]
     182                 :            : 
     183                 :            :         /* mutant[0] == 1 */
     184                 :          4 :         q = json_variant_by_index(p, 0);
     185   [ +  -  -  +  :          4 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_UNSIGNED && json_variant_unsigned(q) == 1);
             +  -  -  + ]
     186   [ +  -  -  +  :          4 :         assert_se(q && json_variant_has_type(q, JSON_VARIANT_INTEGER) && json_variant_integer(q) == 1);
             +  -  -  + ]
     187                 :            : 
     188                 :            :         /* mutant[1] == null */
     189                 :          4 :         q = json_variant_by_index(p, 1);
     190   [ +  -  -  + ]:          4 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_NULL);
     191                 :            : 
     192                 :            :         /* mutant[2] == "1" */
     193                 :          4 :         q = json_variant_by_index(p, 2);
     194   [ +  -  -  +  :          4 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_STRING && streq(json_variant_string(q), "1"));
             +  -  -  + ]
     195                 :            : 
     196                 :            :         /* mutant[3] == JSON_VARIANT_OBJECT */
     197                 :          4 :         q = json_variant_by_index(p, 3);
     198   [ +  -  -  +  :          4 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_OBJECT && json_variant_elements(q) == 2);
             +  -  -  + ]
     199                 :            : 
     200                 :            :         /* has 1 */
     201                 :          4 :         p = json_variant_by_key(q, "1");
     202   [ +  -  -  +  :          4 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_ARRAY && json_variant_elements(p) == 2);
             +  -  -  + ]
     203                 :            : 
     204                 :            :         /* "1"[0] == 1 */
     205                 :          4 :         q = json_variant_by_index(p, 0);
     206   [ +  -  -  +  :          4 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_UNSIGNED && json_variant_unsigned(q) == 1);
             +  -  -  + ]
     207   [ +  -  -  +  :          4 :         assert_se(q && json_variant_has_type(q, JSON_VARIANT_INTEGER) && json_variant_integer(q) == 1);
             +  -  -  + ]
     208                 :            : 
     209                 :            :         /* "1"[1] == "1" */
     210                 :          4 :         q = json_variant_by_index(p, 1);
     211   [ +  -  -  +  :          4 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_STRING && streq(json_variant_string(q), "1"));
             +  -  -  + ]
     212                 :            : 
     213                 :            :         /* has thisisaverylongproperty */
     214                 :          4 :         p = json_variant_by_key(v, "thisisaverylongproperty");
     215   [ +  -  -  +  :          4 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_REAL && fabsl(json_variant_real(p) - 1.27) < 0.001);
             +  -  -  + ]
     216                 :          4 : }
     217                 :            : 
     218                 :          4 : static void test_zeroes(JsonVariant *v) {
     219                 :            :         size_t i;
     220                 :            : 
     221                 :            :         /* Make sure zero is how we expect it. */
     222                 :            : 
     223         [ -  + ]:          4 :         assert_se(json_variant_elements(v) == 13);
     224                 :            : 
     225         [ +  + ]:         56 :         for (i = 0; i < json_variant_elements(v); i++) {
     226                 :            :                 JsonVariant *w;
     227                 :            :                 size_t j;
     228                 :            : 
     229         [ -  + ]:         52 :                 assert_se(w = json_variant_by_index(v, i));
     230                 :            : 
     231         [ -  + ]:         52 :                 assert_se(json_variant_integer(w) == 0);
     232         [ -  + ]:         52 :                 assert_se(json_variant_unsigned(w) == 0U);
     233                 :            : 
     234                 :            : #pragma GCC diagnostic push
     235                 :            : #pragma GCC diagnostic ignored "-Wfloat-equal"
     236         [ -  + ]:         52 :                 assert_se(json_variant_real(w) == 0.0L);
     237                 :            : #pragma GCC diagnostic pop
     238                 :            : 
     239         [ -  + ]:         52 :                 assert_se(json_variant_is_integer(w));
     240         [ -  + ]:         52 :                 assert_se(json_variant_is_unsigned(w));
     241         [ -  + ]:         52 :                 assert_se(json_variant_is_real(w));
     242         [ -  + ]:         52 :                 assert_se(json_variant_is_number(w));
     243                 :            : 
     244         [ -  + ]:         52 :                 assert_se(!json_variant_is_negative(w));
     245                 :            : 
     246   [ +  -  -  + ]:         52 :                 assert_se(IN_SET(json_variant_type(w), JSON_VARIANT_INTEGER, JSON_VARIANT_UNSIGNED, JSON_VARIANT_REAL));
     247                 :            : 
     248         [ +  + ]:        728 :                 for (j = 0; j < json_variant_elements(v); j++) {
     249                 :            :                         JsonVariant *q;
     250                 :            : 
     251         [ -  + ]:        676 :                         assert_se(q = json_variant_by_index(v, j));
     252                 :            : 
     253         [ -  + ]:        676 :                         assert_se(json_variant_equal(w, q));
     254                 :            :                 }
     255                 :            :         }
     256                 :          4 : }
     257                 :            : 
     258                 :          4 : static void test_build(void) {
     259                 :          4 :         _cleanup_(json_variant_unrefp) JsonVariant *a = NULL, *b = NULL;
     260                 :          4 :         _cleanup_free_ char *s = NULL, *t = NULL;
     261                 :            : 
     262         [ -  + ]:          4 :         assert_se(json_build(&a, JSON_BUILD_STRING("hallo")) >= 0);
     263         [ -  + ]:          4 :         assert_se(json_build(&b, JSON_BUILD_LITERAL(" \"hallo\"   ")) >= 0);
     264         [ -  + ]:          4 :         assert_se(json_variant_equal(a, b));
     265                 :            : 
     266                 :          4 :         b = json_variant_unref(b);
     267                 :            : 
     268         [ -  + ]:          4 :         assert_se(json_build(&b, JSON_BUILD_VARIANT(a)) >= 0);
     269         [ -  + ]:          4 :         assert_se(json_variant_equal(a, b));
     270                 :            : 
     271                 :          4 :         b = json_variant_unref(b);
     272         [ -  + ]:          4 :         assert_se(json_build(&b, JSON_BUILD_STRING("pief")) >= 0);
     273         [ -  + ]:          4 :         assert_se(!json_variant_equal(a, b));
     274                 :            : 
     275                 :          4 :         a = json_variant_unref(a);
     276                 :          4 :         b = json_variant_unref(b);
     277                 :            : 
     278         [ -  + ]:          4 :         assert_se(json_build(&a, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("one", JSON_BUILD_INTEGER(7)),
     279                 :            :                                                    JSON_BUILD_PAIR("two", JSON_BUILD_REAL(2.0)),
     280                 :            :                                                    JSON_BUILD_PAIR("three", JSON_BUILD_INTEGER(0)))) >= 0);
     281                 :            : 
     282         [ -  + ]:          4 :         assert_se(json_build(&b, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("two", JSON_BUILD_INTEGER(2)),
     283                 :            :                                                    JSON_BUILD_PAIR("three", JSON_BUILD_REAL(0)),
     284                 :            :                                                    JSON_BUILD_PAIR("one", JSON_BUILD_REAL(7)))) >= 0);
     285                 :            : 
     286         [ -  + ]:          4 :         assert_se(json_variant_equal(a, b));
     287                 :            : 
     288                 :          4 :         a = json_variant_unref(a);
     289                 :          4 :         b = json_variant_unref(b);
     290                 :            : 
     291                 :          4 :         const char* arr_1234[] = {"one", "two", "three", "four", NULL};
     292         [ -  + ]:          4 :         assert_se(json_build(&a, JSON_BUILD_ARRAY(JSON_BUILD_OBJECT(JSON_BUILD_PAIR("x", JSON_BUILD_BOOLEAN(true)),
     293                 :            :                                                                     JSON_BUILD_PAIR("y", JSON_BUILD_OBJECT(JSON_BUILD_PAIR("this", JSON_BUILD_NULL)))),
     294                 :            :                                                   JSON_BUILD_VARIANT(NULL),
     295                 :            :                                                   JSON_BUILD_LITERAL(NULL),
     296                 :            :                                                   JSON_BUILD_STRING(NULL),
     297                 :            :                                                   JSON_BUILD_NULL,
     298                 :            :                                                   JSON_BUILD_INTEGER(77),
     299                 :            :                                                   JSON_BUILD_ARRAY(JSON_BUILD_VARIANT(JSON_VARIANT_STRING_CONST("foobar")),
     300                 :            :                                                                    JSON_BUILD_VARIANT(JSON_VARIANT_STRING_CONST("zzz"))),
     301                 :            :                                                   JSON_BUILD_STRV((char**) arr_1234))) >= 0);
     302                 :            : 
     303         [ -  + ]:          4 :         assert_se(json_variant_format(a, 0, &s) >= 0);
     304         [ +  - ]:          4 :         log_info("GOT: %s\n", s);
     305         [ -  + ]:          4 :         assert_se(json_parse(s, &b, NULL, NULL) >= 0);
     306         [ -  + ]:          4 :         assert_se(json_variant_equal(a, b));
     307                 :            : 
     308                 :          4 :         a = json_variant_unref(a);
     309                 :          4 :         b = json_variant_unref(b);
     310                 :            : 
     311         [ -  + ]:          4 :         assert_se(json_build(&a, JSON_BUILD_REAL(M_PIl)) >= 0);
     312                 :            : 
     313                 :          4 :         s = mfree(s);
     314         [ -  + ]:          4 :         assert_se(json_variant_format(a, 0, &s) >= 0);
     315         [ +  - ]:          4 :         log_info("GOT: %s\n", s);
     316         [ -  + ]:          4 :         assert_se(json_parse(s, &b, NULL, NULL) >= 0);
     317         [ -  + ]:          4 :         assert_se(json_variant_format(b, 0, &t) >= 0);
     318         [ +  - ]:          4 :         log_info("GOT: %s\n", t);
     319                 :            : 
     320         [ -  + ]:          4 :         assert_se(streq(s, t));
     321                 :            : 
     322                 :          4 :         a = json_variant_unref(a);
     323                 :          4 :         b = json_variant_unref(b);
     324                 :            : 
     325         [ -  + ]:          4 :         assert_se(json_build(&a, JSON_BUILD_OBJECT(
     326                 :            :                                              JSON_BUILD_PAIR("x", JSON_BUILD_STRING("y")),
     327                 :            :                                              JSON_BUILD_PAIR("z", JSON_BUILD_STRING("a")),
     328                 :            :                                              JSON_BUILD_PAIR("b", JSON_BUILD_STRING("c"))
     329                 :            :                              )) >= 0);
     330                 :            : 
     331         [ -  + ]:          4 :         assert_se(json_build(&b, JSON_BUILD_OBJECT(
     332                 :            :                                              JSON_BUILD_PAIR("x", JSON_BUILD_STRING("y")),
     333                 :            :                                              JSON_BUILD_PAIR_CONDITION(false, "p", JSON_BUILD_STRING("q")),
     334                 :            :                                              JSON_BUILD_PAIR_CONDITION(true, "z", JSON_BUILD_STRING("a")),
     335                 :            :                                              JSON_BUILD_PAIR_CONDITION(false, "j", JSON_BUILD_ARRAY(JSON_BUILD_STRING("k"), JSON_BUILD_STRING("u"), JSON_BUILD_STRING("i"))),
     336                 :            :                                              JSON_BUILD_PAIR("b", JSON_BUILD_STRING("c"))
     337                 :            :                              )) >= 0);
     338                 :            : 
     339         [ -  + ]:          4 :         assert_se(json_variant_equal(a, b));
     340                 :          4 : }
     341                 :            : 
     342                 :          4 : static void test_source(void) {
     343                 :            :         static const char data[] =
     344                 :            :                 "\n"
     345                 :            :                 "\n"
     346                 :            :                 "{\n"
     347                 :            :                 "\"foo\" : \"bar\", \n"
     348                 :            :                 "\"qüüx\" : [ 1, 2, 3,\n"
     349                 :            :                 "4,\n"
     350                 :            :                 "5 ],\n"
     351                 :            :                 "\"miep\" : { \"hallo\" : 1 },\n"
     352                 :            :                 "\n"
     353                 :            :                 "\"zzzzzz\" \n"
     354                 :            :                 ":\n"
     355                 :            :                 "[ true, \n"
     356                 :            :                 "false, 7.5, {} ]\n"
     357                 :            :                 "}\n";
     358                 :            : 
     359                 :          4 :         _cleanup_fclose_ FILE *f = NULL;
     360                 :          4 :         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
     361                 :            : 
     362                 :          4 :         printf("--- original begin ---\n"
     363                 :            :                "%s"
     364                 :            :                "--- original end ---\n", data);
     365                 :            : 
     366         [ -  + ]:          4 :         assert_se(f = fmemopen_unlocked((void*) data, strlen(data), "r"));
     367                 :            : 
     368         [ -  + ]:          4 :         assert_se(json_parse_file(f, "waldo", &v, NULL, NULL) >= 0);
     369                 :            : 
     370                 :          4 :         printf("--- non-pretty begin ---\n");
     371                 :          4 :         json_variant_dump(v, 0, stdout, NULL);
     372                 :          4 :         printf("\n--- non-pretty end ---\n");
     373                 :            : 
     374                 :          4 :         printf("--- pretty begin ---\n");
     375                 :          4 :         json_variant_dump(v, JSON_FORMAT_PRETTY|JSON_FORMAT_COLOR|JSON_FORMAT_SOURCE, stdout, NULL);
     376                 :          4 :         printf("--- pretty end ---\n");
     377                 :          4 : }
     378                 :            : 
     379                 :          4 : static void test_depth(void) {
     380                 :          8 :         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
     381                 :            :         unsigned i;
     382                 :            :         int r;
     383                 :            : 
     384                 :          4 :         v = JSON_VARIANT_STRING_CONST("start");
     385                 :            : 
     386                 :            :         /* Let's verify that the maximum depth checks work */
     387                 :            : 
     388                 :      16388 :         for (i = 0;; i++) {
     389         [ +  + ]:      16388 :                 _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
     390                 :            : 
     391         [ -  + ]:      16388 :                 assert_se(i <= UINT16_MAX);
     392         [ +  + ]:      16388 :                 if (i & 1)
     393                 :       8192 :                         r = json_variant_new_array(&w, &v, 1);
     394                 :            :                 else
     395                 :       8196 :                         r = json_variant_new_object(&w, (JsonVariant*[]) { JSON_VARIANT_STRING_CONST("key"), v }, 2);
     396         [ +  + ]:      16388 :                 if (r == -ELNRNG) {
     397         [ +  - ]:          4 :                         log_info("max depth at %u", i);
     398                 :          4 :                         break;
     399                 :            :                 }
     400                 :            : #if HAS_FEATURE_MEMORY_SANITIZER
     401                 :            :                 /* msan doesn't like the stack nesting to be too deep. Let's quit early. */
     402                 :            :                 if (i >= 128) {
     403                 :            :                         log_info("quitting early at depth %u", i);
     404                 :            :                         break;
     405                 :            :                 }
     406                 :            : #endif
     407                 :            : 
     408         [ -  + ]:      16384 :                 assert_se(r >= 0);
     409                 :            : 
     410                 :      16384 :                 json_variant_unref(v);
     411                 :      16384 :                 v = TAKE_PTR(w);
     412                 :            :         }
     413                 :            : 
     414                 :          4 :         json_variant_dump(v, 0, stdout, NULL);
     415                 :          4 :         fputs("\n", stdout);
     416                 :          4 : }
     417                 :            : 
     418                 :          4 : int main(int argc, char *argv[]) {
     419                 :          4 :         test_setup_logging(LOG_DEBUG);
     420                 :            : 
     421                 :          4 :         test_tokenizer("x", -EINVAL);
     422                 :          4 :         test_tokenizer("", JSON_TOKEN_END);
     423                 :          4 :         test_tokenizer(" ", JSON_TOKEN_END);
     424                 :          4 :         test_tokenizer("0", JSON_TOKEN_UNSIGNED, (uintmax_t) 0, JSON_TOKEN_END);
     425                 :          4 :         test_tokenizer("-0", JSON_TOKEN_INTEGER, (intmax_t) 0, JSON_TOKEN_END);
     426                 :          4 :         test_tokenizer("1234", JSON_TOKEN_UNSIGNED, (uintmax_t) 1234, JSON_TOKEN_END);
     427                 :          4 :         test_tokenizer("-1234", JSON_TOKEN_INTEGER, (intmax_t) -1234, JSON_TOKEN_END);
     428                 :          4 :         test_tokenizer("18446744073709551615", JSON_TOKEN_UNSIGNED, (uintmax_t) UINT64_MAX, JSON_TOKEN_END);
     429                 :          4 :         test_tokenizer("-9223372036854775808", JSON_TOKEN_INTEGER, (intmax_t) INT64_MIN, JSON_TOKEN_END);
     430                 :          4 :         test_tokenizer("18446744073709551616", JSON_TOKEN_REAL, (long double) 18446744073709551616.0L, JSON_TOKEN_END);
     431                 :          4 :         test_tokenizer("-9223372036854775809", JSON_TOKEN_REAL, (long double) -9223372036854775809.0L, JSON_TOKEN_END);
     432                 :          4 :         test_tokenizer("-1234", JSON_TOKEN_INTEGER, (intmax_t) -1234, JSON_TOKEN_END);
     433                 :          4 :         test_tokenizer("3.141", JSON_TOKEN_REAL, (long double) 3.141, JSON_TOKEN_END);
     434                 :          4 :         test_tokenizer("0.0", JSON_TOKEN_REAL, (long double) 0.0, JSON_TOKEN_END);
     435                 :          4 :         test_tokenizer("7e3", JSON_TOKEN_REAL, (long double) 7e3, JSON_TOKEN_END);
     436                 :          4 :         test_tokenizer("-7e-3", JSON_TOKEN_REAL, (long double) -7e-3, JSON_TOKEN_END);
     437                 :          4 :         test_tokenizer("true", JSON_TOKEN_BOOLEAN, true, JSON_TOKEN_END);
     438                 :          4 :         test_tokenizer("false", JSON_TOKEN_BOOLEAN, false, JSON_TOKEN_END);
     439                 :          4 :         test_tokenizer("null", JSON_TOKEN_NULL, JSON_TOKEN_END);
     440                 :          4 :         test_tokenizer("{}", JSON_TOKEN_OBJECT_OPEN, JSON_TOKEN_OBJECT_CLOSE, JSON_TOKEN_END);
     441                 :          4 :         test_tokenizer("\t {\n} \n", JSON_TOKEN_OBJECT_OPEN, JSON_TOKEN_OBJECT_CLOSE, JSON_TOKEN_END);
     442                 :          4 :         test_tokenizer("[]", JSON_TOKEN_ARRAY_OPEN, JSON_TOKEN_ARRAY_CLOSE, JSON_TOKEN_END);
     443                 :          4 :         test_tokenizer("\t [] \n\n", JSON_TOKEN_ARRAY_OPEN, JSON_TOKEN_ARRAY_CLOSE, JSON_TOKEN_END);
     444                 :          4 :         test_tokenizer("\"\"", JSON_TOKEN_STRING, "", JSON_TOKEN_END);
     445                 :          4 :         test_tokenizer("\"foo\"", JSON_TOKEN_STRING, "foo", JSON_TOKEN_END);
     446                 :          4 :         test_tokenizer("\"foo\\nfoo\"", JSON_TOKEN_STRING, "foo\nfoo", JSON_TOKEN_END);
     447                 :          4 :         test_tokenizer("{\"foo\" : \"bar\"}", JSON_TOKEN_OBJECT_OPEN, JSON_TOKEN_STRING, "foo", JSON_TOKEN_COLON, JSON_TOKEN_STRING, "bar", JSON_TOKEN_OBJECT_CLOSE, JSON_TOKEN_END);
     448                 :          4 :         test_tokenizer("{\"foo\" : [true, false]}", JSON_TOKEN_OBJECT_OPEN, JSON_TOKEN_STRING, "foo", JSON_TOKEN_COLON, JSON_TOKEN_ARRAY_OPEN, JSON_TOKEN_BOOLEAN, true, JSON_TOKEN_COMMA, JSON_TOKEN_BOOLEAN, false, JSON_TOKEN_ARRAY_CLOSE, JSON_TOKEN_OBJECT_CLOSE, JSON_TOKEN_END);
     449                 :          4 :         test_tokenizer("\"\xef\xbf\xbd\"", JSON_TOKEN_STRING, "\xef\xbf\xbd", JSON_TOKEN_END);
     450                 :          4 :         test_tokenizer("\"\\ufffd\"", JSON_TOKEN_STRING, "\xef\xbf\xbd", JSON_TOKEN_END);
     451                 :          4 :         test_tokenizer("\"\\uf\"", -EINVAL);
     452                 :          4 :         test_tokenizer("\"\\ud800a\"", -EINVAL);
     453                 :          4 :         test_tokenizer("\"\\udc00\\udc00\"", -EINVAL);
     454                 :          4 :         test_tokenizer("\"\\ud801\\udc37\"", JSON_TOKEN_STRING, "\xf0\x90\x90\xb7", JSON_TOKEN_END);
     455                 :            : 
     456                 :          4 :         test_tokenizer("[1, 2, -3]", JSON_TOKEN_ARRAY_OPEN, JSON_TOKEN_UNSIGNED, (uintmax_t) 1, JSON_TOKEN_COMMA, JSON_TOKEN_UNSIGNED, (uintmax_t) 2, JSON_TOKEN_COMMA, JSON_TOKEN_INTEGER, (intmax_t) -3, JSON_TOKEN_ARRAY_CLOSE, JSON_TOKEN_END);
     457                 :            : 
     458                 :          4 :         test_variant("{\"k\": \"v\", \"foo\": [1, 2, 3], \"bar\": {\"zap\": null}}", test_1);
     459                 :          4 :         test_variant("{\"mutant\": [1, null, \"1\", {\"1\": [1, \"1\"]}], \"thisisaverylongproperty\": 1.27}", test_2);
     460                 :          4 :         test_variant("{\"foo\" : \"\\uDBFF\\uDFFF\\\"\\uD9FF\\uDFFFFFF\\\"\\uDBFF\\uDFFF\\\"\\uD9FF\\uDFFF\\uDBFF\\uDFFFF\\uDBFF\\uDFFF\\uDBFF\\uDFFF\\uDBFF\\uDFFF\\uDBFF\\uDFFF\\\"\\uD9FF\\uDFFFFF\\\"\\uDBFF\\uDFFF\\\"\\uD9FF\\uDFFF\\uDBFF\\uDFFF\"}", NULL);
     461                 :            : 
     462                 :          4 :         test_variant("[ 0, -0, 0.0, -0.0, 0.000, -0.000, 0e0, -0e0, 0e+0, -0e-0, 0e-0, -0e000, 0e+000 ]", test_zeroes);
     463                 :            : 
     464                 :          4 :         test_build();
     465                 :            : 
     466                 :          4 :         test_source();
     467                 :            : 
     468                 :          4 :         test_depth();
     469                 :            : 
     470                 :          4 :         return 0;
     471                 :            : }

Generated by: LCOV version 1.14