/* * Copyright 2019 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_NETWORK_FEEDBACK_GENERATOR_H_ #define TEST_SCENARIO_NETWORK_FEEDBACK_GENERATOR_H_ #include #include #include #include "api/transport/test/feedback_generator_interface.h" #include "call/simulated_network.h" #include "test/scenario/network/network_emulation.h" #include "test/scenario/network/network_emulation_manager.h" #include "test/time_controller/simulated_time_controller.h" namespace webrtc { template class FakePacketRoute : public EmulatedNetworkReceiverInterface { public: FakePacketRoute(EmulatedRoute* route, std::function action) : route_(route), action_(std::move(action)), send_addr_(route_->from->GetPeerLocalAddress(), 0), recv_addr_(route_->to->GetPeerLocalAddress(), *route_->to->BindReceiver(0, this)) {} void SendPacket(EmulatedEndpoint* from, size_t size, FakePacketType packet) { RTC_CHECK_GE(size, sizeof(int)); sent_.emplace(next_packet_id_, packet); rtc::CopyOnWriteBuffer buf(size); reinterpret_cast(buf.data())[0] = next_packet_id_++; from->SendPacket(send_addr_, recv_addr_, buf); } void OnPacketReceived(EmulatedIpPacket packet) override { int packet_id = reinterpret_cast(packet.data.data())[0]; action_(std::move(sent_[packet_id]), packet.arrival_time); sent_.erase(packet_id); } private: EmulatedRoute* const route_; const std::function action_; const rtc::SocketAddress send_addr_; const rtc::SocketAddress recv_addr_; int next_packet_id_ = 0; std::map sent_; }; class FeedbackGeneratorImpl : public FeedbackGenerator { public: explicit FeedbackGeneratorImpl(Config config); Timestamp Now() override; void Sleep(TimeDelta duration) override; void SendPacket(size_t size) override; std::vector PopFeedback() override; void SetSendConfig(BuiltInNetworkBehaviorConfig config) override; void SetReturnConfig(BuiltInNetworkBehaviorConfig config) override; void SetSendLinkCapacity(DataRate capacity) override; private: void OnPacketReceived(SentPacket packet, Timestamp arrival_time); Config conf_; GlobalSimulatedTimeController time_controller_; ::webrtc::test::NetworkEmulationManagerImpl net_; SimulatedNetwork* const send_link_; SimulatedNetwork* const ret_link_; EmulatedEndpoint* const send_ep_; EmulatedEndpoint* const ret_ep_; EmulatedRoute* const send_route_; EmulatedRoute* const ret_route_; const rtc::SocketAddress send_addr_; const rtc::SocketAddress ret_addr_; FakePacketRoute received_packet_handler_; FakePacketRoute received_feedback_handler_; TransportPacketsFeedback builder_; std::vector feedback_; }; } // namespace webrtc #endif // TEST_SCENARIO_NETWORK_FEEDBACK_GENERATOR_H_