RFC8259JsonTest.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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.h"
  10. #include "cJSON.h"
  11. #include "yyjson.h"
  12. #include "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. DIR *dir = NULL;
  36. struct dirent *entry;
  37. int path_len = strlen(path);
  38. int count = 0;
  39. int used_count = 0;
  40. if (!path || !path_len || !(dir = opendir(path)))
  41. goto fail;
  42. while ((entry = readdir(dir)))
  43. {
  44. char *name = (char *)entry->d_name;
  45. if (!name || !strlen(name))
  46. continue;
  47. if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
  48. continue;
  49. char aaa[300] = {0};
  50. snprintf(aaa, sizeof(aaa), "%s/%s", path, name);
  51. FILE *f = fopen(aaa, "rb");
  52. if (f == NULL)
  53. goto fail;
  54. fseek(f, 0, SEEK_END);
  55. long len = ftell(f);
  56. fseek(f, 0, SEEK_SET);
  57. char *data = (char *)malloc(len + 10);
  58. fread(data, 1, len, f);
  59. data[len] = '\0';
  60. fclose(f);
  61. int status = 0;
  62. status = jsonParseDataHandle(name, data, len);
  63. used_count++;
  64. if (0 == strncmp("y_", name, 2))
  65. {
  66. if (0 == status)
  67. count++;
  68. else
  69. printf("应该成功,但是失败: %s, len: %ld\n", data, len);
  70. }
  71. else if (0 == strncmp("n_", name, 2))
  72. {
  73. if (0 != status)
  74. count++;
  75. else
  76. printf("应该失败,但是成功: %s, len: %ld\n", data, len);
  77. }
  78. else if (0 == strncmp("i_", name, 2))
  79. {
  80. count++;
  81. }
  82. int area = 0, use = 0;
  83. v_mcheck(&area, &use);
  84. if (use != (len + 10))
  85. {
  86. free(data);
  87. printf("内存泄漏 %s len: %ld\r\n", data, len);
  88. // printf("内存泄漏 %x len: %ld\r\n", (unsigned int)data, len);
  89. // printf("内存泄漏 %c len: %ld\r\n", (int)data, len);
  90. printf("|||----------->>> area = %d, size = %d\r\n", area, use);
  91. break;
  92. }
  93. free(data);
  94. }
  95. closedir(dir);
  96. printf("RFC 8259 JSON: (%d/%d)\r\n", count, used_count);
  97. return 0;
  98. fail:
  99. if (dir)
  100. closedir(dir);
  101. return -1;
  102. }
  103. /**
  104. * @brief RyanJson 测试程序
  105. *
  106. * @param file_name
  107. * @param data
  108. * @param len
  109. * @return int
  110. */
  111. int RyanJsonParseData(char *file_name, char *data, uint32_t len)
  112. {
  113. if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
  114. strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
  115. strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
  116. return -1;
  117. RyanJson_t json = RyanJsonParseOptions(data, len, RyanJsonTrue, NULL);
  118. if (NULL == json)
  119. return -1;
  120. #ifdef PrintfStrCmpEnable
  121. char *str = RyanJsonPrint(json, 60, RyanJsonFalse, NULL);
  122. if (NULL == str)
  123. {
  124. printf("反序列化失败: [%s]\n", data);
  125. goto err;
  126. }
  127. RyanJsonMinify(data);
  128. if (0 != strcmp(data, str))
  129. printf("数据不一致 -- 原始: %s -- 序列化: %s\n", data, str);
  130. RyanJsonFree(str);
  131. #endif
  132. RyanJsonDelete(json);
  133. return 0;
  134. err:
  135. RyanJsonDelete(json);
  136. return -1;
  137. }
  138. /**
  139. * @brief cJson测试程序
  140. *
  141. * @param file_name
  142. * @param data
  143. * @param len
  144. * @return int
  145. */
  146. int cJSONParseData(char *file_name, char *data, uint32_t len)
  147. {
  148. if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
  149. strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
  150. strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
  151. return -1;
  152. cJSON *json = cJSON_ParseWithLengthOpts(data, len + sizeof(""), NULL, RyanJsonTrue);
  153. if (NULL == json)
  154. return -1;
  155. #ifdef PrintfStrCmpEnable
  156. char *str = cJSON_PrintBuffered(json, 60, RyanJsonFalse);
  157. if (NULL == str)
  158. {
  159. printf("反序列化失败: [%s]\n", data);
  160. goto err;
  161. }
  162. cJSON_Minify(data);
  163. if (0 != strcmp(data, str))
  164. printf("-- 原始: %s -- 序列化: %s\n", data, str);
  165. cJSON_free(str);
  166. #endif
  167. cJSON_Delete(json);
  168. return 0;
  169. err:
  170. cJSON_Delete(json);
  171. return -1;
  172. }
  173. /**
  174. * @brief cJson测试程序
  175. *
  176. * @param file_name
  177. * @param data
  178. * @param len
  179. * @return int
  180. */
  181. int yyjsonParseData(char *file_name, char *data, uint32_t len)
  182. {
  183. if (strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0 ||
  184. strcmp(file_name, "n_structure_open_array_object.json") == 0 ||
  185. strcmp(file_name, "n_structure_100000_opening_arrays.json") == 0)
  186. return -1;
  187. yyjson_doc *doc = yyjson_read_opts(data, len, YYJSON_READ_NOFLAG, &yyalc, NULL);
  188. if (NULL == doc)
  189. return -1;
  190. #ifdef PrintfStrCmpEnable
  191. char *str = yyjson_write_opts(doc, YYJSON_WRITE_NOFLAG, &yyalc, NULL, NULL);
  192. if (NULL == str)
  193. {
  194. printf("反序列化失败: [%s]\n", data);
  195. goto err;
  196. }
  197. cJSON_Minify(data);
  198. if (0 != strcmp(data, str))
  199. printf("-- 原始: %s -- 序列化: %s\n", data, str);
  200. free(str);
  201. #endif
  202. yyjson_doc_free(doc);
  203. return 0;
  204. err:
  205. yyjson_doc_free(doc);
  206. return -1;
  207. }
  208. // RFC 8259 JSON Test Suite
  209. // https://github.com/nst/JSONTestSuite
  210. int RFC8259JsonTest(void)
  211. {
  212. int result = 0;
  213. RyanJsonInitHooks(v_malloc, v_free, v_realloc);
  214. cJSON_Hooks hooks = {
  215. .malloc_fn = v_malloc,
  216. .free_fn = v_free};
  217. cJSON_InitHooks(&hooks);
  218. printf("开始 RFC 8259 JSON 测试");
  219. printf("\r\n--------------------------- RFC8259 RyanJson --------------------------\r\n");
  220. result = testFile("./RyanJsonExample/RFC8259JsonData", RyanJsonParseData);
  221. if (0 != result)
  222. {
  223. printf("%s:%d RyanJson RFC8259JsonTest fail\r\n", __FILE__, __LINE__);
  224. goto err;
  225. }
  226. printf("\r\n--------------------------- RFC8259 cJSON --------------------------\r\n");
  227. result = testFile("./RyanJsonExample/RFC8259JsonData", cJSONParseData);
  228. if (0 != result)
  229. {
  230. printf("%s:%d cJSON RFC8259JsonTest fail\r\n", __FILE__, __LINE__);
  231. goto err;
  232. }
  233. printf("\r\n--------------------------- RFC8259 yyjson --------------------------\r\n");
  234. result = testFile("./RyanJsonExample/RFC8259JsonData", yyjsonParseData);
  235. if (0 != result)
  236. {
  237. printf("%s:%d yyjson RFC8259JsonTest fail\r\n", __FILE__, __LINE__);
  238. goto err;
  239. }
  240. displayMem();
  241. return 0;
  242. err:
  243. displayMem();
  244. return -1;
  245. }