/*
 *  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
