FuzzerUnittest.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "FuzzerInternal.h"
  2. #include "gtest/gtest.h"
  3. #include <set>
  4. // For now, have LLVMFuzzerTestOneInput just to make it link.
  5. // Later we may want to make unittests that actually call LLVMFuzzerTestOneInput.
  6. extern "C" void LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
  7. abort();
  8. }
  9. TEST(Fuzzer, CrossOver) {
  10. using namespace fuzzer;
  11. Unit A({0, 1, 2}), B({5, 6, 7});
  12. Unit C;
  13. Unit Expected[] = {
  14. { 0 },
  15. { 0, 1 },
  16. { 0, 5 },
  17. { 0, 1, 2 },
  18. { 0, 1, 5 },
  19. { 0, 5, 1 },
  20. { 0, 5, 6 },
  21. { 0, 1, 2, 5 },
  22. { 0, 1, 5, 2 },
  23. { 0, 1, 5, 6 },
  24. { 0, 5, 1, 2 },
  25. { 0, 5, 1, 6 },
  26. { 0, 5, 6, 1 },
  27. { 0, 5, 6, 7 },
  28. { 0, 1, 2, 5, 6 },
  29. { 0, 1, 5, 2, 6 },
  30. { 0, 1, 5, 6, 2 },
  31. { 0, 1, 5, 6, 7 },
  32. { 0, 5, 1, 2, 6 },
  33. { 0, 5, 1, 6, 2 },
  34. { 0, 5, 1, 6, 7 },
  35. { 0, 5, 6, 1, 2 },
  36. { 0, 5, 6, 1, 7 },
  37. { 0, 5, 6, 7, 1 },
  38. { 0, 1, 2, 5, 6, 7 },
  39. { 0, 1, 5, 2, 6, 7 },
  40. { 0, 1, 5, 6, 2, 7 },
  41. { 0, 1, 5, 6, 7, 2 },
  42. { 0, 5, 1, 2, 6, 7 },
  43. { 0, 5, 1, 6, 2, 7 },
  44. { 0, 5, 1, 6, 7, 2 },
  45. { 0, 5, 6, 1, 2, 7 },
  46. { 0, 5, 6, 1, 7, 2 },
  47. { 0, 5, 6, 7, 1, 2 }
  48. };
  49. for (size_t Len = 1; Len < 8; Len++) {
  50. std::set<Unit> FoundUnits, ExpectedUnitsWitThisLength;
  51. for (int Iter = 0; Iter < 3000; Iter++) {
  52. C.resize(Len);
  53. size_t NewSize = CrossOver(A.data(), A.size(), B.data(), B.size(),
  54. C.data(), C.size());
  55. C.resize(NewSize);
  56. FoundUnits.insert(C);
  57. }
  58. for (const Unit &U : Expected)
  59. if (U.size() <= Len)
  60. ExpectedUnitsWitThisLength.insert(U);
  61. EXPECT_EQ(ExpectedUnitsWitThisLength, FoundUnits);
  62. }
  63. }
  64. TEST(Fuzzer, Hash) {
  65. uint8_t A[] = {'a', 'b', 'c'};
  66. fuzzer::Unit U(A, A + sizeof(A));
  67. EXPECT_EQ("a9993e364706816aba3e25717850c26c9cd0d89d", fuzzer::Hash(U));
  68. U.push_back('d');
  69. EXPECT_EQ("81fe8bfe87576c3ecb22426f8e57847382917acf", fuzzer::Hash(U));
  70. }