/* * 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_SCENARIO_NETWORK_NETWORK_EMULATION_MANAGER_H_ #define TEST_SCENARIO_NETWORK_NETWORK_EMULATION_MANAGER_H_ #include #include #include #include "api/test/simulated_network.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" #include "rtc_base/logging.h" #include "rtc_base/task_queue.h" #include "rtc_base/task_utils/repeating_task.h" #include "rtc_base/thread.h" #include "system_wrappers/include/clock.h" #include "test/scenario/network/cross_traffic.h" #include "test/scenario/network/fake_network_socket_server.h" #include "test/scenario/network/network_emulation.h" #include "test/scenario/network/traffic_route.h" namespace webrtc { namespace test { class NetworkEmulationManager { public: NetworkEmulationManager(); ~NetworkEmulationManager(); EmulatedNetworkNode* CreateEmulatedNode( std::unique_ptr network_behavior); // TODO(titovartem) add method without IP address, where manager // will provided some unique generated address. EndpointNode* CreateEndpoint(rtc::IPAddress ip); void CreateRoute(EndpointNode* from, std::vector via_nodes, EndpointNode* to); void ClearRoute(EndpointNode* from, std::vector via_nodes, EndpointNode* to); TrafficRoute* CreateTrafficRoute(std::vector via_nodes); RandomWalkCrossTraffic* CreateRandomWalkCrossTraffic( TrafficRoute* traffic_route, RandomWalkConfig config); PulsedPeaksCrossTraffic* CreatePulsedPeaksCrossTraffic( TrafficRoute* traffic_route, PulsedPeaksConfig config); rtc::Thread* CreateNetworkThread(std::vector endpoints); private: FakeNetworkSocketServer* CreateSocketServer( std::vector endpoints); void ProcessNetworkPackets(); Timestamp Now() const; Clock* const clock_; int next_node_id_; RepeatingTaskHandle process_task_handle_; // All objects can be added to the manager only when it is idle. std::vector> endpoints_; std::vector> network_nodes_; std::vector> traffic_routes_; std::vector> random_cross_traffics_; std::vector> pulsed_cross_traffics_; std::vector> socket_servers_; std::vector> threads_; // 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. rtc::TaskQueue task_queue_; }; } // namespace test } // namespace webrtc #endif // TEST_SCENARIO_NETWORK_NETWORK_EMULATION_MANAGER_H_