/* * Copyright (c) 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_NETWORK_NETWORK_EMULATION_MANAGER_H_ #define TEST_NETWORK_NETWORK_EMULATION_MANAGER_H_ #include #include #include #include #include #include "api/array_view.h" #include "api/test/network_emulation_manager.h" #include "api/test/simulated_network.h" #include "api/test/time_controller.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" #include "rtc_base/task_queue_for_test.h" #include "rtc_base/task_utils/repeating_task.h" #include "system_wrappers/include/clock.h" #include "test/network/cross_traffic.h" #include "test/network/emulated_network_manager.h" #include "test/network/emulated_turn_server.h" #include "test/network/network_emulation.h" namespace webrtc { namespace test { class NetworkEmulationManagerImpl : public NetworkEmulationManager { public: NetworkEmulationManagerImpl( TimeMode mode, EmulatedNetworkStatsGatheringMode stats_gathering_mode); ~NetworkEmulationManagerImpl(); EmulatedNetworkNode* CreateEmulatedNode(BuiltInNetworkBehaviorConfig config, uint64_t random_seed = 1) override; EmulatedNetworkNode* CreateEmulatedNode( std::unique_ptr network_behavior) override; SimulatedNetworkNode::Builder NodeBuilder() override; EmulatedEndpointImpl* CreateEndpoint(EmulatedEndpointConfig config) override; void EnableEndpoint(EmulatedEndpoint* endpoint) override; void DisableEndpoint(EmulatedEndpoint* endpoint) override; EmulatedRoute* CreateRoute(EmulatedEndpoint* from, const std::vector& via_nodes, EmulatedEndpoint* to) override; EmulatedRoute* CreateRoute( const std::vector& via_nodes) override; EmulatedRoute* CreateDefaultRoute( EmulatedEndpoint* from, const std::vector& via_nodes, EmulatedEndpoint* to) override; void ClearRoute(EmulatedRoute* route) override; TcpMessageRoute* CreateTcpRoute(EmulatedRoute* send_route, EmulatedRoute* ret_route) override; CrossTrafficRoute* CreateCrossTrafficRoute( const std::vector& via_nodes) override; CrossTrafficGenerator* StartCrossTraffic( std::unique_ptr generator) override; void StopCrossTraffic(CrossTrafficGenerator* generator) override; EmulatedNetworkManagerInterface* CreateEmulatedNetworkManagerInterface( const std::vector& endpoints) override; void GetStats( rtc::ArrayView endpoints, std::function stats_callback) override; void GetStats( rtc::ArrayView nodes, std::function stats_callback) override; TimeController* time_controller() override { return time_controller_.get(); } TimeMode time_mode() const override { return time_mode_; } Timestamp Now() const; EmulatedTURNServerInterface* CreateTURNServer( EmulatedTURNServerConfig config) override; private: using CrossTrafficSource = std::pair, RepeatingTaskHandle>; absl::optional GetNextIPv4Address(); const TimeMode time_mode_; const EmulatedNetworkStatsGatheringMode stats_gathering_mode_; const std::unique_ptr time_controller_; Clock* const clock_; int next_node_id_; RepeatingTaskHandle process_task_handle_; uint32_t next_ip4_address_; std::set used_ip_addresses_; // All objects can be added to the manager only when it is idle. std::vector> endpoints_; std::vector> network_nodes_; std::vector> routes_; std::vector> traffic_routes_; std::vector cross_traffics_; std::list> tcp_message_routes_; std::vector> endpoints_containers_; std::vector> network_managers_; std::vector> turn_servers_; std::map endpoint_to_network_manager_; // Must be the last field, so it will be deleted first, because tasks // in the TaskQueue can access other fields of the instance of this class. TaskQueueForTest task_queue_; }; } // namespace test } // namespace webrtc #endif // TEST_NETWORK_NETWORK_EMULATION_MANAGER_H_