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