xref: /aosp_15_r20/external/webrtc/test/scenario/call_client.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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