1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-api-test-lejp 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2020 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 8d4afb5ceSopenharmony_ci * 9d4afb5ceSopenharmony_ci * sanity tests for lejp 10d4afb5ceSopenharmony_ci */ 11d4afb5ceSopenharmony_ci 12d4afb5ceSopenharmony_ci#include <libwebsockets.h> 13d4afb5ceSopenharmony_ci 14d4afb5ceSopenharmony_ci/* 15d4afb5ceSopenharmony_ci * in this example, the JSON is for one "builder" object, which may specify 16d4afb5ceSopenharmony_ci * a child list "targets" of zero or more "target" objects. 17d4afb5ceSopenharmony_ci */ 18d4afb5ceSopenharmony_ci 19d4afb5ceSopenharmony_cistatic const char * const json_tests[] = { 20d4afb5ceSopenharmony_ci "{" /* test 1 */ 21d4afb5ceSopenharmony_ci "\"schema\":\"com-warmcat-sai-builder\"," 22d4afb5ceSopenharmony_ci 23d4afb5ceSopenharmony_ci "\"hostname\":\"learn\"," 24d4afb5ceSopenharmony_ci "\"nspawn_timeout\":1800," 25d4afb5ceSopenharmony_ci "\"targets\":[" 26d4afb5ceSopenharmony_ci "{" 27d4afb5ceSopenharmony_ci "\"name\":\"target1\"," 28d4afb5ceSopenharmony_ci "\"someflag\":true" 29d4afb5ceSopenharmony_ci "}," 30d4afb5ceSopenharmony_ci "{" 31d4afb5ceSopenharmony_ci "\"name\":\"target2\"," 32d4afb5ceSopenharmony_ci "\"someflag\":false" 33d4afb5ceSopenharmony_ci "}" 34d4afb5ceSopenharmony_ci "]" 35d4afb5ceSopenharmony_ci "}", 36d4afb5ceSopenharmony_ci "{" /* test 2 */ 37d4afb5ceSopenharmony_ci "\"schema\":\"com-warmcat-sai-builder\"," 38d4afb5ceSopenharmony_ci 39d4afb5ceSopenharmony_ci "\"hostname\":\"learn\"," 40d4afb5ceSopenharmony_ci "\"targets\":[" 41d4afb5ceSopenharmony_ci "{" 42d4afb5ceSopenharmony_ci "\"name\":\"target1\"" 43d4afb5ceSopenharmony_ci "}," 44d4afb5ceSopenharmony_ci "{" 45d4afb5ceSopenharmony_ci "\"name\":\"target2\"" 46d4afb5ceSopenharmony_ci "}," 47d4afb5ceSopenharmony_ci "{" 48d4afb5ceSopenharmony_ci "\"name\":\"target3\"" 49d4afb5ceSopenharmony_ci "}" 50d4afb5ceSopenharmony_ci "]" 51d4afb5ceSopenharmony_ci "}", "{" /* test 3 */ 52d4afb5ceSopenharmony_ci "\"schema\":\"com-warmcat-sai-builder\"," 53d4afb5ceSopenharmony_ci 54d4afb5ceSopenharmony_ci "\"hostname\":\"learn\"," 55d4afb5ceSopenharmony_ci "\"nspawn_timeout\":1800," 56d4afb5ceSopenharmony_ci "\"targets\":[" 57d4afb5ceSopenharmony_ci "{" 58d4afb5ceSopenharmony_ci "\"name\":\"target1\"," 59d4afb5ceSopenharmony_ci "\"unrecognized\":\"xyz\"," 60d4afb5ceSopenharmony_ci "\"child\": {" 61d4afb5ceSopenharmony_ci "\"somename\": \"abc\"," 62d4afb5ceSopenharmony_ci "\"junk\": { \"x\": \"y\" }" 63d4afb5ceSopenharmony_ci "}" 64d4afb5ceSopenharmony_ci "}," 65d4afb5ceSopenharmony_ci "{" 66d4afb5ceSopenharmony_ci "\"name\":\"target2\"" 67d4afb5ceSopenharmony_ci "}" 68d4afb5ceSopenharmony_ci "]" 69d4afb5ceSopenharmony_ci "}", 70d4afb5ceSopenharmony_ci "{" /* test 4 */ 71d4afb5ceSopenharmony_ci "\"schema\":\"com-warmcat-sai-builder\"," 72d4afb5ceSopenharmony_ci 73d4afb5ceSopenharmony_ci "\"hostname\":\"learn\"," 74d4afb5ceSopenharmony_ci "\"nspawn_timeout\":1800" 75d4afb5ceSopenharmony_ci "}", 76d4afb5ceSopenharmony_ci "{" /* test 5 */ 77d4afb5ceSopenharmony_ci "\"schema\":\"com-warmcat-sai-builder\"" 78d4afb5ceSopenharmony_ci "}", 79d4afb5ceSopenharmony_ci "{" /* test 6 ... check huge strings into smaller fixed char array */ 80d4afb5ceSopenharmony_ci "\"schema\":\"com-warmcat-sai-builder\"," 81d4afb5ceSopenharmony_ci "\"hostname\":\"" 82d4afb5ceSopenharmony_ci "PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A" 83d4afb5ceSopenharmony_ci "zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/" 84d4afb5ceSopenharmony_ci "CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5" 85d4afb5ceSopenharmony_ci "3FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV" 86d4afb5ceSopenharmony_ci "8sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1" 87d4afb5ceSopenharmony_ci "NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG" 88d4afb5ceSopenharmony_ci "JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG" 89d4afb5ceSopenharmony_ci "LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW" 90d4afb5ceSopenharmony_ci "v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9" 91d4afb5ceSopenharmony_ci "eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY" 92d4afb5ceSopenharmony_ci "VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/" 93d4afb5ceSopenharmony_ci "uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu" 94d4afb5ceSopenharmony_ci "yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx" 95d4afb5ceSopenharmony_ci "+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\"" 96d4afb5ceSopenharmony_ci "}", 97d4afb5ceSopenharmony_ci "{" /* test 7 ... check huge strings into char * */ 98d4afb5ceSopenharmony_ci "\"schema\":\"com-warmcat-sai-builder\"," 99d4afb5ceSopenharmony_ci "\"targets\":[" 100d4afb5ceSopenharmony_ci "{" 101d4afb5ceSopenharmony_ci "\"name\":\"" 102d4afb5ceSopenharmony_ci "PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A" 103d4afb5ceSopenharmony_ci "zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/" 104d4afb5ceSopenharmony_ci "CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5" 105d4afb5ceSopenharmony_ci "3FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV" 106d4afb5ceSopenharmony_ci "8sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1" 107d4afb5ceSopenharmony_ci "NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG" 108d4afb5ceSopenharmony_ci "JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG" 109d4afb5ceSopenharmony_ci "LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW" 110d4afb5ceSopenharmony_ci "v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9" 111d4afb5ceSopenharmony_ci "eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY" 112d4afb5ceSopenharmony_ci "VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/" 113d4afb5ceSopenharmony_ci "uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu" 114d4afb5ceSopenharmony_ci "yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx" 115d4afb5ceSopenharmony_ci "+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\"}]}" 116d4afb5ceSopenharmony_ci "}", 117d4afb5ceSopenharmony_ci "{" /* test 8 the "other" schema */ 118d4afb5ceSopenharmony_ci "\"schema\":\"com-warmcat-sai-logs\"," 119d4afb5ceSopenharmony_ci "\"task_uuid\":\"97fc90052506af8b3eb43b87aaa6fb76feab32bc128ede479a8a6b961e801f06\"," 120d4afb5ceSopenharmony_ci "\"timestamp\": 170366786103,\"channel\":3, \"len\":20, " 121d4afb5ceSopenharmony_ci "\"log\": \"PnNhaWI+IE5TU1RBVEVfSU5JVAo=\"}\x0a" 122d4afb5ceSopenharmony_ci "ntu-xenial-amd64\"},{\"name\":\"linux-ubuntu-bionic-amd64\"},{\"name\":\"linux-fedora-32-x86_64\"}]}\",", 123d4afb5ceSopenharmony_ci 124d4afb5ceSopenharmony_ci "{" /* test 9, empty object */ 125d4afb5ceSopenharmony_ci "\"a\":123,\"b\":{}" 126d4afb5ceSopenharmony_ci "}", 127d4afb5ceSopenharmony_ci 128d4afb5ceSopenharmony_ci "{" /* SHOULD_FAIL: test 10, missing open */ 129d4afb5ceSopenharmony_ci "\"a\":123,\"b\":}" 130d4afb5ceSopenharmony_ci "}" 131d4afb5ceSopenharmony_ci}; 132d4afb5ceSopenharmony_ci 133d4afb5ceSopenharmony_cistatic const char * const tok[] = { 134d4afb5ceSopenharmony_ci "something", 135d4afb5ceSopenharmony_ci}; 136d4afb5ceSopenharmony_ci 137d4afb5ceSopenharmony_cistatic signed char 138d4afb5ceSopenharmony_citest_cb(struct lejp_ctx *ctx, char reason) 139d4afb5ceSopenharmony_ci{ 140d4afb5ceSopenharmony_ci lwsl_info("%s: ctx->path %s, buf %s\n", __func__, ctx->path, ctx->buf); 141d4afb5ceSopenharmony_ci return 0; 142d4afb5ceSopenharmony_ci} 143d4afb5ceSopenharmony_ci 144d4afb5ceSopenharmony_ci/* authz JSON parsing */ 145d4afb5ceSopenharmony_ci 146d4afb5ceSopenharmony_ci 147d4afb5ceSopenharmony_ciint main(int argc, const char **argv) 148d4afb5ceSopenharmony_ci{ 149d4afb5ceSopenharmony_ci int n, m, e = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE; 150d4afb5ceSopenharmony_ci struct lejp_ctx ctx; 151d4afb5ceSopenharmony_ci const char *p; 152d4afb5ceSopenharmony_ci 153d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-d"))) 154d4afb5ceSopenharmony_ci logs = atoi(p); 155d4afb5ceSopenharmony_ci 156d4afb5ceSopenharmony_ci lws_set_log_level(logs, NULL); 157d4afb5ceSopenharmony_ci lwsl_user("LWS API selftest: lws_struct JSON\n"); 158d4afb5ceSopenharmony_ci 159d4afb5ceSopenharmony_ci for (m = 0; m < (int)LWS_ARRAY_SIZE(json_tests); m++) { 160d4afb5ceSopenharmony_ci 161d4afb5ceSopenharmony_ci lwsl_info("%s: ++++++++++++++++ test %d\n", __func__, m + 1); 162d4afb5ceSopenharmony_ci 163d4afb5ceSopenharmony_ci lejp_construct(&ctx, test_cb, NULL, tok, LWS_ARRAY_SIZE(tok)); 164d4afb5ceSopenharmony_ci 165d4afb5ceSopenharmony_ci lwsl_hexdump_info(json_tests[m], strlen(json_tests[m])); 166d4afb5ceSopenharmony_ci 167d4afb5ceSopenharmony_ci if (m == 7) 168d4afb5ceSopenharmony_ci n = lejp_parse(&ctx, (uint8_t *)json_tests[m], 169d4afb5ceSopenharmony_ci 0xc8); 170d4afb5ceSopenharmony_ci else 171d4afb5ceSopenharmony_ci n = lejp_parse(&ctx, (uint8_t *)json_tests[m], 172d4afb5ceSopenharmony_ci (int)strlen(json_tests[m])); 173d4afb5ceSopenharmony_ci 174d4afb5ceSopenharmony_ci lwsl_info("n = %d\n", n); 175d4afb5ceSopenharmony_ci if (n < 0 && m != 9) { 176d4afb5ceSopenharmony_ci lwsl_err("%s: test %d: JSON decode failed '%s'\n", 177d4afb5ceSopenharmony_ci __func__, m + 1, lejp_error_to_string(n)); 178d4afb5ceSopenharmony_ci e++; 179d4afb5ceSopenharmony_ci } 180d4afb5ceSopenharmony_ci if (n >= 0 && m == 9) { 181d4afb5ceSopenharmony_ci lwsl_err("%s: test %d: JSON decode should have failed '%s'\n", 182d4afb5ceSopenharmony_ci __func__, m + 1, lejp_error_to_string(n)); 183d4afb5ceSopenharmony_ci e++; 184d4afb5ceSopenharmony_ci } 185d4afb5ceSopenharmony_ci } 186d4afb5ceSopenharmony_ci 187d4afb5ceSopenharmony_ci { 188d4afb5ceSopenharmony_ci const char *cs; 189d4afb5ceSopenharmony_ci size_t cslen; 190d4afb5ceSopenharmony_ci cs = lws_json_simple_find("{\"blah\":123,\"ext\":{\"authorized\":1}}", 35, 191d4afb5ceSopenharmony_ci "\"ext\":", &cslen); 192d4afb5ceSopenharmony_ci if (!cs) { 193d4afb5ceSopenharmony_ci lwsl_err("%s: simple_find failed\n", __func__); 194d4afb5ceSopenharmony_ci e++; 195d4afb5ceSopenharmony_ci } else { 196d4afb5ceSopenharmony_ci if (lws_json_simple_strcmp(cs, cslen, 197d4afb5ceSopenharmony_ci "\"authorized\":", "1")) 198d4afb5ceSopenharmony_ci e++; 199d4afb5ceSopenharmony_ci } 200d4afb5ceSopenharmony_ci cs = lws_json_simple_find("{\"blah\":123,\"auth_user\":\"andy@warmcat.com\",\"thing\":\"yeah\"}", 57, 201d4afb5ceSopenharmony_ci "\"auth_user\":", &cslen); 202d4afb5ceSopenharmony_ci if (cslen != 16) { 203d4afb5ceSopenharmony_ci lwsl_err("%s: wrong string len %d isolated\n", __func__, (int)cslen); 204d4afb5ceSopenharmony_ci e++; 205d4afb5ceSopenharmony_ci } 206d4afb5ceSopenharmony_ci } 207d4afb5ceSopenharmony_ci 208d4afb5ceSopenharmony_ci if (e) 209d4afb5ceSopenharmony_ci goto bail; 210d4afb5ceSopenharmony_ci 211d4afb5ceSopenharmony_ci lwsl_user("Completed: PASS\n"); 212d4afb5ceSopenharmony_ci 213d4afb5ceSopenharmony_ci return 0; 214d4afb5ceSopenharmony_ci 215d4afb5ceSopenharmony_cibail: 216d4afb5ceSopenharmony_ci lwsl_user("Completed: FAIL\n"); 217d4afb5ceSopenharmony_ci 218d4afb5ceSopenharmony_ci return 1; 219d4afb5ceSopenharmony_ci} 220