blob: 46fbe7f1247261ba6c925174c196c6aa8b2f7269 [file] [log] [blame]
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001/*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
Stefan Holmer9fea80f2016-01-07 17:43:18 +010010#ifndef WEBRTC_TEST_CALL_TEST_H_
11#define WEBRTC_TEST_CALL_TEST_H_
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000012
13#include <vector>
14
15#include "webrtc/call.h"
Stefan Holmer9fea80f2016-01-07 17:43:18 +010016#include "webrtc/call/transport_adapter.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010017#include "webrtc/system_wrappers/include/scoped_vector.h"
Stefan Holmer9fea80f2016-01-07 17:43:18 +010018#include "webrtc/test/fake_audio_device.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000019#include "webrtc/test/fake_decoder.h"
20#include "webrtc/test/fake_encoder.h"
21#include "webrtc/test/frame_generator_capturer.h"
22#include "webrtc/test/rtp_rtcp_observer.h"
23
24namespace webrtc {
Stefan Holmer9fea80f2016-01-07 17:43:18 +010025
26class VoEBase;
27class VoECodec;
28class VoENetwork;
29
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000030namespace test {
31
32class BaseTest;
33
34class CallTest : public ::testing::Test {
35 public:
36 CallTest();
Stefan Holmer9fea80f2016-01-07 17:43:18 +010037 virtual ~CallTest();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000038
39 static const size_t kNumSsrcs = 3;
40
Peter Boström5811a392015-12-10 13:02:50 +010041 static const int kDefaultTimeoutMs;
42 static const int kLongTimeoutMs;
Stefan Holmer9fea80f2016-01-07 17:43:18 +010043 static const uint8_t kVideoSendPayloadType;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000044 static const uint8_t kSendRtxPayloadType;
Stefan Holmer9fea80f2016-01-07 17:43:18 +010045 static const uint8_t kFakeVideoSendPayloadType;
stefan@webrtc.org01581da2014-09-04 06:48:14 +000046 static const uint8_t kRedPayloadType;
Shao Changbine62202f2015-04-21 20:24:50 +080047 static const uint8_t kRtxRedPayloadType;
stefan@webrtc.org01581da2014-09-04 06:48:14 +000048 static const uint8_t kUlpfecPayloadType;
Stefan Holmer9fea80f2016-01-07 17:43:18 +010049 static const uint8_t kAudioSendPayloadType;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +000050 static const uint32_t kSendRtxSsrcs[kNumSsrcs];
Stefan Holmer9fea80f2016-01-07 17:43:18 +010051 static const uint32_t kVideoSendSsrcs[kNumSsrcs];
52 static const uint32_t kAudioSendSsrc;
53 static const uint32_t kReceiverLocalVideoSsrc;
54 static const uint32_t kReceiverLocalAudioSsrc;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000055 static const int kNackRtpHistoryMs;
56
57 protected:
Stefan Holmer9fea80f2016-01-07 17:43:18 +010058 // RunBaseTest overwrites the audio_state and the voice_engine of the send and
59 // receive Call configs to simplify test code and avoid having old VoiceEngine
60 // APIs in the tests.
stefanf116bd02015-10-27 08:29:42 -070061 void RunBaseTest(BaseTest* test, const FakeNetworkPipe::Config& config);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000062
63 void CreateCalls(const Call::Config& sender_config,
64 const Call::Config& receiver_config);
65 void CreateSenderCall(const Call::Config& config);
66 void CreateReceiverCall(const Call::Config& config);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020067 void DestroyCalls();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000068
Stefan Holmer9fea80f2016-01-07 17:43:18 +010069 void CreateSendConfig(size_t num_video_streams,
70 size_t num_audio_streams,
71 Transport* send_transport);
pbos2d566682015-09-28 09:59:31 -070072 void CreateMatchingReceiveConfigs(Transport* rtcp_send_transport);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000073
74 void CreateFrameGeneratorCapturer();
Stefan Holmer9fea80f2016-01-07 17:43:18 +010075 void CreateFakeAudioDevices();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000076
Stefan Holmer9fea80f2016-01-07 17:43:18 +010077 void CreateVideoStreams();
78 void CreateAudioStreams();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000079 void Start();
80 void Stop();
81 void DestroyStreams();
82
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +000083 Clock* const clock_;
84
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000085 rtc::scoped_ptr<Call> sender_call_;
stefanf116bd02015-10-27 08:29:42 -070086 rtc::scoped_ptr<PacketTransport> send_transport_;
stefanff483612015-12-21 03:14:00 -080087 VideoSendStream::Config video_send_config_;
88 VideoEncoderConfig video_encoder_config_;
89 VideoSendStream* video_send_stream_;
Stefan Holmer9fea80f2016-01-07 17:43:18 +010090 AudioSendStream::Config audio_send_config_;
91 AudioSendStream* audio_send_stream_;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000092
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000093 rtc::scoped_ptr<Call> receiver_call_;
stefanf116bd02015-10-27 08:29:42 -070094 rtc::scoped_ptr<PacketTransport> receive_transport_;
stefanff483612015-12-21 03:14:00 -080095 std::vector<VideoReceiveStream::Config> video_receive_configs_;
96 std::vector<VideoReceiveStream*> video_receive_streams_;
Stefan Holmer9fea80f2016-01-07 17:43:18 +010097 std::vector<AudioReceiveStream::Config> audio_receive_configs_;
98 std::vector<AudioReceiveStream*> audio_receive_streams_;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000099
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000100 rtc::scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000101 test::FakeEncoder fake_encoder_;
pbos@webrtc.org776e6f22014-10-29 15:28:39 +0000102 ScopedVector<VideoDecoder> allocated_decoders_;
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100103 size_t num_video_streams_;
104 size_t num_audio_streams_;
105
106 private:
107 // TODO(holmer): Remove once VoiceEngine is fully refactored to the new API.
108 // These methods are used to set up legacy voice engines and channels which is
109 // necessary while voice engine is being refactored to the new stream API.
110 struct VoiceEngineState {
111 VoiceEngineState()
112 : voice_engine(nullptr),
113 base(nullptr),
114 network(nullptr),
115 codec(nullptr),
116 channel_id(-1),
117 transport_adapter(nullptr) {}
118
119 VoiceEngine* voice_engine;
120 VoEBase* base;
121 VoENetwork* network;
122 VoECodec* codec;
123 int channel_id;
124 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter;
125 };
126
127 void CreateVoiceEngines();
128 void SetupVoiceEngineTransports(PacketTransport* send_transport,
129 PacketTransport* recv_transport);
130 void DestroyVoiceEngines();
131
132 VoiceEngineState voe_send_;
133 VoiceEngineState voe_recv_;
134
135 // The audio devices must outlive the voice engines.
136 rtc::scoped_ptr<test::FakeAudioDevice> fake_send_audio_device_;
137 rtc::scoped_ptr<test::FakeAudioDevice> fake_recv_audio_device_;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000138};
139
140class BaseTest : public RtpRtcpObserver {
141 public:
142 explicit BaseTest(unsigned int timeout_ms);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000143 virtual ~BaseTest();
144
145 virtual void PerformTest() = 0;
146 virtual bool ShouldCreateReceivers() const = 0;
147
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100148 virtual size_t GetNumVideoStreams() const;
149 virtual size_t GetNumAudioStreams() const;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000150
151 virtual Call::Config GetSenderCallConfig();
152 virtual Call::Config GetReceiverCallConfig();
153 virtual void OnCallsCreated(Call* sender_call, Call* receiver_call);
stefanf116bd02015-10-27 08:29:42 -0700154 virtual void OnTransportsCreated(PacketTransport* send_transport,
155 PacketTransport* receive_transport);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000156
stefanff483612015-12-21 03:14:00 -0800157 virtual void ModifyVideoConfigs(
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000158 VideoSendStream::Config* send_config,
159 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000160 VideoEncoderConfig* encoder_config);
stefanff483612015-12-21 03:14:00 -0800161 virtual void OnVideoStreamsCreated(
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000162 VideoSendStream* send_stream,
163 const std::vector<VideoReceiveStream*>& receive_streams);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000164
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100165 virtual void ModifyAudioConfigs(
166 AudioSendStream::Config* send_config,
167 std::vector<AudioReceiveStream::Config>* receive_configs);
168 virtual void OnAudioStreamsCreated(
169 AudioSendStream* send_stream,
170 const std::vector<AudioReceiveStream*>& receive_streams);
171
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000172 virtual void OnFrameGeneratorCapturerCreated(
173 FrameGeneratorCapturer* frame_generator_capturer);
174};
175
176class SendTest : public BaseTest {
177 public:
178 explicit SendTest(unsigned int timeout_ms);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000179
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000180 bool ShouldCreateReceivers() const override;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000181};
182
183class EndToEndTest : public BaseTest {
184 public:
185 explicit EndToEndTest(unsigned int timeout_ms);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000186
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000187 bool ShouldCreateReceivers() const override;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000188};
189
190} // namespace test
191} // namespace webrtc
192
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100193#endif // WEBRTC_TEST_CALL_TEST_H_