RFC8259JsonTest.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <time.h>
  6. #include <sys/stat.h>
  7. #include <dirent.h>
  8. #include <intrin.h>
  9. #include "./RyanJson/RyanJson.h"
  10. #include "./cJSON/cJSON.h"
  11. #include "./yyjson/yyjson.h"
  12. #include "./valloc/valloc.h"
  13. // #define PrintfStrCmpEnable
  14. typedef int (*jsonParseData)(char *file_name, char *data, uint32_t len);
  15. static void *yy_malloc(void *ctx, size_t size)
  16. {
  17. return v_malloc(size);
  18. }
  19. static void *yy_realloc(void *ctx, void *ptr, size_t old_size, size_t size)
  20. {
  21. return v_realloc(ptr, size);
  22. }
  23. static void yy_free(void *ctx, void *ptr)
  24. {
  25. v_free(ptr);
  26. }
  27. static yyjson_alc yyalc = {
  28. yy_malloc,
  29. yy_realloc,
  30. yy_free,
  31. NULL};
  32. /* Read a file, parse, render back, etc. */
  33. int testFile(const char *path, jsonParseData jsonParseDataHandle)
  34. {
  35. struct _finddata_t entry;
  36. intptr_t handle;
  37. int idx = 0, alc = 0;
  38. char *search;
  39. int path_len = strlen(path);
  40. int count = 0;
  41. int used_count = 0;
  42. search = malloc(path_len + 3);
  43. if (!search)
  44. return 0;
  45. memcpy(search, path, path_len);
  46. if (search[path_len - 1] == '\\')
  47. path_len--;
  48. memcpy(search + path_len, "\\*\0", 3);
  49. handle = _findfirst(search, &entry);
  50. if (handle == -1)
  51. goto fail;
  52. do
  53. {
  54. char *name = (char *)entry.name;
  55. if (!name || !strlen(name))
  56. continue;
  57. if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
  58. continue;
  59. char aaa[300] = {0};
  60. snprintf(aaa, sizeof(aaa), "%s/%s", path, name);
  61. FILE *f = fopen(aaa, "rb");
  62. if (f == NULL)
  63. goto fail;
  64. fseek(f, 0, SEEK_END);
  65. long len = ftell(f);
  66. fseek(f, 0, SEEK_SET);
  67. char *data = (char *)malloc(len + 10);
  68. fread(data, 1, len, f);
  69. data[len] = '\0';
  70. fclose(f);
  71. int status = 0;
  72. status = jsonParseDataHandle(name, data, len);
  73. used_count++;
  74. if (0 == strncmp("y_", name, 2))
  75. {
  76. if (1 == status)
  77. count++;
  78. else
  79. printf("应该成功,但是失败: %s, len: %d\n", data, len);
  80. }
  81. else if (0 == strncmp("n_", name, 2))
  82. {
  83. if (0 == status)
  84. count++;
  85. else
  86. printf("应该失败,但是成功: %s, len: %d\n", data, len);
  87. }
  88. else if (0 == strncmp("i_", name, 2))
  89. {
  90. count++;
  91. }
  92. int area = 0, use = 0;
  93. v_mcheck(&area, &use);
  94. if (use != (path_len + 3 + len + 10))
  95. {
  96. free(data);
  97. printf("内存泄漏 %s len: %d\r\n", data, len);
  98. printf("内存泄漏 %x len: %d\r\n", data, len);
  99. printf("内存泄漏 %c len: %d\r\n", data, len);
  100. printf("|||----------->>> area = %d, size = %d\r\n", area, use);
  101. break;
  102. }
  103. free(data);
  104. } while (_findnext(handle, &entry) == 0);
  105. _findclose(handle);
  106. if (search)
  107. free(search);
  108. printf("RFC 8259 JSON: (%d/%d)\r\n", count, used_count);
  109. return 1;
  110. fail:
  111. if (handle != -1)
  112. _findclose(handle);
  113. if (search)
  114. free(search);
  115. return 0;
  116. }
  117. /**
  118. * @brief RyanJson 测试程序
  119. *
  120. * @param file_name
  121. * @param data
  122. * @param len
  123. * @return int
  124. */
  125. int RyanJsonParseData(char *file_name, char *data, uint32_t len)
  126. {
  127. if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
  128. strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
  129. strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
  130. return 0;
  131. RyanJson_t json = RyanJsonParseOptions(data, len, RyanJsonTrue, NULL);
  132. if (NULL == json)
  133. return 0;
  134. #ifdef PrintfStrCmpEnable
  135. char *str = RyanJsonPrint(json, 60, RyanJsonFalse, NULL);
  136. if (NULL == str)
  137. {
  138. printf("反序列化失败: [%s]\n", data);
  139. goto next;
  140. }
  141. RyanJsonMinify(data);
  142. if (0 != strcmp(data, str))
  143. printf("数据不一致 -- 原始: %s -- 序列化: %s\n", data, str);
  144. RyanJsonFree(str);
  145. #endif
  146. next:
  147. RyanJsonDelete(json);
  148. return 1;
  149. }
  150. /**
  151. * @brief cJson测试程序
  152. *
  153. * @param file_name
  154. * @param data
  155. * @param len
  156. * @return int
  157. */
  158. int cJSONParseData(char *file_name, char *data, uint32_t len)
  159. {
  160. if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
  161. strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
  162. strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
  163. return 0;
  164. cJSON *json = cJSON_ParseWithLengthOpts(data, len + sizeof(""), NULL, RyanJsonTrue);
  165. if (NULL == json)
  166. return 0;
  167. #ifdef PrintfStrCmpEnable
  168. char *str = cJSON_PrintBuffered(json, 60, RyanJsonFalse);
  169. if (NULL == str)
  170. {
  171. printf("反序列化失败: [%s]\n", data);
  172. goto next;
  173. }
  174. cJSON_Minify(data);
  175. if (0 != strcmp(data, str))
  176. printf("-- 原始: %s -- 序列化: %s\n", data, str);
  177. cJSON_free(str);
  178. #endif
  179. next:
  180. cJSON_Delete(json);
  181. return 1;
  182. }
  183. /**
  184. * @brief cJson测试程序
  185. *
  186. * @param file_name
  187. * @param data
  188. * @param len
  189. * @return int
  190. */
  191. int yyjsonParseData(char *file_name, char *data, uint32_t len)
  192. {
  193. if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
  194. strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
  195. strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
  196. return 0;
  197. yyjson_doc *doc = yyjson_read_opts(data, len, YYJSON_READ_NOFLAG, &yyalc, NULL);
  198. if (NULL == doc)
  199. return 0;
  200. #ifdef PrintfStrCmpEnable
  201. char *str = yyjson_write_opts(doc, YYJSON_WRITE_NOFLAG, &yyalc, NULL, NULL);
  202. if (NULL == str)
  203. {
  204. printf("反序列化失败: [%s]\n", data);
  205. goto next;
  206. }
  207. cJSON_Minify(data);
  208. if (0 != strcmp(data, str))
  209. printf("-- 原始: %s -- 序列化: %s\n", data, str);
  210. free(str);
  211. #endif
  212. next:
  213. yyjson_doc_free(doc);
  214. return 1;
  215. }
  216. // RFC 8259 JSON Test Suite
  217. // https://github.com/nst/JSONTestSuite
  218. int RFC8259JsonTest(void)
  219. {
  220. RyanJsonInitHooks(v_malloc, v_free, v_realloc);
  221. cJSON_Hooks hooks = {
  222. .malloc_fn = v_malloc,
  223. .free_fn = v_free};
  224. cJSON_InitHooks(&hooks);
  225. printf("开始 RFC 8259 JSON 测试");
  226. printf("\r\n--------------------------- RFC8259 RyanJson --------------------------\r\n");
  227. testFile("./RFC8259JsonData", RyanJsonParseData);
  228. printf("\r\n--------------------------- RFC8259 cJSON --------------------------\r\n");
  229. testFile("./RFC8259JsonData", cJSONParseData);
  230. printf("\r\n--------------------------- RFC8259 yyjson --------------------------\r\n");
  231. testFile("./RFC8259JsonData", yyjsonParseData);
  232. displayMem();
  233. return 0;
  234. }