testLoadFailure.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #include "testBase.h"
  2. static void testLoadFailureNullAndWhitespace(void)
  3. {
  4. // NULL 和空字符串
  5. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse(NULL), "Parse(NULL) 应返回 NULL");
  6. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse(""), "Parse(\"\") 应返回 NULL");
  7. // 仅有空白字符
  8. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse(" "), "Parse(只含空格) 应返回 NULL");
  9. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("\t\r\n"), "Parse(只含换行符) 应返回 NULL");
  10. }
  11. static void testLoadFailureTruncated(void)
  12. {
  13. // 畸形 Json(缺少闭合)
  14. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("[1, 2, 3"), "Parse(未闭合数组) 应返回 NULL");
  15. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\": 1"), "Parse(未闭合对象) 应返回 NULL");
  16. // 截断的输入 (非正常结束)
  17. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{"), "截断的对象应解析失败");
  18. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("["), "截断的数组应解析失败");
  19. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":"), "缺少值的对象应解析失败");
  20. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1"), "未闭合的对象应解析失败");
  21. // 未闭合字符串
  22. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("\"just a string"), "未闭合字符串应解析失败");
  23. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":\"unterminated}"), "未闭合字符串应解析失败");
  24. }
  25. static void testLoadFailureInvalidTokens(void)
  26. {
  27. // 非法字符开头
  28. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("x123"), "Parse(非法开头) 应返回 NULL");
  29. // 无效数字
  30. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"inter\":16poi}"), "应拒绝无效数字 16poi");
  31. // 无效浮点数
  32. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"double\":16.8yu9}"), "应拒绝无效浮点数 16.8yu9");
  33. // boolTrue 拼写错误
  34. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"boolTrue\":tru}"), "应拒绝错误拼写的 true (tru)");
  35. // boolFalse 拼写错误
  36. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"boolFalse\":fale}"), "应拒绝错误拼写的 false (fale)");
  37. // null 拼写错误
  38. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"null\":nul}"), "应拒绝错误拼写的 null (nul)");
  39. // null 大写错误(Json 规范要求小写)
  40. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"null\":NULL}"), "应拒绝大写的 NULL");
  41. // 缺少逗号
  42. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"inter\":16\"double\":16.89}"), "应拒绝缺少逗号的对象");
  43. // 数组项缺少逗号
  44. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("[16,16.89\"hello\"]"), "应拒绝数组项缺少逗号");
  45. // 键值缺少引号
  46. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"item:{\"inter\":16}}"), "应拒绝键值缺少引号");
  47. // 嵌套对象键值缺少引号
  48. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"item\":{inter:16}}"), "应拒绝嵌套对象键值缺少引号");
  49. // 多余引号
  50. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"item\":{\"\"double\":16.89}}"), "应拒绝多余引号");
  51. // 键值后多余逗号或引号
  52. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"item\":{\"inter\":16\"\"}}"), "应拒绝非法结尾引号");
  53. // 数组中无效数字
  54. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"arrayInt\":[16,16,16m,16,16]}"), "应拒绝数组中含有无效数字 16m");
  55. }
  56. static void testLoadFailureInvalidNumbers(void)
  57. {
  58. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("012"), "Parse(前导 0) 应返回 NULL");
  59. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":01}"), "Parse(01) 应返回 NULL (不允许前导 0)");
  60. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":-01}"), "Parse(-01) 应返回 NULL (不允许前导 0)");
  61. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":00}"), "Parse(00) 应返回 NULL (不允许前导 0)");
  62. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":+1}"), "Parse(+1) 应返回 NULL (Json 不允许前导 +)");
  63. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":--1}"), "Parse(--1) 应返回 NULL");
  64. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1.2.3}"), "Parse(1.2.3) 应返回 NULL");
  65. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1.}"), "Parse(1.) 应返回 NULL");
  66. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":-.1}"), "Parse(-.1) 应返回 NULL");
  67. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":-}"), "Parse(-) 应返回 NULL");
  68. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1e}"), "Parse(1e) 应返回 NULL");
  69. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1e+}"), "Parse(1e+) 应返回 NULL");
  70. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1e-}"), "Parse(1e-) 应返回 NULL");
  71. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1e309}"), "Parse(1e309) 应返回 NULL (溢出)");
  72. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("1e2147483647"), "Parse(纯数字指数边界) 应返回 NULL");
  73. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("1e2147483648"), "Parse(纯数字指数累积溢出) 应返回 NULL");
  74. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("1e-2147483648"), "Parse(纯数字负指数累积溢出) 应返回 NULL");
  75. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1e2147483648}"), "Parse(指数累积溢出) 应返回 NULL");
  76. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1e-2147483648}"), "Parse(负指数累积溢出) 应返回 NULL");
  77. }
  78. static void testLoadFailureHugeNumberOverflow(void)
  79. {
  80. // 超长整数:应在数值累乘过程中触发 isfinite 防御并失败
  81. const uint32_t intLen = 1024;
  82. char *hugeInt = (char *)malloc((size_t)intLen + 1U);
  83. TEST_ASSERT_NOT_NULL(hugeInt);
  84. hugeInt[0] = '1';
  85. memset(hugeInt + 1, '9', intLen - 1U);
  86. hugeInt[intLen] = '\0';
  87. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse(hugeInt), "Parse(超长整数溢出) 应返回 NULL");
  88. free(hugeInt);
  89. // 超长小数:同样应触发 isfinite 防御并失败
  90. const uint32_t fracLen = 1024;
  91. char *hugeFrac = (char *)malloc((size_t)fracLen + 3U);
  92. TEST_ASSERT_NOT_NULL(hugeFrac);
  93. hugeFrac[0] = '0';
  94. hugeFrac[1] = '.';
  95. memset(hugeFrac + 2, '9', fracLen);
  96. hugeFrac[fracLen + 2U] = '\0';
  97. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse(hugeFrac), "Parse(超长小数溢出) 应返回 NULL");
  98. free(hugeFrac);
  99. }
  100. static void testLoadFailureInvalidEscapes(void)
  101. {
  102. // 疯狂的转义符
  103. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":\"\\\"}"), "Parse(末尾转义未完成) 应返回 NULL");
  104. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":\"\\v\"}"), "Parse(非法转义 \\v) 应返回 NULL");
  105. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":\"\\x12\"}"), "Parse(非法转义 \\x12) 应返回 NULL");
  106. // 控制字符插入
  107. // Json 规范不允许未转义的控制字符(0x00-0x1F)
  108. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":\"\x01\"}"), "Parse(含控制字符 0x01) 应返回 NULL");
  109. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":\"\n\"}"), "Parse(含未转义换行) 应返回 NULL");
  110. }
  111. static void testLoadFailureInvalidUnicode(void)
  112. {
  113. // Unicode 截断
  114. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"invalid\":\"\\u123\"}"), "应拒绝截断的 Unicode");
  115. // 非法十六进制字符
  116. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"invalid\":\"\\uGGGG\"}"), "应拒绝非法 Unicode GGGG");
  117. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"invalid\":\"\\u00ZZ\"}"), "应拒绝非法 Unicode 00ZZ");
  118. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"invalid\":\"\\u00!!\"}"), "应拒绝非法 Unicode 00!!");
  119. // UTF-16 代理对错误
  120. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"invalid\":\"\\uD800\"}"), "应拒绝缺少低位代理的高位代理");
  121. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"invalid\":\"\\uDC00\"}"), "应拒绝单独低位代理");
  122. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"invalid\":\"\\uD800\\u0041\"}"), "应拒绝无效代理对");
  123. }
  124. static void testLoadFailureInvalidStructure(void)
  125. {
  126. // 结构混乱
  127. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1, \"b\":2, }"), "Parse(尾部逗号) 应返回 NULL");
  128. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1, , \"b\":2}"), "Parse(双逗号) 应返回 NULL");
  129. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1 : \"b\":2}"), "Parse(冒号代替逗号) 应返回 NULL");
  130. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1 \"b\":2}"), "Parse(缺少逗号) 应返回 NULL");
  131. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1,}"), "Parse(对象尾逗号) 应返回 NULL");
  132. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1,,\"b\":2}"), "Parse(对象双逗号) 应返回 NULL");
  133. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":}"), "Parse(缺少值) 应返回 NULL");
  134. #if true == RyanJsonStrictObjectKeyCheck
  135. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"dup\":1,\"dup\":2}"), "严格模式 Parse(对象重复 key) 应返回 NULL");
  136. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"obj\":{\"dup\":1,\"dup\":2}}"), "严格模式 Parse(嵌套对象重复 key) 应返回 NULL");
  137. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("[{\"dup\":1,\"dup\":2}]"), "严格模式 Parse(数组内对象重复 key) 应返回 NULL");
  138. #else
  139. RyanJson_t dupObj = RyanJsonParse("{\"dup\":1,\"dup\":2}");
  140. RyanJson_t dupNestedObj = RyanJsonParse("{\"obj\":{\"dup\":1,\"dup\":2}}");
  141. RyanJson_t dupInArray = RyanJsonParse("[{\"dup\":1,\"dup\":2}]");
  142. TEST_ASSERT_NOT_NULL_MESSAGE(dupObj, "非严格模式 Parse(对象重复 key) 应成功");
  143. TEST_ASSERT_NOT_NULL_MESSAGE(dupNestedObj, "非严格模式 Parse(嵌套对象重复 key) 应成功");
  144. TEST_ASSERT_NOT_NULL_MESSAGE(dupInArray, "非严格模式 Parse(数组内对象重复 key) 应成功");
  145. RyanJsonDelete(dupObj);
  146. RyanJsonDelete(dupNestedObj);
  147. RyanJsonDelete(dupInArray);
  148. #endif
  149. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("[,1]"), "Parse(数组前置逗号) 应返回 NULL");
  150. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("[1,,2]"), "Parse(数组双逗号) 应返回 NULL");
  151. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("[1,]"), "Parse(数组尾逗号) 应返回 NULL");
  152. }
  153. static void testLoadFailureDuplicateKeyAfterDecode(void)
  154. {
  155. #if true == RyanJsonStrictObjectKeyCheck
  156. // 转义后 key 冲突("\u0061" == "a")
  157. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"a\":1,\"\\u0061\":2}"), "严格模式 Parse(转义后重复 key) 应返回 NULL");
  158. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"\\u0061\":1,\"a\":2}"), "严格模式 Parse(转义后重复 key 反序) 应返回 NULL");
  159. // 大小写字符同理:"\u0041" == "A"
  160. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"A\":1,\"\\u0041\":2}"), "严格模式 Parse(转义后重复大写 key) 应返回 NULL");
  161. // 空 key 重复
  162. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse("{\"\":1,\"\":2}"), "严格模式 Parse(空 key 重复) 应返回 NULL");
  163. #else
  164. RyanJson_t dupEscaped1 = RyanJsonParse("{\"a\":1,\"\\u0061\":2}");
  165. RyanJson_t dupEscaped2 = RyanJsonParse("{\"\\u0061\":1,\"a\":2}");
  166. RyanJson_t dupEscaped3 = RyanJsonParse("{\"A\":1,\"\\u0041\":2}");
  167. RyanJson_t dupEscaped4 = RyanJsonParse("{\"\":1,\"\":2}");
  168. TEST_ASSERT_NOT_NULL_MESSAGE(dupEscaped1, "非严格模式 Parse(转义后重复 key) 应成功");
  169. TEST_ASSERT_NOT_NULL_MESSAGE(dupEscaped2, "非严格模式 Parse(转义后重复 key 反序) 应成功");
  170. TEST_ASSERT_NOT_NULL_MESSAGE(dupEscaped3, "非严格模式 Parse(转义后重复大写 key) 应成功");
  171. TEST_ASSERT_NOT_NULL_MESSAGE(dupEscaped4, "非严格模式 Parse(空 key 重复) 应成功");
  172. RyanJsonDelete(dupEscaped1);
  173. RyanJsonDelete(dupEscaped2);
  174. RyanJsonDelete(dupEscaped3);
  175. RyanJsonDelete(dupEscaped4);
  176. #endif
  177. }
  178. static void testLoadFailureMalformedNesting(void)
  179. {
  180. // 深度嵌套但没有闭合
  181. char deepOpen[200];
  182. memset(deepOpen, '[', 199);
  183. deepOpen[199] = '\0';
  184. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse(deepOpen), "Parse(199个[) 应返回 NULL");
  185. // 深度嵌套但不匹配
  186. char deepMix[200];
  187. memset(deepMix, '[', 100);
  188. memset(deepMix + 100, '}', 99); // 应该是 ]
  189. deepMix[199] = '\0';
  190. TEST_ASSERT_NULL_MESSAGE(RyanJsonParse(deepMix), "Parse(100个[ + 99个}) 应返回 NULL");
  191. }
  192. static void testLoadParseOptionsFailure(void)
  193. {
  194. // 禁止尾部垃圾:requireNullTerminator = true
  195. const char *text = " {\"a\":1} trailing";
  196. RyanJson_t json = RyanJsonParseOptions(text, (uint32_t)strlen(text), RyanJsonTrue, NULL);
  197. TEST_ASSERT_NULL_MESSAGE(json, "ParseOptions(require null terminator) 应失败");
  198. }
  199. static int32_t gLoadFailAfter = -1;
  200. static int32_t gLoadAllocCount = 0;
  201. static void *loadFailMalloc(size_t size)
  202. {
  203. if (gLoadFailAfter >= 0 && gLoadAllocCount++ >= gLoadFailAfter) { return NULL; }
  204. return unityTestMalloc(size);
  205. }
  206. static void *loadFailRealloc(void *block, size_t size)
  207. {
  208. if (gLoadFailAfter >= 0 && gLoadAllocCount++ >= gLoadFailAfter) { return NULL; }
  209. return unityTestRealloc(block, size);
  210. }
  211. static void loadSetFailAfter(int32_t n)
  212. {
  213. gLoadFailAfter = n;
  214. gLoadAllocCount = 0;
  215. RyanJsonInitHooks(loadFailMalloc, unityTestFree, loadFailRealloc);
  216. }
  217. static void loadRestoreHooks(void)
  218. {
  219. RyanJsonInitHooks(unityTestMalloc, unityTestFree, unityTestRealloc);
  220. gLoadFailAfter = -1;
  221. gLoadAllocCount = 0;
  222. }
  223. static void testLoadFailureOomParse(void)
  224. {
  225. const char *longKeyJson =
  226. "{\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\":1}";
  227. loadSetFailAfter(0);
  228. RyanJson_t json = RyanJsonParse("{\"a\":1}");
  229. loadRestoreHooks();
  230. if (json) { RyanJsonDelete(json); }
  231. TEST_ASSERT_NULL_MESSAGE(json, "Parse OOM(根节点分配失败) 应返回 NULL");
  232. loadSetFailAfter(1); // root 成功,key buffer 失败
  233. json = RyanJsonParse(longKeyJson);
  234. loadRestoreHooks();
  235. if (json) { RyanJsonDelete(json); }
  236. TEST_ASSERT_NULL_MESSAGE(json, "Parse OOM 应返回 NULL");
  237. }
  238. void testLoadFailureRunner(void)
  239. {
  240. UnitySetTestFile(__FILE__);
  241. RUN_TEST(testLoadFailureNullAndWhitespace);
  242. RUN_TEST(testLoadFailureTruncated);
  243. RUN_TEST(testLoadFailureInvalidTokens);
  244. RUN_TEST(testLoadFailureInvalidNumbers);
  245. RUN_TEST(testLoadFailureHugeNumberOverflow);
  246. RUN_TEST(testLoadFailureInvalidEscapes);
  247. RUN_TEST(testLoadFailureInvalidUnicode);
  248. RUN_TEST(testLoadFailureInvalidStructure);
  249. RUN_TEST(testLoadFailureDuplicateKeyAfterDecode);
  250. RUN_TEST(testLoadFailureMalformedNesting);
  251. RUN_TEST(testLoadParseOptionsFailure);
  252. RUN_TEST(testLoadFailureOomParse);
  253. }