mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 06:10:40 +01:00

In https://webrtc-review.googlesource.com/c/src/+/1560 we moved WebRTC from src/webrtc to src/ (in order to preserve an healthy git history). This CL takes care of fixing header guards, #include paths, etc... NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true TBR=tommi@webrtc.org Bug: chromium:611808 Change-Id: Iea91618212bee0af16aa3f05071eab8f93706578 Reviewed-on: https://webrtc-review.googlesource.com/1561 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Henrik Kjellander <kjellander@webrtc.org> Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org> Cr-Commit-Position: refs/heads/master@{#19846}
195 lines
8.9 KiB
C++
195 lines
8.9 KiB
C++
/*
|
|
* 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
|