RyanJsonFuzzerCreate.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. #include "RyanJsonFuzzer.h"
  2. RyanJson_t RyanJsonFuzzerCreateRandomNode(RyanJson_t pJson)
  3. {
  4. static int32_t count = 0;
  5. static int32_t count2 = 0;
  6. count++;
  7. char *key = "true";
  8. if (0 != count % 10 && 5 < count % 10) { key = NULL; }
  9. switch (count % 50)
  10. {
  11. case 0: return RyanJsonCreateArray();
  12. case 1: return RyanJsonCreateObject();
  13. case 2:
  14. count2++;
  15. if (0 == count2 % 10) { return RyanJsonDuplicate(pJson); }
  16. // fallthrough
  17. case 11:
  18. case 12:
  19. case 13: return RyanJsonCreateBool(key, RyanJsonTrue);
  20. case 20:
  21. case 21:
  22. case 22: return RyanJsonCreateInt(key, count);
  23. case 31:
  24. case 32:
  25. case 33: return RyanJsonCreateDouble(key, count * 1.123456789);
  26. default: return RyanJsonCreateString(key, "true");
  27. }
  28. }
  29. RyanJsonBool_e RyanJsonFuzzerTestCreate(RyanJson_t pJson, uint32_t size)
  30. {
  31. // RyanJsonInsert的特殊情况
  32. RyanJsonAssert(RyanJsonFalse == RyanJsonInsert(NULL, UINT32_MAX, RyanJsonCreateString("key", "string")));
  33. RyanJsonAssert(RyanJsonFalse == RyanJsonInsert(pJson, UINT32_MAX, NULL));
  34. RyanJsonAssert(RyanJsonFalse == RyanJsonInsert(NULL, 0, NULL));
  35. RyanJsonAssert(NULL == RyanJsonCreateString(NULL, NULL));
  36. RyanJsonAssert(NULL == RyanJsonCreateString("NULL", NULL));
  37. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeStringValue(NULL, NULL));
  38. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeStringValue(pJson, NULL));
  39. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeStringValue(NULL, "NULL"));
  40. if (RyanJsonFalse == RyanJsonIsKey(pJson) && RyanJsonFalse == RyanJsonIsString(pJson)) // pJson类型错误
  41. {
  42. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeStringValue(pJson, "NULL"));
  43. }
  44. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(NULL, NULL));
  45. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(pJson, NULL));
  46. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(NULL, "NULL"));
  47. if (RyanJsonFalse == RyanJsonIsKey(pJson) && RyanJsonFalse == RyanJsonIsString(pJson)) // pJson类型错误
  48. {
  49. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(pJson, "NULL"));
  50. }
  51. // 测试没有key但是有strValue的
  52. if (RyanJsonFalse == RyanJsonIsKey(pJson) && RyanJsonTrue == RyanJsonIsString(pJson)) { RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(pJson, "NULL")); }
  53. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeIntValue(NULL, 0));
  54. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeDoubleValue(NULL, 0));
  55. RyanJsonAssert(RyanJsonFalse == RyanJsonAddItemToObject(NULL, NULL, NULL));
  56. RyanJsonAssert(RyanJsonFalse == RyanJsonAddItemToObject(pJson, NULL, NULL));
  57. RyanJsonAssert(NULL == RyanJsonCreateIntArray(NULL, 0));
  58. RyanJsonAssert(NULL == RyanJsonCreateDoubleArray(NULL, 0));
  59. RyanJsonAssert(NULL == RyanJsonCreateStringArray(NULL, 0));
  60. RyanJsonAssert(RyanJsonFalse == RyanJsonHasObjectToKey(NULL, "0", "1", "2", "3"));
  61. RyanJsonAssert(RyanJsonFalse == RyanJsonHasObjectToIndex(NULL, 0, 1, 2, 3));
  62. RyanJsonAssert(RyanJsonFalse == RyanJsonHasObjectToKey(pJson, "0", "1", "2", "3"));
  63. RyanJsonAssert(RyanJsonFalse == RyanJsonHasObjectToIndex(pJson, 0, 1, 2, 3));
  64. char *key = "keyaaa";
  65. RyanJsonAddNullToObject(pJson, key);
  66. if (RyanJsonTrue == RyanJsonIsKey(pJson)) { key = RyanJsonGetKey(pJson); }
  67. if (RyanJsonTrue == RyanJsonIsBool(pJson)) { RyanJsonAddBoolToObject(pJson, key, RyanJsonGetBoolValue(pJson)); }
  68. if (RyanJsonTrue == RyanJsonIsNumber(pJson))
  69. {
  70. if (RyanJsonTrue == RyanJsonIsInt(pJson))
  71. {
  72. RyanJsonAddIntToObject(pJson, key, RyanJsonGetIntValue(pJson));
  73. int32_t arrayInt[] = {RyanJsonGetIntValue(pJson), RyanJsonGetIntValue(pJson), RyanJsonGetIntValue(pJson),
  74. RyanJsonGetIntValue(pJson), RyanJsonGetIntValue(pJson)};
  75. RyanJsonAddItemToObject(pJson, (0 != size % 2) ? key : "arrayString",
  76. RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
  77. }
  78. if (RyanJsonTrue == RyanJsonIsDouble(pJson))
  79. {
  80. RyanJsonAddDoubleToObject(pJson, key, RyanJsonGetDoubleValue(pJson));
  81. double arrayDouble[] = {RyanJsonGetDoubleValue(pJson), RyanJsonGetDoubleValue(pJson), RyanJsonGetDoubleValue(pJson),
  82. RyanJsonGetDoubleValue(pJson), RyanJsonGetDoubleValue(pJson)};
  83. RyanJsonAddItemToObject(pJson, (0 != size % 2) ? key : "arrayString",
  84. RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
  85. }
  86. }
  87. if (RyanJsonTrue == RyanJsonIsString(pJson))
  88. {
  89. RyanJsonAddStringToObject(pJson, key, RyanJsonGetStringValue(pJson));
  90. const char *arrayString[] = {RyanJsonGetStringValue(pJson), RyanJsonGetStringValue(pJson), RyanJsonGetStringValue(pJson),
  91. RyanJsonGetStringValue(pJson), RyanJsonGetStringValue(pJson)};
  92. RyanJsonAddItemToObject(pJson, (0 != size % 2) ? key : "arrayString",
  93. RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
  94. }
  95. if (RyanJsonTrue == RyanJsonIsArray(pJson) || RyanJsonTrue == RyanJsonIsObject(pJson))
  96. {
  97. RyanJson_t item;
  98. RyanJsonObjectForEach(pJson, item) { RyanJsonFuzzerTestCreate(item, size); }
  99. RyanJson_t pJson2 = RyanJsonFuzzerCreateRandomNode(pJson);
  100. RyanJsonAddItemToObject(pJson, key, pJson2);
  101. if (RyanJsonTrue == RyanJsonIsArray(pJson))
  102. {
  103. RyanJsonAddNullToArray(pJson);
  104. RyanJsonAddBoolToArray(pJson, 0 != size % 2 ? RyanJsonTrue : RyanJsonFalse);
  105. RyanJsonAddItemToArray(pJson, RyanJsonFuzzerCreateRandomNode(RyanJsonGetArrayValue(pJson)));
  106. }
  107. }
  108. return RyanJsonTrue;
  109. }
  110. RyanJsonBool_e RyanJsonFuzzerTestReplace(RyanJson_t pJson, uint32_t size)
  111. {
  112. {
  113. isEnableRandomMemFail = RyanJsonFalse;
  114. RyanJson_t strItem = RyanJsonCreateString("", "NULL");
  115. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(NULL, NULL, NULL));
  116. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(pJson, NULL, NULL));
  117. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(NULL, "NULL", NULL));
  118. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(NULL, NULL, strItem));
  119. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(pJson, "NULL", NULL));
  120. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(NULL, "NULL", strItem));
  121. if (RyanJsonFalse == RyanJsonIsObject(pJson)) // pJson类型错误
  122. {
  123. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(pJson, "NULL", strItem));
  124. }
  125. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(NULL, 0, NULL));
  126. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(pJson, 0, NULL));
  127. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(NULL, 0, strItem));
  128. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(pJson, 0, NULL));
  129. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(NULL, 0, strItem));
  130. if (RyanJsonFalse == RyanJsonIsArray(pJson) && RyanJsonFalse == RyanJsonIsObject(pJson)) // pJson类型错误
  131. {
  132. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(pJson, 0, strItem));
  133. }
  134. RyanJson_t objItem = RyanJsonCreateObject();
  135. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(objItem, "NULL", strItem));
  136. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(objItem, 0, strItem));
  137. RyanJsonAddItemToObject(objItem, "item", RyanJsonCreateObject());
  138. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(objItem, "NULL222", strItem));
  139. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(objItem, INT32_MAX, strItem));
  140. isEnableRandomMemFail = RyanJsonTrue;
  141. RyanJsonDelete(objItem);
  142. RyanJsonDelete(strItem);
  143. }
  144. // 只处理数组或对象
  145. if (RyanJsonFalse == RyanJsonIsArray(pJson) && RyanJsonFalse == RyanJsonIsObject(pJson)) { return RyanJsonTrue; }
  146. // 递归替换子节点
  147. RyanJson_t item = NULL;
  148. RyanJson_t LastItem = NULL;
  149. RyanJsonObjectForEach(pJson, item)
  150. {
  151. if (RyanJsonTrue != RyanJsonFuzzerTestReplace(item, size)) { return RyanJsonFalse; }
  152. LastItem = item;
  153. }
  154. // 只有非根节点才做替换
  155. // 按 key 替换(仅对象)
  156. // 不要动第一个节点
  157. if (RyanJsonTrue == RyanJsonIsObject(pJson))
  158. {
  159. if (NULL != LastItem && RyanJsonTrue == RyanJsonIsKey(LastItem))
  160. {
  161. RyanJson_t newNode = RyanJsonFuzzerCreateRandomNode(pJson);
  162. if (RyanJsonFalse == RyanJsonReplaceByKey(pJson, RyanJsonGetKey(LastItem), newNode))
  163. {
  164. if (NULL != newNode) { RyanJsonDelete(newNode); }
  165. return RyanJsonFalse;
  166. }
  167. }
  168. }
  169. // 按 index 替换
  170. {
  171. uint32_t idx = RyanJsonGetSize(pJson) % size;
  172. RyanJson_t newNode = RyanJsonFuzzerCreateRandomNode(pJson);
  173. if (RyanJsonFalse == RyanJsonReplaceByIndex(pJson, (0 != size % 25) ? idx : 0, newNode))
  174. {
  175. if (NULL != newNode) { RyanJsonDelete(newNode); }
  176. return RyanJsonFalse;
  177. }
  178. }
  179. return RyanJsonTrue;
  180. }
  181. RyanJsonBool_e RyanJsonFuzzerTestDetach(RyanJson_t pJson, uint32_t size)
  182. {
  183. RyanJsonAssert(RyanJsonFalse == RyanJsonDetachByKey(NULL, NULL));
  184. RyanJsonAssert(RyanJsonFalse == RyanJsonDetachByKey(pJson, NULL));
  185. RyanJsonAssert(RyanJsonFalse == RyanJsonDetachByKey(NULL, "NULL"));
  186. if (RyanJsonFalse == RyanJsonIsObject(pJson)) // pJson类型错误
  187. {
  188. RyanJsonAssert(NULL == RyanJsonDetachByKey(pJson, "NULL"));
  189. }
  190. RyanJsonAssert(NULL == RyanJsonDetachByIndex(NULL, 10));
  191. if (RyanJsonFalse == RyanJsonIsArray(pJson) && RyanJsonFalse == RyanJsonIsObject(pJson)) // pJson类型错误
  192. {
  193. RyanJsonAssert(NULL == RyanJsonDetachByIndex(pJson, 0));
  194. }
  195. if (RyanJsonFalse == RyanJsonIsArray(pJson) && RyanJsonFalse == RyanJsonIsObject(pJson)) { return RyanJsonTrue; }
  196. // 递归遍历子节点
  197. RyanJson_t item = NULL;
  198. RyanJson_t LastItem = NULL;
  199. RyanJsonObjectForEach(pJson, item)
  200. {
  201. RyanJsonFuzzerTestDetach(item, size);
  202. LastItem = item;
  203. }
  204. // 只有非根节点才做 detach
  205. // 按 key 分离(仅对象)
  206. if (RyanJsonTrue == RyanJsonIsObject(pJson))
  207. {
  208. if (NULL != LastItem && RyanJsonTrue == RyanJsonIsKey(LastItem))
  209. {
  210. RyanJson_t detached = RyanJsonDetachByKey(pJson, RyanJsonGetKey(LastItem));
  211. if (NULL != detached) { RyanJsonDelete(detached); }
  212. // RyanJsonAssert(RyanJsonFalse == RyanJsonDetachByKey(pJson, RyanJsonGetKey(LastItem)));
  213. }
  214. }
  215. // 按 index 分离
  216. {
  217. uint32_t idx = RyanJsonGetSize(pJson) % size;
  218. RyanJson_t detached = RyanJsonDetachByIndex(pJson, (0 != size % 25) ? idx : 0);
  219. if (NULL != detached) { RyanJsonDelete(detached); }
  220. }
  221. return RyanJsonTrue;
  222. }
  223. RyanJsonBool_e RyanJsonFuzzerTestDelete(RyanJson_t pJson, uint32_t size)
  224. {
  225. if (RyanJsonFalse == RyanJsonIsArray(pJson) && RyanJsonFalse == RyanJsonIsObject(pJson)) { return RyanJsonTrue; }
  226. // -------- 测试错误的 delete 调用 --------
  227. // Key 删除错误用例
  228. RyanJsonDeleteByKey(pJson, "non_exist_key");
  229. RyanJsonDeleteByKey(NULL, "some_key");
  230. RyanJsonDeleteByKey(pJson, NULL);
  231. RyanJsonDeleteByKey(NULL, NULL);
  232. // Index 删除错误用例
  233. RyanJsonDeleteByIndex(pJson, RyanJsonGetSize(pJson)); // 越界
  234. RyanJsonDeleteByIndex(NULL, (RyanJsonGetSize(pJson) % size));
  235. RyanJsonDeleteByIndex(pJson, (uint32_t)(-(int32_t)size)); // 负数
  236. RyanJsonDeleteByIndex(NULL, (uint32_t)(-(int32_t)size));
  237. // 递归遍历子节点
  238. RyanJson_t item = NULL;
  239. RyanJson_t LastItem = NULL;
  240. RyanJsonObjectForEach(pJson, item)
  241. {
  242. RyanJsonFuzzerTestDelete(item, size);
  243. LastItem = item;
  244. }
  245. // -------- 正常删除逻辑(保护根节点) --------
  246. // 按 key 删除(仅对象)
  247. if (RyanJsonTrue == RyanJsonIsObject(pJson))
  248. {
  249. if (NULL != LastItem && RyanJsonTrue == RyanJsonIsKey(LastItem))
  250. {
  251. // printf("key is %d %s\r\n", RyanJsonGetType(LastItem),
  252. // RyanJsonGetKey(LastItem) == NULL ? "NULL" : RyanJsonGetKey(LastItem));
  253. RyanJsonDeleteByKey(pJson, RyanJsonGetKey(LastItem));
  254. }
  255. }
  256. // 按 index 删除
  257. uint32_t idx = RyanJsonGetSize(pJson) % size;
  258. RyanJsonDeleteByIndex(pJson, (0 != size % 25) ? idx : 0);
  259. return RyanJsonTrue;
  260. }