From dbd31508fa39f1a84b4c928bdaeed2c9a3f5e834 Mon Sep 17 00:00:00 2001 From: Janusz Sobczak Date: Wed, 22 Mar 2023 18:03:31 -0700 Subject: [PATCH] Add medium fuzzing tests PiperOrigin-RevId: 518722768 --- fastpair/message_stream/BUILD | 1 + fastpair/message_stream/medium_test.cc | 59 ++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/fastpair/message_stream/BUILD b/fastpair/message_stream/BUILD index a1065b83..7c01b9a7 100644 --- a/fastpair/message_stream/BUILD +++ b/fastpair/message_stream/BUILD @@ -107,6 +107,7 @@ cc_test( "//internal/platform:test_util", "//internal/platform:types", "//internal/platform/implementation/g3", # build_cleaner: keep + "//testing/fuzzing:fuzztest", "@com_github_protobuf_matchers//protobuf-matchers", "@com_google_absl//absl/status", "@com_google_absl//absl/strings", diff --git a/fastpair/message_stream/medium_test.cc b/fastpair/message_stream/medium_test.cc index 1244174c..1fb68b49 100644 --- a/fastpair/message_stream/medium_test.cc +++ b/fastpair/message_stream/medium_test.cc @@ -23,6 +23,7 @@ #include "gmock/gmock.h" #include "protobuf-matchers/protocol-buffer-matchers.h" #include "gtest/gtest.h" +#include "testing/fuzzing/fuzztest.h" #include "absl/status/status.h" #include "absl/strings/escaping.h" #include "absl/time/clock.h" @@ -58,6 +59,7 @@ class MediumTest : public testing::Test { provider_.Shutdown(); MediumEnvironment::Instance().Stop(); } + // The medium environment must be initialized (started) before adding // adapters. MediumEnvironmentStarter env_; @@ -185,6 +187,63 @@ TEST_F(MediumTest, ReceiveMessage) { EXPECT_EQ(messages[0], expected_message); } +class MediumFuzzTest : public fuzztest::PerIterationFixtureAdapter { + public: + void HandlesAnyInput(absl::string_view input) { + FastPairDevice fp_device("model id", "ble address", + Protocol::kFastPairRetroactivePairing); + fp_device.set_public_address(provider_.GetMacAddress()); + provider_.DiscoverProvider(seeker_medium_); + provider_.EnableProviderRfcomm(); + Medium medium = Medium( + fp_device, std::optional(&seeker_medium_), + observer_); + ASSERT_OK(medium.OpenRfcomm()); + ASSERT_TRUE(observer_.connection_result_.Get().ok()); + + provider_.WriteProviderBytes(std::string(input)); + provider_.DisableProviderRfcomm(); + } + + void HandlesValidInput(uint8_t group, uint8_t code, + absl::string_view payload) { + Message expected_message = { + .message_group = static_cast(group), + .message_code = static_cast(code), + .payload = std::string(payload)}; + FastPairDevice fp_device("model id", "ble address", + Protocol::kFastPairRetroactivePairing); + fp_device.set_public_address(provider_.GetMacAddress()); + provider_.DiscoverProvider(seeker_medium_); + provider_.EnableProviderRfcomm(); + Medium medium = Medium( + fp_device, std::optional(&seeker_medium_), + observer_); + ASSERT_OK(medium.OpenRfcomm()); + ASSERT_TRUE(observer_.connection_result_.Get().ok()); + + provider_.WriteProviderBytes( + {static_cast(group), static_cast(code)}); + uint16_t length = payload.length(); + provider_.WriteProviderBytes( + {static_cast(length >> 8), static_cast(length)}); + provider_.WriteProviderBytes(std::string(payload)); + ASSERT_OK(observer_.WaitForMessages(1, absl::Seconds(10))); + std::vector messages = observer_.GetMessages(); + ASSERT_EQ(messages.size(), 1); + EXPECT_EQ(messages[0], expected_message); + provider_.DisableProviderRfcomm(); + } +}; + +FUZZ_TEST_F(MediumFuzzTest, HandlesAnyInput) + .WithDomains(fuzztest::Arbitrary()); + +FUZZ_TEST_F(MediumFuzzTest, HandlesValidInput) + .WithDomains(/*group=*/fuzztest::Arbitrary(), + /*code=*/fuzztest::Arbitrary(), + /*payload=*/fuzztest::Arbitrary()); + } // namespace } // namespace fastpair } // namespace nearby