Index: lib/Fuzzer/CMakeLists.txt =================================================================== --- lib/Fuzzer/CMakeLists.txt +++ lib/Fuzzer/CMakeLists.txt @@ -1,15 +1,17 @@ # Disable the coverage instrumentation for the fuzzer itself. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2 -fsanitize-coverage=0") if( LLVM_USE_SANITIZE_COVERAGE ) - add_library(LLVMFuzzer STATIC - EXCLUDE_FROM_ALL # Do not build if you are not building fuzzers. + add_library(LLVMFuzzerNoMain OBJECT FuzzerCrossOver.cpp FuzzerIO.cpp FuzzerLoop.cpp - FuzzerMain.cpp FuzzerMutate.cpp FuzzerUtil.cpp ) + add_library(LLVMFuzzer STATIC + FuzzerMain.cpp + $ + ) if( LLVM_INCLUDE_TESTS ) add_subdirectory(test) Index: lib/Fuzzer/test/CMakeLists.txt =================================================================== --- lib/Fuzzer/test/CMakeLists.txt +++ lib/Fuzzer/test/CMakeLists.txt @@ -25,19 +25,36 @@ set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}) endforeach() +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in + ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg + ) + +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/unit/lit.site.cfg.in + ${CMAKE_CURRENT_BINARY_DIR}/unit/lit.site.cfg + ) + +include_directories(..) +include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) + +add_executable(LLVMFuzzer-Unittest + FuzzerUnittest.cpp + $ + ) + +target_link_libraries(LLVMFuzzer-Unittest + gtest + gtest_main + ) + +set(TestBinaries ${TestBinaries} LLVMFuzzer-Unittest) + set_target_properties(${TestBinaries} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) -set(EXCLUDE_FROM_ALL TRUE) add_lit_testsuite(check-fuzzer "Running Fuzzer tests" ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${TestBinaries} + DEPENDS ${TestBinaries} LLVMFuzzer-Unittest ) -set(EXCLUDE_FROM_ALL FALSE) - -configure_lit_site_cfg( - ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in - ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg - ) - Index: lib/Fuzzer/test/FuzzerUnittest.cpp =================================================================== --- lib/Fuzzer/test/FuzzerUnittest.cpp +++ lib/Fuzzer/test/FuzzerUnittest.cpp @@ -1,13 +1,62 @@ #include "FuzzerInternal.h" +#include "gtest/gtest.h" +#include -int main() { +// For now, have TestOneInput just to make it link. +// Later may want to make unittests that actuall call TestOneInput. +extern "C" void TestOneInput(const uint8_t *Data, size_t Size) { + abort(); +} + +TEST(Fuzzer, CrossOver) { using namespace fuzzer; - Unit A({0, 1, 2, 3, 4}), B({5, 6, 7, 8, 9}); + Unit A({0, 1, 2}), B({5, 6, 7}); Unit C; - for (size_t Len = 1; Len < 15; Len++) { - for (int Iter = 0; Iter < 1000; Iter++) { + Unit Expected[] = { + { 0 }, + { 0, 1 }, + { 0, 5 }, + { 0, 1, 2 }, + { 0, 1, 5 }, + { 0, 5, 1 }, + { 0, 5, 6 }, + { 0, 1, 2, 5 }, + { 0, 1, 5, 2 }, + { 0, 1, 5, 6 }, + { 0, 5, 1, 2 }, + { 0, 5, 1, 6 }, + { 0, 5, 6, 1 }, + { 0, 5, 6, 7 }, + { 0, 1, 2, 5, 6 }, + { 0, 1, 5, 2, 6 }, + { 0, 1, 5, 6, 2 }, + { 0, 1, 5, 6, 7 }, + { 0, 5, 1, 2, 6 }, + { 0, 5, 1, 6, 2 }, + { 0, 5, 1, 6, 7 }, + { 0, 5, 6, 1, 2 }, + { 0, 5, 6, 1, 7 }, + { 0, 5, 6, 7, 1 }, + { 0, 1, 2, 5, 6, 7 }, + { 0, 1, 5, 2, 6, 7 }, + { 0, 1, 5, 6, 2, 7 }, + { 0, 1, 5, 6, 7, 2 }, + { 0, 5, 1, 2, 6, 7 }, + { 0, 5, 1, 6, 2, 7 }, + { 0, 5, 1, 6, 7, 2 }, + { 0, 5, 6, 1, 2, 7 }, + { 0, 5, 6, 1, 7, 2 }, + { 0, 5, 6, 7, 1, 2 } + }; + for (size_t Len = 1; Len < 8; Len++) { + std::set FoundUnits, ExpectedUnitsWitThisLength; + for (int Iter = 0; Iter < 3000; Iter++) { CrossOver(A, B, &C, Len); - Print(C); + FoundUnits.insert(C); } + for (const Unit &U : Expected) + if (U.size() <= Len) + ExpectedUnitsWitThisLength.insert(U); + EXPECT_EQ(ExpectedUnitsWitThisLength, FoundUnits); } } Index: lib/Fuzzer/test/TestFuzzerCrossOver.cpp =================================================================== --- lib/Fuzzer/test/TestFuzzerCrossOver.cpp +++ lib/Fuzzer/test/TestFuzzerCrossOver.cpp @@ -1,13 +0,0 @@ -#include "FuzzerInternal.h" - -int main() { - using namespace fuzzer; - Unit A({0, 1, 2, 3, 4}), B({5, 6, 7, 8, 9}); - Unit C; - for (size_t Len = 1; Len < 15; Len++) { - for (int Iter = 0; Iter < 1000; Iter++) { - CrossOver(A, B, &C, Len); - Print(C); - } - } -} Index: lib/Fuzzer/test/unit/lit.cfg =================================================================== --- /dev/null +++ lib/Fuzzer/test/unit/lit.cfg @@ -0,0 +1,7 @@ +import lit.formats + +config.name = "LLVMFuzzer-Unittest" +print config.test_exec_root +config.test_format = lit.formats.GoogleTest(".", "Unittest") +config.suffixes = [] +config.test_source_root = config.test_exec_root Index: lib/Fuzzer/test/unit/lit.site.cfg.in =================================================================== --- /dev/null +++ lib/Fuzzer/test/unit/lit.site.cfg.in @@ -0,0 +1,2 @@ +config.test_exec_root = "@CMAKE_CURRENT_BINARY_DIR@" +lit_config.load_config(config, "@CMAKE_CURRENT_SOURCE_DIR@/unit/lit.cfg")