1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2018 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker #ifndef TEST_SCENARIO_CALL_CLIENT_H_ 11*d9f75844SAndroid Build Coastguard Worker #define TEST_SCENARIO_CALL_CLIENT_H_ 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include <map> 14*d9f75844SAndroid Build Coastguard Worker #include <memory> 15*d9f75844SAndroid Build Coastguard Worker #include <string> 16*d9f75844SAndroid Build Coastguard Worker #include <utility> 17*d9f75844SAndroid Build Coastguard Worker #include <vector> 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include "api/rtc_event_log/rtc_event_log.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/test/time_controller.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/units/data_rate.h" 22*d9f75844SAndroid Build Coastguard Worker #include "call/call.h" 23*d9f75844SAndroid Build Coastguard Worker #include "modules/audio_device/include/test_audio_device.h" 24*d9f75844SAndroid Build Coastguard Worker #include "modules/congestion_controller/goog_cc/test/goog_cc_printer.h" 25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/task_queue_for_test.h" 26*d9f75844SAndroid Build Coastguard Worker #include "test/logging/log_writer.h" 27*d9f75844SAndroid Build Coastguard Worker #include "test/network/network_emulation.h" 28*d9f75844SAndroid Build Coastguard Worker #include "test/scenario/column_printer.h" 29*d9f75844SAndroid Build Coastguard Worker #include "test/scenario/network_node.h" 30*d9f75844SAndroid Build Coastguard Worker #include "test/scenario/scenario_config.h" 31*d9f75844SAndroid Build Coastguard Worker 32*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 33*d9f75844SAndroid Build Coastguard Worker 34*d9f75844SAndroid Build Coastguard Worker namespace test { 35*d9f75844SAndroid Build Coastguard Worker // Helper class to capture network controller state. 36*d9f75844SAndroid Build Coastguard Worker class NetworkControleUpdateCache : public NetworkControllerInterface { 37*d9f75844SAndroid Build Coastguard Worker public: 38*d9f75844SAndroid Build Coastguard Worker explicit NetworkControleUpdateCache( 39*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<NetworkControllerInterface> controller); 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnNetworkAvailability(NetworkAvailability msg) override; 42*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnNetworkRouteChange(NetworkRouteChange msg) override; 43*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnProcessInterval(ProcessInterval msg) override; 44*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnRemoteBitrateReport(RemoteBitrateReport msg) override; 45*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnRoundTripTimeUpdate(RoundTripTimeUpdate msg) override; 46*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnSentPacket(SentPacket msg) override; 47*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnReceivedPacket(ReceivedPacket msg) override; 48*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnStreamsConfig(StreamsConfig msg) override; 49*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnTargetRateConstraints( 50*d9f75844SAndroid Build Coastguard Worker TargetRateConstraints msg) override; 51*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnTransportLossReport(TransportLossReport msg) override; 52*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnTransportPacketsFeedback( 53*d9f75844SAndroid Build Coastguard Worker TransportPacketsFeedback msg) override; 54*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate OnNetworkStateEstimate( 55*d9f75844SAndroid Build Coastguard Worker NetworkStateEstimate msg) override; 56*d9f75844SAndroid Build Coastguard Worker 57*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate update_state() const; 58*d9f75844SAndroid Build Coastguard Worker 59*d9f75844SAndroid Build Coastguard Worker private: 60*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate Update(NetworkControlUpdate update); 61*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<NetworkControllerInterface> controller_; 62*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate update_state_; 63*d9f75844SAndroid Build Coastguard Worker }; 64*d9f75844SAndroid Build Coastguard Worker 65*d9f75844SAndroid Build Coastguard Worker class LoggingNetworkControllerFactory 66*d9f75844SAndroid Build Coastguard Worker : public NetworkControllerFactoryInterface { 67*d9f75844SAndroid Build Coastguard Worker public: 68*d9f75844SAndroid Build Coastguard Worker LoggingNetworkControllerFactory(LogWriterFactoryInterface* log_writer_factory, 69*d9f75844SAndroid Build Coastguard Worker TransportControllerConfig config); 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker ~LoggingNetworkControllerFactory(); 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker LoggingNetworkControllerFactory(const LoggingNetworkControllerFactory&) = 74*d9f75844SAndroid Build Coastguard Worker delete; 75*d9f75844SAndroid Build Coastguard Worker LoggingNetworkControllerFactory& operator=( 76*d9f75844SAndroid Build Coastguard Worker const LoggingNetworkControllerFactory&) = delete; 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<NetworkControllerInterface> Create( 79*d9f75844SAndroid Build Coastguard Worker NetworkControllerConfig config) override; 80*d9f75844SAndroid Build Coastguard Worker TimeDelta GetProcessInterval() const override; 81*d9f75844SAndroid Build Coastguard Worker // TODO(srte): Consider using the Columnprinter interface for this. 82*d9f75844SAndroid Build Coastguard Worker void LogCongestionControllerStats(Timestamp at_time); 83*d9f75844SAndroid Build Coastguard Worker void SetRemoteBitrateEstimate(RemoteBitrateReport msg); 84*d9f75844SAndroid Build Coastguard Worker 85*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate GetUpdate() const; 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker private: 88*d9f75844SAndroid Build Coastguard Worker GoogCcDebugFactory goog_cc_factory_; 89*d9f75844SAndroid Build Coastguard Worker NetworkControllerFactoryInterface* cc_factory_ = nullptr; 90*d9f75844SAndroid Build Coastguard Worker bool print_cc_state_ = false; 91*d9f75844SAndroid Build Coastguard Worker NetworkControleUpdateCache* last_controller_ = nullptr; 92*d9f75844SAndroid Build Coastguard Worker }; 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker struct CallClientFakeAudio { 95*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<AudioProcessing> apm; 96*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<TestAudioDeviceModule> fake_audio_device; 97*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<AudioState> audio_state; 98*d9f75844SAndroid Build Coastguard Worker }; 99*d9f75844SAndroid Build Coastguard Worker // CallClient represents a participant in a call scenario. It is created by the 100*d9f75844SAndroid Build Coastguard Worker // Scenario class and is used as sender and receiver when setting up a media 101*d9f75844SAndroid Build Coastguard Worker // stream session. 102*d9f75844SAndroid Build Coastguard Worker class CallClient : public EmulatedNetworkReceiverInterface { 103*d9f75844SAndroid Build Coastguard Worker public: 104*d9f75844SAndroid Build Coastguard Worker CallClient(TimeController* time_controller, 105*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<LogWriterFactoryInterface> log_writer_factory, 106*d9f75844SAndroid Build Coastguard Worker CallClientConfig config); 107*d9f75844SAndroid Build Coastguard Worker 108*d9f75844SAndroid Build Coastguard Worker ~CallClient(); 109*d9f75844SAndroid Build Coastguard Worker 110*d9f75844SAndroid Build Coastguard Worker CallClient(const CallClient&) = delete; 111*d9f75844SAndroid Build Coastguard Worker CallClient& operator=(const CallClient&) = delete; 112*d9f75844SAndroid Build Coastguard Worker 113*d9f75844SAndroid Build Coastguard Worker ColumnPrinter StatsPrinter(); 114*d9f75844SAndroid Build Coastguard Worker Call::Stats GetStats(); send_bandwidth()115*d9f75844SAndroid Build Coastguard Worker DataRate send_bandwidth() { 116*d9f75844SAndroid Build Coastguard Worker return DataRate::BitsPerSec(GetStats().send_bandwidth_bps); 117*d9f75844SAndroid Build Coastguard Worker } 118*d9f75844SAndroid Build Coastguard Worker DataRate target_rate() const; 119*d9f75844SAndroid Build Coastguard Worker DataRate stable_target_rate() const; 120*d9f75844SAndroid Build Coastguard Worker DataRate padding_rate() const; 121*d9f75844SAndroid Build Coastguard Worker void UpdateBitrateConstraints(const BitrateConstraints& constraints); 122*d9f75844SAndroid Build Coastguard Worker void SetRemoteBitrate(DataRate bitrate); 123*d9f75844SAndroid Build Coastguard Worker 124*d9f75844SAndroid Build Coastguard Worker void OnPacketReceived(EmulatedIpPacket packet) override; 125*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtcEventLogOutput> GetLogWriter(std::string name); 126*d9f75844SAndroid Build Coastguard Worker 127*d9f75844SAndroid Build Coastguard Worker // Exposed publicly so that tests can execute tasks such as querying stats 128*d9f75844SAndroid Build Coastguard Worker // for media streams in the expected runtime environment (essentially what 129*d9f75844SAndroid Build Coastguard Worker // CallClient does internally for GetStats()). 130*d9f75844SAndroid Build Coastguard Worker void SendTask(std::function<void()> task); 131*d9f75844SAndroid Build Coastguard Worker 132*d9f75844SAndroid Build Coastguard Worker private: 133*d9f75844SAndroid Build Coastguard Worker friend class Scenario; 134*d9f75844SAndroid Build Coastguard Worker friend class CallClientPair; 135*d9f75844SAndroid Build Coastguard Worker friend class SendVideoStream; 136*d9f75844SAndroid Build Coastguard Worker friend class VideoStreamPair; 137*d9f75844SAndroid Build Coastguard Worker friend class ReceiveVideoStream; 138*d9f75844SAndroid Build Coastguard Worker friend class SendAudioStream; 139*d9f75844SAndroid Build Coastguard Worker friend class ReceiveAudioStream; 140*d9f75844SAndroid Build Coastguard Worker friend class AudioStreamPair; 141*d9f75844SAndroid Build Coastguard Worker friend class NetworkNodeTransport; 142*d9f75844SAndroid Build Coastguard Worker uint32_t GetNextVideoSsrc(); 143*d9f75844SAndroid Build Coastguard Worker uint32_t GetNextVideoLocalSsrc(); 144*d9f75844SAndroid Build Coastguard Worker uint32_t GetNextAudioSsrc(); 145*d9f75844SAndroid Build Coastguard Worker uint32_t GetNextAudioLocalSsrc(); 146*d9f75844SAndroid Build Coastguard Worker uint32_t GetNextRtxSsrc(); 147*d9f75844SAndroid Build Coastguard Worker int16_t Bind(EmulatedEndpoint* endpoint); 148*d9f75844SAndroid Build Coastguard Worker void UnBind(); 149*d9f75844SAndroid Build Coastguard Worker 150*d9f75844SAndroid Build Coastguard Worker TimeController* const time_controller_; 151*d9f75844SAndroid Build Coastguard Worker Clock* clock_; 152*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<LogWriterFactoryInterface> log_writer_factory_; 153*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtcEventLog> event_log_; 154*d9f75844SAndroid Build Coastguard Worker LoggingNetworkControllerFactory network_controller_factory_; 155*d9f75844SAndroid Build Coastguard Worker CallClientFakeAudio fake_audio_setup_; 156*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<Call> call_; 157*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<NetworkNodeTransport> transport_; 158*d9f75844SAndroid Build Coastguard Worker std::vector<std::pair<EmulatedEndpoint*, uint16_t>> endpoints_; 159*d9f75844SAndroid Build Coastguard Worker 160*d9f75844SAndroid Build Coastguard Worker int next_video_ssrc_index_ = 0; 161*d9f75844SAndroid Build Coastguard Worker int next_video_local_ssrc_index_ = 0; 162*d9f75844SAndroid Build Coastguard Worker int next_rtx_ssrc_index_ = 0; 163*d9f75844SAndroid Build Coastguard Worker int next_audio_ssrc_index_ = 0; 164*d9f75844SAndroid Build Coastguard Worker int next_audio_local_ssrc_index_ = 0; 165*d9f75844SAndroid Build Coastguard Worker std::map<uint32_t, MediaType> ssrc_media_types_; 166*d9f75844SAndroid Build Coastguard Worker // Defined last so it's destroyed first. 167*d9f75844SAndroid Build Coastguard Worker TaskQueueForTest task_queue_; 168*d9f75844SAndroid Build Coastguard Worker 169*d9f75844SAndroid Build Coastguard Worker const FieldTrialBasedConfig field_trials_; 170*d9f75844SAndroid Build Coastguard Worker }; 171*d9f75844SAndroid Build Coastguard Worker 172*d9f75844SAndroid Build Coastguard Worker class CallClientPair { 173*d9f75844SAndroid Build Coastguard Worker public: 174*d9f75844SAndroid Build Coastguard Worker ~CallClientPair(); 175*d9f75844SAndroid Build Coastguard Worker 176*d9f75844SAndroid Build Coastguard Worker CallClientPair(const CallClientPair&) = delete; 177*d9f75844SAndroid Build Coastguard Worker CallClientPair& operator=(const CallClientPair&) = delete; 178*d9f75844SAndroid Build Coastguard Worker first()179*d9f75844SAndroid Build Coastguard Worker CallClient* first() { return first_; } second()180*d9f75844SAndroid Build Coastguard Worker CallClient* second() { return second_; } forward()181*d9f75844SAndroid Build Coastguard Worker std::pair<CallClient*, CallClient*> forward() { return {first(), second()}; } reverse()182*d9f75844SAndroid Build Coastguard Worker std::pair<CallClient*, CallClient*> reverse() { return {second(), first()}; } 183*d9f75844SAndroid Build Coastguard Worker 184*d9f75844SAndroid Build Coastguard Worker private: 185*d9f75844SAndroid Build Coastguard Worker friend class Scenario; CallClientPair(CallClient * first,CallClient * second)186*d9f75844SAndroid Build Coastguard Worker CallClientPair(CallClient* first, CallClient* second) 187*d9f75844SAndroid Build Coastguard Worker : first_(first), second_(second) {} 188*d9f75844SAndroid Build Coastguard Worker CallClient* const first_; 189*d9f75844SAndroid Build Coastguard Worker CallClient* const second_; 190*d9f75844SAndroid Build Coastguard Worker }; 191*d9f75844SAndroid Build Coastguard Worker } // namespace test 192*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 193*d9f75844SAndroid Build Coastguard Worker 194*d9f75844SAndroid Build Coastguard Worker #endif // TEST_SCENARIO_CALL_CLIENT_H_ 195