| /* | |
| * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| #include <memory> | |
| #include <string> | |
| #include <utility> | |
| #include "absl/strings/string_view.h" | |
| #include "api/jsep.h" | |
| #include "api/make_ref_counted.h" | |
| #include "api/peer_connection_interface.h" | |
| #include "api/test/rtc_error_matchers.h" | |
| #include "pc/test/integration_test_helpers.h" | |
| #include "pc/test/mock_peer_connection_observers.h" | |
| #include "rtc_base/checks.h" | |
| #include "test/fuzzers/fuzz_data_helper.h" | |
| #include "test/gmock.h" | |
| #include "test/wait_until.h" | |
| namespace webrtc { | |
| class FuzzerTest : public PeerConnectionIntegrationBaseTest { | |
| public: | |
| FuzzerTest() | |
| : PeerConnectionIntegrationBaseTest(SdpSemantics::kUnifiedPlan) {} | |
| void RunNegotiateCycle(absl::string_view message) { | |
| CreatePeerConnectionWrappers(); | |
| // Note - we do not do test.ConnectFakeSignaling(); all signals | |
| // generated are discarded. | |
| auto srd_observer = | |
| webrtc::make_ref_counted<FakeSetRemoteDescriptionObserver>(); | |
| SdpParseError error; | |
| std::unique_ptr<SessionDescriptionInterface> sdp = | |
| CreateSessionDescription(SdpType::kOffer, std::string(message), &error); | |
| caller()->pc()->SetRemoteDescription(std::move(sdp), srd_observer); | |
| // Wait a short time for observer to be called. Timeout is short | |
| // because the fuzzer should be trying many branches. | |
| EXPECT_THAT( | |
| WaitUntil([&] { return srd_observer->called(); }, ::testing::IsTrue()), | |
| IsRtcOk()); | |
| // If set-remote-description was successful, try to answer. | |
| auto sld_observer = | |
| webrtc::make_ref_counted<FakeSetLocalDescriptionObserver>(); | |
| if (srd_observer->error().ok()) { | |
| caller()->pc()->SetLocalDescription(sld_observer); | |
| EXPECT_THAT(WaitUntil([&] { return sld_observer->called(); }, | |
| ::testing::IsTrue()), | |
| IsRtcOk()); | |
| } | |
| // If there is an EXPECT failure, die here. | |
| RTC_CHECK(!HasFailure()); | |
| } | |
| // This test isn't using the test definition macros, so we have to | |
| // define the TestBody() function, even though we don't need it. | |
| void TestBody() override {} | |
| }; | |
| void FuzzOneInput(FuzzDataHelper fuzz_data) { | |
| if (fuzz_data.size() > 16384) { | |
| return; | |
| } | |
| FuzzerTest test; | |
| test.RunNegotiateCycle(fuzz_data.ReadString()); | |
| } | |
| } // namespace webrtc |