mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 22:00:47 +01:00

The test tests that a route change does not cause BWE do drop unless the adapter is changed. Bug: webrtc:42221538 Change-Id: I49be55172aff285c55d2564ec3389f3fc7c01d62 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/350820 Reviewed-by: Jonas Oreland <jonaso@webrtc.org> Reviewed-by: Jonas Oreland <jonaso@google.com> Commit-Queue: Per Kjellander <perkj@webrtc.org> Cr-Commit-Position: refs/heads/main@{#42347}
205 lines
7.3 KiB
C++
205 lines
7.3 KiB
C++
/*
|
|
* Copyright 2018 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.
|
|
*/
|
|
#ifndef TEST_SCENARIO_CALL_CLIENT_H_
|
|
#define TEST_SCENARIO_CALL_CLIENT_H_
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "api/array_view.h"
|
|
#include "api/audio/audio_device.h"
|
|
#include "api/environment/environment.h"
|
|
#include "api/rtc_event_log/rtc_event_log.h"
|
|
#include "api/rtp_parameters.h"
|
|
#include "api/test/time_controller.h"
|
|
#include "api/units/data_rate.h"
|
|
#include "call/call.h"
|
|
#include "modules/congestion_controller/goog_cc/test/goog_cc_printer.h"
|
|
#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
|
|
#include "rtc_base/task_queue_for_test.h"
|
|
#include "test/logging/log_writer.h"
|
|
#include "test/network/network_emulation.h"
|
|
#include "test/scenario/column_printer.h"
|
|
#include "test/scenario/network_node.h"
|
|
#include "test/scenario/scenario_config.h"
|
|
|
|
namespace webrtc {
|
|
|
|
namespace test {
|
|
// Helper class to capture network controller state.
|
|
class NetworkControleUpdateCache : public NetworkControllerInterface {
|
|
public:
|
|
explicit NetworkControleUpdateCache(
|
|
std::unique_ptr<NetworkControllerInterface> controller);
|
|
|
|
NetworkControlUpdate OnNetworkAvailability(NetworkAvailability msg) override;
|
|
NetworkControlUpdate OnNetworkRouteChange(NetworkRouteChange msg) override;
|
|
NetworkControlUpdate OnProcessInterval(ProcessInterval msg) override;
|
|
NetworkControlUpdate OnRemoteBitrateReport(RemoteBitrateReport msg) override;
|
|
NetworkControlUpdate OnRoundTripTimeUpdate(RoundTripTimeUpdate msg) override;
|
|
NetworkControlUpdate OnSentPacket(SentPacket msg) override;
|
|
NetworkControlUpdate OnReceivedPacket(ReceivedPacket msg) override;
|
|
NetworkControlUpdate OnStreamsConfig(StreamsConfig msg) override;
|
|
NetworkControlUpdate OnTargetRateConstraints(
|
|
TargetRateConstraints msg) override;
|
|
NetworkControlUpdate OnTransportLossReport(TransportLossReport msg) override;
|
|
NetworkControlUpdate OnTransportPacketsFeedback(
|
|
TransportPacketsFeedback msg) override;
|
|
NetworkControlUpdate OnNetworkStateEstimate(
|
|
NetworkStateEstimate msg) override;
|
|
|
|
NetworkControlUpdate update_state() const;
|
|
|
|
private:
|
|
NetworkControlUpdate Update(NetworkControlUpdate update);
|
|
const std::unique_ptr<NetworkControllerInterface> controller_;
|
|
NetworkControlUpdate update_state_;
|
|
};
|
|
|
|
class LoggingNetworkControllerFactory
|
|
: public NetworkControllerFactoryInterface {
|
|
public:
|
|
LoggingNetworkControllerFactory(LogWriterFactoryInterface* log_writer_factory,
|
|
TransportControllerConfig config);
|
|
|
|
~LoggingNetworkControllerFactory();
|
|
|
|
LoggingNetworkControllerFactory(const LoggingNetworkControllerFactory&) =
|
|
delete;
|
|
LoggingNetworkControllerFactory& operator=(
|
|
const LoggingNetworkControllerFactory&) = delete;
|
|
|
|
std::unique_ptr<NetworkControllerInterface> Create(
|
|
NetworkControllerConfig config) override;
|
|
TimeDelta GetProcessInterval() const override;
|
|
// TODO(srte): Consider using the Columnprinter interface for this.
|
|
void LogCongestionControllerStats(Timestamp at_time);
|
|
void SetRemoteBitrateEstimate(RemoteBitrateReport msg);
|
|
|
|
NetworkControlUpdate GetUpdate() const;
|
|
|
|
private:
|
|
GoogCcDebugFactory goog_cc_factory_;
|
|
NetworkControllerFactoryInterface* cc_factory_ = nullptr;
|
|
bool print_cc_state_ = false;
|
|
NetworkControleUpdateCache* last_controller_ = nullptr;
|
|
};
|
|
|
|
struct CallClientFakeAudio {
|
|
rtc::scoped_refptr<AudioProcessing> apm;
|
|
rtc::scoped_refptr<AudioDeviceModule> fake_audio_device;
|
|
rtc::scoped_refptr<AudioState> audio_state;
|
|
};
|
|
// CallClient represents a participant in a call scenario. It is created by the
|
|
// Scenario class and is used as sender and receiver when setting up a media
|
|
// stream session.
|
|
class CallClient : public EmulatedNetworkReceiverInterface {
|
|
public:
|
|
CallClient(TimeController* time_controller,
|
|
std::unique_ptr<LogWriterFactoryInterface> log_writer_factory,
|
|
CallClientConfig config);
|
|
|
|
~CallClient();
|
|
|
|
CallClient(const CallClient&) = delete;
|
|
CallClient& operator=(const CallClient&) = delete;
|
|
|
|
ColumnPrinter StatsPrinter();
|
|
Call::Stats GetStats();
|
|
DataRate send_bandwidth() {
|
|
return DataRate::BitsPerSec(GetStats().send_bandwidth_bps);
|
|
}
|
|
DataRate target_rate() const;
|
|
DataRate stable_target_rate() const;
|
|
DataRate padding_rate() const;
|
|
void UpdateBitrateConstraints(const BitrateConstraints& constraints);
|
|
void SetRemoteBitrate(DataRate bitrate);
|
|
|
|
void SetAudioReceiveRtpHeaderExtensions(
|
|
rtc::ArrayView<RtpExtension> extensions);
|
|
void SetVideoReceiveRtpHeaderExtensions(
|
|
rtc::ArrayView<RtpExtension> extensions);
|
|
|
|
// Sets the network adapter id used next time the network route changes.
|
|
void UpdateNetworkAdapterId(int adapter_id);
|
|
|
|
void OnPacketReceived(EmulatedIpPacket packet) override;
|
|
std::unique_ptr<RtcEventLogOutput> GetLogWriter(std::string name);
|
|
|
|
// Exposed publicly so that tests can execute tasks such as querying stats
|
|
// for media streams in the expected runtime environment (essentially what
|
|
// CallClient does internally for GetStats()).
|
|
void SendTask(std::function<void()> task);
|
|
|
|
private:
|
|
friend class Scenario;
|
|
friend class CallClientPair;
|
|
friend class SendVideoStream;
|
|
friend class VideoStreamPair;
|
|
friend class ReceiveVideoStream;
|
|
friend class SendAudioStream;
|
|
friend class ReceiveAudioStream;
|
|
friend class AudioStreamPair;
|
|
friend class NetworkNodeTransport;
|
|
uint32_t GetNextVideoSsrc();
|
|
uint32_t GetNextVideoLocalSsrc();
|
|
uint32_t GetNextAudioSsrc();
|
|
uint32_t GetNextAudioLocalSsrc();
|
|
uint32_t GetNextRtxSsrc();
|
|
int16_t Bind(EmulatedEndpoint* endpoint);
|
|
void UnBind();
|
|
|
|
TimeController* const time_controller_;
|
|
Environment env_;
|
|
const std::unique_ptr<LogWriterFactoryInterface> log_writer_factory_;
|
|
LoggingNetworkControllerFactory network_controller_factory_;
|
|
CallClientFakeAudio fake_audio_setup_;
|
|
std::unique_ptr<Call> call_;
|
|
std::unique_ptr<NetworkNodeTransport> transport_;
|
|
std::vector<std::pair<EmulatedEndpoint*, uint16_t>> endpoints_;
|
|
RtpHeaderExtensionMap audio_extensions_;
|
|
RtpHeaderExtensionMap video_extensions_;
|
|
|
|
int next_video_ssrc_index_ = 0;
|
|
int next_video_local_ssrc_index_ = 0;
|
|
int next_rtx_ssrc_index_ = 0;
|
|
int next_audio_ssrc_index_ = 0;
|
|
int next_audio_local_ssrc_index_ = 0;
|
|
std::map<uint32_t, MediaType> ssrc_media_types_;
|
|
// Defined last so it's destroyed first.
|
|
TaskQueueForTest task_queue_;
|
|
};
|
|
|
|
class CallClientPair {
|
|
public:
|
|
~CallClientPair();
|
|
|
|
CallClientPair(const CallClientPair&) = delete;
|
|
CallClientPair& operator=(const CallClientPair&) = delete;
|
|
|
|
CallClient* first() { return first_; }
|
|
CallClient* second() { return second_; }
|
|
std::pair<CallClient*, CallClient*> forward() { return {first(), second()}; }
|
|
std::pair<CallClient*, CallClient*> reverse() { return {second(), first()}; }
|
|
|
|
private:
|
|
friend class Scenario;
|
|
CallClientPair(CallClient* first, CallClient* second)
|
|
: first_(first), second_(second) {}
|
|
CallClient* const first_;
|
|
CallClient* const second_;
|
|
};
|
|
} // namespace test
|
|
} // namespace webrtc
|
|
|
|
#endif // TEST_SCENARIO_CALL_CLIENT_H_
|