diff options
| author | Vitaly Buka <vitalybuka@google.com> | 2020-07-29 17:45:49 -0700 |
|---|---|---|
| committer | Vitaly Buka <vitalybuka@gmail.com> | 2020-07-29 20:01:18 -0700 |
| commit | 3c50b67e6bd458f852a12d63517345d68d0c6506 (patch) | |
| tree | 70ac645c242cc30198bb5c277ef5e684aa8297d5 | |
| parent | d82b5fb6e6fd87ca3a97d35cfcfb0b1da5a07709 (diff) | |
| download | platform_external_libprotobuf-mutator-3c50b67e6bd458f852a12d63517345d68d0c6506.tar.gz platform_external_libprotobuf-mutator-3c50b67e6bd458f852a12d63517345d68d0c6506.tar.bz2 platform_external_libprotobuf-mutator-3c50b67e6bd458f852a12d63517345d68d0c6506.zip | |
Use gmock in LibFuzzerTest
| -rw-r--r-- | cmake/external/googletest.cmake | 2 | ||||
| -rw-r--r-- | port/gtest.h | 1 | ||||
| -rw-r--r-- | src/libfuzzer/libfuzzer_test.cc | 55 |
3 files changed, 43 insertions, 15 deletions
diff --git a/cmake/external/googletest.cmake b/cmake/external/googletest.cmake index fe71115..3c3f8cf 100644 --- a/cmake/external/googletest.cmake +++ b/cmake/external/googletest.cmake @@ -18,7 +18,7 @@ set(GTEST_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/${GTEST_TARGET}) set(GTEST_INCLUDE_DIRS ${GTEST_INSTALL_DIR}/include) include_directories(${GTEST_INCLUDE_DIRS}) -set(GTEST_LIBRARIES gtest) +set(GTEST_LIBRARIES gtest gmock) set(GTEST_MAIN_LIBRARIES gtest_main) set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) diff --git a/port/gtest.h b/port/gtest.h index 485aa98..60d50b8 100644 --- a/port/gtest.h +++ b/port/gtest.h @@ -15,6 +15,7 @@ #ifndef PORT_GTEST_H_ #define PORT_GTEST_H_ +#include "gmock/gmock.h" #include "gtest/gtest.h" #endif // PORT_GTEST_H_ diff --git a/src/libfuzzer/libfuzzer_test.cc b/src/libfuzzer/libfuzzer_test.cc index e0826c9..f14071e 100644 --- a/src/libfuzzer/libfuzzer_test.cc +++ b/src/libfuzzer/libfuzzer_test.cc @@ -13,30 +13,57 @@ // limitations under the License. #include "port/gtest.h" +#include "port/protobuf.h" #include "src/libfuzzer/libfuzzer_macro.h" #include "src/mutator_test_proto2.pb.h" -static bool reached = false; -static bool postprocessed = false; +using protobuf_mutator::protobuf::util::MessageDifferencer; +using ::testing::_; +using ::testing::AllOf; +using ::testing::DoAll; +using ::testing::Ref; +using ::testing::SaveArg; +using ::testing::SaveArgPointee; +using ::testing::StrictMock; + +static class MockFuzzer* mock_fuzzer; + +class MockFuzzer { + public: + MockFuzzer() { mock_fuzzer = this; } + ~MockFuzzer() { mock_fuzzer = nullptr; } + MOCK_METHOD(void, PostProcess, + (protobuf_mutator::Msg * message, unsigned int seed)); + MOCK_METHOD(void, TestOneInput, (const protobuf_mutator::Msg& message)); +}; protobuf_mutator::libfuzzer::PostProcessorRegistration<protobuf_mutator::Msg> reg = {[](protobuf_mutator::Msg* message, unsigned int seed) { - static unsigned int first_seed = seed; - EXPECT_EQ(seed, first_seed); - postprocessed = true; + mock_fuzzer->PostProcess(message, seed); }}; DEFINE_TEXT_PROTO_FUZZER(const protobuf_mutator::Msg& message) { - reached = true; - EXPECT_TRUE(message.IsInitialized()); - EXPECT_TRUE(postprocessed); + mock_fuzzer->TestOneInput(message); +} + +MATCHER_P(IsMessageEq, msg, "") { + return MessageDifferencer::Equals(arg, msg.get()); } +MATCHER(IsInitialized, "") { return arg.IsInitialized(); } TEST(LibFuzzerTest, LLVMFuzzerTestOneInput) { - for (int i = 0; i < 10; ++i) { - reached = false; - postprocessed = false; - LLVMFuzzerTestOneInput((const uint8_t*)"", 0); - EXPECT_TRUE(reached); - } + unsigned int seed = 0; + testing::StrictMock<MockFuzzer> mock; + protobuf_mutator::Msg msg; + EXPECT_CALL(mock, PostProcess(_, _)) + .WillOnce(DoAll(SaveArgPointee<0>(&msg), SaveArg<1>(&seed))); + EXPECT_CALL( + mock, TestOneInput(AllOf(IsMessageEq(std::cref(msg)), IsInitialized()))); + LLVMFuzzerTestOneInput((const uint8_t*)"", 0); + + EXPECT_CALL(mock, PostProcess(_, seed)).WillOnce(SaveArgPointee<0>(&msg)); + EXPECT_CALL( + mock, TestOneInput(AllOf(IsMessageEq(std::cref(msg)), IsInitialized()))); + LLVMFuzzerTestOneInput((const uint8_t*)"", 0); +} } |
