main.c 6.3 KB

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