aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2020-07-29 17:45:49 -0700
committerVitaly Buka <vitalybuka@gmail.com>2020-07-29 20:01:18 -0700
commit3c50b67e6bd458f852a12d63517345d68d0c6506 (patch)
tree70ac645c242cc30198bb5c277ef5e684aa8297d5
parentd82b5fb6e6fd87ca3a97d35cfcfb0b1da5a07709 (diff)
downloadplatform_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.cmake2
-rw-r--r--port/gtest.h1
-rw-r--r--src/libfuzzer/libfuzzer_test.cc55
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);
+}
}