webrtc/ortc/rtptransportcontroller_unittest.cc
Zhi Huang e830e683c4 Use new TransportController implementation in PeerConnection.
The TransportController will be replaced by the JsepTransportController
and JsepTransport will be replace be JsepTransport2.

The JsepTransportController will take the entire SessionDescription
and handle the RtcpMux, Sdes and BUNDLE internally.

The ownership model is also changed. The P2P layer transports are not
ref-counted and will be owned by the JsepTransport2.

In ORTC aspect, RtpTransportAdapter is now a wrapper over RtpTransport
or SrtpTransport and it implements the public and internal interface
by calling the transport underneath.

Bug: webrtc:8587
Change-Id: Ia7fa61288a566f211f8560072ea0eecaf19e48df
Reviewed-on: https://webrtc-review.googlesource.com/59586
Commit-Queue: Zhi Huang <zhihuang@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22693}
2018-03-30 18:41:19 +00:00

199 lines
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 "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#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()),
CreateBuiltinAudioEncoderFactory(), CreateBuiltinAudioDecoderFactory());
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