/* * 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/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/logging.h" #include "rtc_base/network.h" #include "rtc_base/task_queue_for_test.h" #include "rtc_base/task_utils/repeating_task.h" #include "rtc_base/thread.h" #include "system_wrappers/include/clock.h" #include "test/network/cross_traffic.h" #include "test/network/emulated_network_manager.h" #include "test/network/fake_network_socket_server.h" #include "test/network/network_emulation.h" #include "test/network/traffic_route.h" namespace webrtc { namespace test { class NetworkEmulationManagerImpl : public NetworkEmulationManager { public: explicit NetworkEmulationManagerImpl(TimeMode mode); ~NetworkEmulationManagerImpl(); EmulatedNetworkNode* CreateEmulatedNode( BuiltInNetworkBehaviorConfig config) override; EmulatedNetworkNode* CreateEmulatedNode( std::unique_ptr network_behavior) override; SimulatedNetworkNode::Builder NodeBuilder() override; EmulatedEndpoint* 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; void ClearRoute(EmulatedRoute* route) override; TrafficRoute* CreateTrafficRoute( const std::vector& via_nodes); RandomWalkCrossTraffic* CreateRandomWalkCrossTraffic( TrafficRoute* traffic_route, RandomWalkConfig config); PulsedPeaksCrossTraffic* CreatePulsedPeaksCrossTraffic( TrafficRoute* traffic_route, PulsedPeaksConfig config); FakeTcpCrossTraffic* StartFakeTcpCrossTraffic( std::vector send_link, std::vector ret_link, FakeTcpConfig config); TcpMessageRoute* CreateTcpRoute(EmulatedRoute* send_route, EmulatedRoute* ret_route) override; void StopCrossTraffic(FakeTcpCrossTraffic* traffic); EmulatedNetworkManagerInterface* CreateEmulatedNetworkManagerInterface( const std::vector& endpoints) override; TimeController* time_controller() override { return time_controller_.get(); } Timestamp Now() const; private: absl::optional GetNextIPv4Address(); 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> random_cross_traffics_; std::vector> pulsed_cross_traffics_; std::list> tcp_cross_traffics_; std::list> tcp_message_routes_; std::vector> endpoints_containers_; std::vector> network_managers_; 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_