/* * 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_SIMULATED_TIME_H_ #define TEST_SCENARIO_SIMULATED_TIME_H_ #include #include #include #include #include #include #include "api/transport/network_control.h" #include "api/transport/network_types.h" #include "api/units/data_rate.h" #include "api/units/data_size.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" #include "rtc_base/copy_on_write_buffer.h" #include "test/logging/log_writer.h" #include "test/scenario/call_client.h" #include "test/scenario/network_node.h" #include "test/scenario/scenario_config.h" namespace webrtc { namespace test { class PacketStream { public: explicit PacketStream(PacketStreamConfig config); private: std::vector PullPackets(Timestamp at_time); void OnTargetRateUpdate(DataRate target_rate); friend class SimulatedTimeClient; PacketStreamConfig config_; bool next_frame_is_keyframe_ = true; Timestamp next_frame_time_ = Timestamp::MinusInfinity(); DataRate target_rate_ = DataRate::Zero(); int64_t budget_ = 0; }; class SimulatedFeedback : EmulatedNetworkReceiverInterface { public: SimulatedFeedback(SimulatedTimeClientConfig config, uint64_t return_receiver_id, EmulatedNetworkNode* return_node); void OnPacketReceived(EmulatedIpPacket packet) override; private: friend class SimulatedTimeClient; const SimulatedTimeClientConfig config_; const uint64_t return_receiver_id_; EmulatedNetworkNode* return_node_; Timestamp last_feedback_time_ = Timestamp::MinusInfinity(); int32_t next_feedback_seq_num_ = 1; std::map receive_times_; }; struct SimpleFeedbackReportPacket { struct ReceiveInfo { int64_t sequence_number; Timestamp receive_time; }; std::vector receive_times; }; SimpleFeedbackReportPacket FeedbackFromBuffer( rtc::CopyOnWriteBuffer raw_buffer); rtc::CopyOnWriteBuffer FeedbackToBuffer( const SimpleFeedbackReportPacket packet); class SimulatedSender { public: struct PacketReadyToSend { SentPacket send_info; rtc::CopyOnWriteBuffer data; }; struct PendingPacket { int64_t size; }; SimulatedSender(EmulatedNetworkNode* send_node, uint64_t send_receiver_id); SimulatedSender(const SimulatedSender&) = delete; ~SimulatedSender(); TransportPacketsFeedback PullFeedbackReport(SimpleFeedbackReportPacket report, Timestamp at_time); std::vector PaceAndPullSendPackets(Timestamp at_time); void Update(NetworkControlUpdate update); private: friend class SimulatedTimeClient; EmulatedNetworkNode* send_node_; uint64_t send_receiver_id_; PacerConfig pacer_config_; DataSize max_in_flight_ = DataSize::Infinity(); std::deque packet_queue_; std::vector sent_packets_; Timestamp last_update_ = Timestamp::MinusInfinity(); int64_t pacing_budget_ = 0; int64_t next_sequence_number_ = 1; int64_t next_feedback_seq_num_ = 1; DataSize data_in_flight_ = DataSize::Zero(); }; // SimulatedTimeClient emulates core parts of the behavior of WebRTC from the // perspective of congestion controllers. This is intended for use in functional // unit tests to ensure that congestion controllers behave in a reasonable way. // It does not, however, completely simulate the actual behavior of WebRTC. For // a more accurate simulation, use the real time only CallClient. class SimulatedTimeClient : EmulatedNetworkReceiverInterface { public: SimulatedTimeClient( std::unique_ptr log_writer_factory, SimulatedTimeClientConfig config, std::vector stream_configs, std::vector send_link, std::vector return_link, uint64_t send_receiver_id, uint64_t return_receiver_id, Timestamp at_time); SimulatedTimeClient(const SimulatedTimeClient&) = delete; ~SimulatedTimeClient(); void Update(NetworkControlUpdate update); void CongestionProcess(Timestamp at_time); void PacerProcess(Timestamp at_time); void ProcessFrames(Timestamp at_time); void TriggerFakeReroute(Timestamp at_time); TimeDelta GetNetworkControllerProcessInterval() const; double target_rate_kbps() const; DataRate link_capacity() const; DataRate padding_rate() const; void OnPacketReceived(EmulatedIpPacket packet) override; private: friend class Scenario; std::unique_ptr log_writer_factory_; LoggingNetworkControllerFactory network_controller_factory_; std::unique_ptr congestion_controller_; std::vector send_link_; std::vector return_link_; SimulatedSender sender_; SimulatedFeedback feedback_; TargetRateConstraints current_contraints_; DataRate target_rate_ = DataRate::Infinity(); DataRate link_capacity_ = DataRate::Infinity(); std::unique_ptr packet_log_; std::vector> packet_streams_; }; } // namespace test } // namespace webrtc #endif // TEST_SCENARIO_SIMULATED_TIME_H_