RyanJsonFuzzerDup.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "RyanJsonFuzzer.h"
  2. RyanJsonBool_e RyanJsonFuzzerTestDuplicate(RyanJson_t pJson)
  3. {
  4. RyanJsonBool_e result = RyanJsonTrue;
  5. char *jsonStr = NULL;
  6. char *jsonStrDup = NULL;
  7. RyanJson_t pJsonDup = NULL;
  8. // 测试打印和复制功能
  9. uint32_t len = 0;
  10. uint32_t dupLen = 0;
  11. jsonStr = RyanJsonPrint(pJson, 100, RyanJsonFalse, &len);
  12. RyanJsonCheckGotoExit(NULL != jsonStr && len > 0);
  13. pJsonDup = RyanJsonDuplicate(pJson);
  14. RyanJsonCheckGotoExit(NULL != pJsonDup);
  15. // 测试dup失败情况
  16. RyanJsonCheckGotoExit(NULL == RyanJsonDuplicate(NULL));
  17. // 判断复制json的size是否一致
  18. RyanJsonCheckGotoExit(0 == RyanJsonGetSize(NULL));
  19. RyanJsonCheckGotoExit(RyanJsonGetSize(pJson) == RyanJsonGetSize(pJsonDup));
  20. RyanJsonCompare(pJson, pJsonDup);
  21. RyanJsonCompareOnlyKey(pJson, pJsonDup);
  22. // assert(RyanJsonTrue == RyanJsonCompare(pJson, pJsonDup)); // 大浮点数判断容易出错
  23. // RyanJsonCheckGotoExit(RyanJsonTrue == RyanJsonCompareOnlyKey(pJson, pJsonDup)); // 重复key也会失败
  24. // 测试compare特殊情况
  25. RyanJsonCheckGotoExit(RyanJsonTrue == RyanJsonCompare(pJson, pJson));
  26. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompare(NULL, pJsonDup));
  27. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompare(pJson, NULL));
  28. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompare(NULL, NULL));
  29. // 测试compareKey特殊情况
  30. RyanJsonCheckGotoExit(RyanJsonTrue == RyanJsonCompareOnlyKey(pJson, pJson));
  31. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompareOnlyKey(NULL, pJsonDup));
  32. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompareOnlyKey(pJson, NULL));
  33. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompareOnlyKey(NULL, NULL));
  34. jsonStrDup = RyanJsonPrint(pJsonDup, 100, RyanJsonFalse, &dupLen); // 以带格式方式将数据打印出来
  35. RyanJsonCheckGotoExit(NULL != jsonStrDup && dupLen > 0);
  36. RyanJsonCheckCode(len == dupLen && 0 == memcmp(jsonStr, jsonStrDup, (size_t)len), {
  37. printf("len:%" PRIu32 ", dupLen:%" PRIu32 "\r\n", len, dupLen);
  38. printf("jsonStr:%s, jsonStrDup:%s\r\n", jsonStr, jsonStrDup);
  39. RyanJsonCheckGotoExit(0);
  40. });
  41. if (RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))
  42. {
  43. // 测试size不相等
  44. RyanJsonDelete(RyanJsonDetachByIndex(pJson, 0));
  45. // 增加分支覆盖率
  46. if (RyanJsonGetSize(pJson) > 2) { RyanJsonDelete(RyanJsonDetachByIndex(pJson, 1)); }
  47. if (RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))
  48. {
  49. // 改变key
  50. RyanJson_t item;
  51. RyanJsonObjectForEach(pJson, item)
  52. {
  53. if (RyanJsonIsKey(item))
  54. {
  55. RyanJsonChangeKey(item, "key12231123");
  56. break;
  57. }
  58. }
  59. // 改变value
  60. RyanJsonObjectForEach(pJson, item)
  61. {
  62. if (RyanJsonIsBool(item))
  63. {
  64. RyanJsonChangeBoolValue(item, !RyanJsonGetBoolValue(item));
  65. break;
  66. }
  67. }
  68. // 改变obj的key
  69. RyanJsonObjectForEach(pJson, item)
  70. {
  71. if (RyanJsonIsKey(item) && RyanJsonIsObject(item))
  72. {
  73. RyanJsonChangeKey(item, "key12231123");
  74. break;
  75. }
  76. }
  77. }
  78. RyanJsonCompare(pJson, pJsonDup);
  79. RyanJsonCompareOnlyKey(pJson, pJsonDup);
  80. }
  81. exit__:
  82. if (jsonStr)
  83. {
  84. RyanJsonFree(jsonStr);
  85. jsonStr = NULL;
  86. }
  87. if (pJsonDup)
  88. {
  89. RyanJsonDelete(pJsonDup);
  90. pJsonDup = NULL;
  91. }
  92. if (jsonStrDup)
  93. {
  94. RyanJsonFree(jsonStrDup);
  95. jsonStrDup = NULL;
  96. }
  97. return result;
  98. }