/*
 *  Copyright 2017 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 <memory>

#include "media/base/fakemediaengine.h"
#include "ortc/ortcfactory.h"
#include "ortc/testrtpparameters.h"
#include "p2p/base/fakepackettransport.h"
#include "rtc_base/gunit.h"

namespace webrtc {

// This test uses fake packet transports and a fake media engine, in order to
// test the RtpTransportController at only an API level. Any end-to-end test
// should go in ortcfactory_integrationtest.cc instead.
//
// Currently, this test mainly focuses on the limitations of the "adapter"
// RtpTransportController implementation. Only one of each type of
// sender/receiver can be created, and the sender/receiver of the same media
// type must use the same transport.
class RtpTransportControllerTest : public testing::Test {
 public:
  RtpTransportControllerTest() {
    // Note: This doesn't need to use fake network classes, since it uses
    // FakePacketTransports.
    auto result =
        OrtcFactory::Create(nullptr, nullptr, nullptr, nullptr, nullptr,
                            std::unique_ptr<cricket::MediaEngineInterface>(
                                new cricket::FakeMediaEngine()));
    ortc_factory_ = result.MoveValue();
    rtp_transport_controller_ =
        ortc_factory_->CreateRtpTransportController().MoveValue();
  }

 protected:
  std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
  std::unique_ptr<RtpTransportControllerInterface> rtp_transport_controller_;
};

TEST_F(RtpTransportControllerTest, GetTransports) {
  rtc::FakePacketTransport packet_transport1("one");
  rtc::FakePacketTransport packet_transport2("two");

  auto rtp_transport_result1 = ortc_factory_->CreateRtpTransport(
      MakeRtcpMuxParameters(), &packet_transport1, nullptr,
      rtp_transport_controller_.get());
  ASSERT_TRUE(rtp_transport_result1.ok());

  auto rtp_transport_result2 = ortc_factory_->CreateRtpTransport(
      MakeRtcpMuxParameters(), &packet_transport2, nullptr,
      rtp_transport_controller_.get());
  ASSERT_TRUE(rtp_transport_result2.ok());

  auto returned_transports = rtp_transport_controller_->GetTransports();
  ASSERT_EQ(2u, returned_transports.size());
  EXPECT_EQ(rtp_transport_result1.value().get(), returned_transports[0]);
  EXPECT_EQ(rtp_transport_result2.value().get(), returned_transports[1]);

  // If a transport is deleted, it shouldn't be returned any more.
  rtp_transport_result1.MoveValue().reset();
  returned_transports = rtp_transport_controller_->GetTransports();
  ASSERT_EQ(1u, returned_transports.size());
  EXPECT_EQ(rtp_transport_result2.value().get(), returned_transports[0]);
}

// Create RtpSenders and RtpReceivers on top of RtpTransports controlled by the
// same RtpTransportController. Currently only one each of audio/video is
// supported.
TEST_F(RtpTransportControllerTest, AttachMultipleSendersAndReceivers) {
  rtc::FakePacketTransport audio_packet_transport("audio");
  rtc::FakePacketTransport video_packet_transport("video");

  auto audio_rtp_transport_result = ortc_factory_->CreateRtpTransport(
      MakeRtcpMuxParameters(), &audio_packet_transport, nullptr,
      rtp_transport_controller_.get());
  ASSERT_TRUE(audio_rtp_transport_result.ok());
  auto audio_rtp_transport = audio_rtp_transport_result.MoveValue();

  auto video_rtp_transport_result = ortc_factory_->CreateRtpTransport(
      MakeRtcpMuxParameters(), &video_packet_transport, nullptr,
      rtp_transport_controller_.get());
  ASSERT_TRUE(video_rtp_transport_result.ok());
  auto video_rtp_transport = video_rtp_transport_result.MoveValue();

  auto audio_sender_result = ortc_factory_->CreateRtpSender(
      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
  EXPECT_TRUE(audio_sender_result.ok());
  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
  EXPECT_TRUE(audio_receiver_result.ok());
  auto video_sender_result = ortc_factory_->CreateRtpSender(
      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
  EXPECT_TRUE(video_sender_result.ok());
  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
  EXPECT_TRUE(video_receiver_result.ok());

  // Now that we have one each of audio/video senders/receivers, trying to
  // create more on top of the same controller is expected to fail.
  // TODO(deadbeef): Update this test once multiple senders/receivers on top of
  // the same controller is supported.
  auto failed_sender_result = ortc_factory_->CreateRtpSender(
      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
            failed_sender_result.error().type());
  auto failed_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
            failed_receiver_result.error().type());
  failed_sender_result = ortc_factory_->CreateRtpSender(
      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
            failed_sender_result.error().type());
  failed_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
            failed_receiver_result.error().type());

  // If we destroy the existing sender/receiver using a transport controller,
  // we should be able to make a new one, despite the above limitation.
  audio_sender_result.MoveValue().reset();
  audio_sender_result = ortc_factory_->CreateRtpSender(
      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
  EXPECT_TRUE(audio_sender_result.ok());
  audio_receiver_result.MoveValue().reset();
  audio_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
  EXPECT_TRUE(audio_receiver_result.ok());
  video_sender_result.MoveValue().reset();
  video_sender_result = ortc_factory_->CreateRtpSender(
      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
  EXPECT_TRUE(video_sender_result.ok());
  video_receiver_result.MoveValue().reset();
  video_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
  EXPECT_TRUE(video_receiver_result.ok());
}

// Given the current limitations of the BaseChannel-based implementation, it's
// not possible for an audio sender and receiver to use different RtpTransports.
// TODO(deadbeef): Once this is supported, update/replace this test.
TEST_F(RtpTransportControllerTest,
       SenderAndReceiverUsingDifferentTransportsUnsupported) {
  rtc::FakePacketTransport packet_transport1("one");
  rtc::FakePacketTransport packet_transport2("two");

  auto rtp_transport_result1 = ortc_factory_->CreateRtpTransport(
      MakeRtcpMuxParameters(), &packet_transport1, nullptr,
      rtp_transport_controller_.get());
  ASSERT_TRUE(rtp_transport_result1.ok());
  auto rtp_transport1 = rtp_transport_result1.MoveValue();

  auto rtp_transport_result2 = ortc_factory_->CreateRtpTransport(
      MakeRtcpMuxParameters(), &packet_transport2, nullptr,
      rtp_transport_controller_.get());
  ASSERT_TRUE(rtp_transport_result2.ok());
  auto rtp_transport2 = rtp_transport_result2.MoveValue();

  // Create an audio sender on transport 1, then try to create a receiver on 2.
  auto audio_sender_result = ortc_factory_->CreateRtpSender(
      cricket::MEDIA_TYPE_AUDIO, rtp_transport1.get());
  EXPECT_TRUE(audio_sender_result.ok());
  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_AUDIO, rtp_transport2.get());
  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
            audio_receiver_result.error().type());
  // Delete the sender; now we should be ok to create the receiver on 2.
  audio_sender_result.MoveValue().reset();
  audio_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_AUDIO, rtp_transport2.get());
  EXPECT_TRUE(audio_receiver_result.ok());

  // Do the same thing for video, reversing 1 and 2 (for variety).
  auto video_sender_result = ortc_factory_->CreateRtpSender(
      cricket::MEDIA_TYPE_VIDEO, rtp_transport2.get());
  EXPECT_TRUE(video_sender_result.ok());
  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_VIDEO, rtp_transport1.get());
  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
            video_receiver_result.error().type());
  video_sender_result.MoveValue().reset();
  video_receiver_result = ortc_factory_->CreateRtpReceiver(
      cricket::MEDIA_TYPE_VIDEO, rtp_transport1.get());
  EXPECT_TRUE(video_receiver_result.ok());
}

}  // namespace webrtc
