blob: da5b29553b6ee8c82693f2bb7095b99b43bb147c [file] [log] [blame]
Artem Titov0774bd92019-01-30 15:26:05 +01001/*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Artem Titov386802e2019-07-05 10:48:17 +020011#ifndef TEST_NETWORK_NETWORK_EMULATION_MANAGER_H_
12#define TEST_NETWORK_NETWORK_EMULATION_MANAGER_H_
Artem Titov0774bd92019-01-30 15:26:05 +010013
Artem Titov386802e2019-07-05 10:48:17 +020014#include <map>
Artem Titov0774bd92019-01-30 15:26:05 +010015#include <memory>
Artem Titov386802e2019-07-05 10:48:17 +020016#include <set>
Artem Titov0774bd92019-01-30 15:26:05 +010017#include <utility>
18#include <vector>
19
Artem Titov7bf8c7f2019-03-15 15:00:37 +010020#include "api/test/network_emulation_manager.h"
Artem Titov0774bd92019-01-30 15:26:05 +010021#include "api/test/simulated_network.h"
22#include "api/units/time_delta.h"
23#include "api/units/timestamp.h"
24#include "rtc_base/logging.h"
Artem Titov20863472019-03-13 10:30:51 +010025#include "rtc_base/network.h"
Danil Chapovalov982b5762019-03-21 09:58:30 +010026#include "rtc_base/task_queue_for_test.h"
Artem Titov0774bd92019-01-30 15:26:05 +010027#include "rtc_base/task_utils/repeating_task.h"
28#include "rtc_base/thread.h"
Sebastian Janssonb00eb192019-02-11 09:13:01 +010029#include "system_wrappers/include/clock.h"
Artem Titov386802e2019-07-05 10:48:17 +020030#include "test/network/cross_traffic.h"
31#include "test/network/emulated_network_manager.h"
32#include "test/network/fake_network_socket_server.h"
33#include "test/network/network_emulation.h"
Sebastian Jansson8d3e4bd2019-07-31 18:33:17 +020034#include "test/network/simulated_network_node.h"
Artem Titov386802e2019-07-05 10:48:17 +020035#include "test/network/traffic_route.h"
Sebastian Jansson5d97f552019-04-15 14:43:03 +020036#include "test/time_controller/time_controller.h"
Artem Titov0774bd92019-01-30 15:26:05 +010037
38namespace webrtc {
39namespace test {
40
Artem Titov7bf8c7f2019-03-15 15:00:37 +010041class NetworkEmulationManagerImpl : public NetworkEmulationManager {
Artem Titov0774bd92019-01-30 15:26:05 +010042 public:
Artem Titov7bf8c7f2019-03-15 15:00:37 +010043 NetworkEmulationManagerImpl();
Sebastian Jansson5d97f552019-04-15 14:43:03 +020044 explicit NetworkEmulationManagerImpl(TimeController* time_controller);
Artem Titov7bf8c7f2019-03-15 15:00:37 +010045 ~NetworkEmulationManagerImpl();
Artem Titov0774bd92019-01-30 15:26:05 +010046
47 EmulatedNetworkNode* CreateEmulatedNode(
Artem Titov48b1b182019-07-05 13:09:48 +020048 BuiltInNetworkBehaviorConfig config) override;
49 EmulatedNetworkNode* CreateEmulatedNode(
Artem Titov7bf8c7f2019-03-15 15:00:37 +010050 std::unique_ptr<NetworkBehaviorInterface> network_behavior) override;
Artem Titov0774bd92019-01-30 15:26:05 +010051
Sebastian Jansson8d3e4bd2019-07-31 18:33:17 +020052 SimulatedNetworkNode::Builder NodeBuilder();
53
Artem Titov7bf8c7f2019-03-15 15:00:37 +010054 EmulatedEndpoint* CreateEndpoint(EmulatedEndpointConfig config) override;
Artem Titove5cc85b2019-03-28 12:11:09 +010055 void EnableEndpoint(EmulatedEndpoint* endpoint) override;
56 void DisableEndpoint(EmulatedEndpoint* endpoint) override;
Artem Titov0774bd92019-01-30 15:26:05 +010057
Artem Titovfc6ab002019-03-12 13:48:32 +010058 EmulatedRoute* CreateRoute(EmulatedEndpoint* from,
Artem Titov7bf8c7f2019-03-15 15:00:37 +010059 const std::vector<EmulatedNetworkNode*>& via_nodes,
60 EmulatedEndpoint* to) override;
Sebastian Janssonb13ccc52019-06-07 13:06:00 +020061
62 EmulatedRoute* CreateRoute(
63 const std::vector<EmulatedNetworkNode*>& via_nodes);
64
Artem Titov7bf8c7f2019-03-15 15:00:37 +010065 void ClearRoute(EmulatedRoute* route) override;
Artem Titov0774bd92019-01-30 15:26:05 +010066
Artem Titov7bf8c7f2019-03-15 15:00:37 +010067 TrafficRoute* CreateTrafficRoute(
68 const std::vector<EmulatedNetworkNode*>& via_nodes);
Artem Titovd3666b22019-02-11 14:40:17 +010069 RandomWalkCrossTraffic* CreateRandomWalkCrossTraffic(
70 TrafficRoute* traffic_route,
71 RandomWalkConfig config);
72 PulsedPeaksCrossTraffic* CreatePulsedPeaksCrossTraffic(
73 TrafficRoute* traffic_route,
74 PulsedPeaksConfig config);
Sebastian Janssond8aff212019-10-11 17:00:39 +020075 FakeTcpCrossTraffic* StartFakeTcpCrossTraffic(
76 std::vector<EmulatedNetworkNode*> send_link,
77 std::vector<EmulatedNetworkNode*> ret_link,
78 FakeTcpConfig config);
Sebastian Janssondcc910a2019-11-12 16:36:34 +010079
Sebastian Jansson50f86862019-11-13 14:10:07 +010080 TcpMessageRoute* CreateTcpRoute(EmulatedRoute* send_route,
81 EmulatedRoute* ret_route);
Sebastian Janssondcc910a2019-11-12 16:36:34 +010082
Sebastian Janssond8aff212019-10-11 17:00:39 +020083 void StopCrossTraffic(FakeTcpCrossTraffic* traffic);
Artem Titovd3666b22019-02-11 14:40:17 +010084
Artem Titove5cc85b2019-03-28 12:11:09 +010085 EmulatedNetworkManagerInterface* CreateEmulatedNetworkManagerInterface(
Artem Titov7bf8c7f2019-03-15 15:00:37 +010086 const std::vector<EmulatedEndpoint*>& endpoints) override;
Artem Titov0774bd92019-01-30 15:26:05 +010087
Artem Titov0774bd92019-01-30 15:26:05 +010088 private:
Artem Titov0bf4c292019-02-26 10:00:07 +010089 absl::optional<rtc::IPAddress> GetNextIPv4Address();
Artem Titov0774bd92019-01-30 15:26:05 +010090 Timestamp Now() const;
91
92 Clock* const clock_;
93 int next_node_id_;
94
95 RepeatingTaskHandle process_task_handle_;
96
Artem Titov0bf4c292019-02-26 10:00:07 +010097 uint32_t next_ip4_address_;
98 std::set<rtc::IPAddress> used_ip_addresses_;
99
Artem Titov0774bd92019-01-30 15:26:05 +0100100 // All objects can be added to the manager only when it is idle.
Artem Titovaba8dc22019-03-11 10:08:40 +0100101 std::vector<std::unique_ptr<EmulatedEndpoint>> endpoints_;
Artem Titov0774bd92019-01-30 15:26:05 +0100102 std::vector<std::unique_ptr<EmulatedNetworkNode>> network_nodes_;
Artem Titovfc6ab002019-03-12 13:48:32 +0100103 std::vector<std::unique_ptr<EmulatedRoute>> routes_;
Artem Titovd3666b22019-02-11 14:40:17 +0100104 std::vector<std::unique_ptr<TrafficRoute>> traffic_routes_;
105 std::vector<std::unique_ptr<RandomWalkCrossTraffic>> random_cross_traffics_;
106 std::vector<std::unique_ptr<PulsedPeaksCrossTraffic>> pulsed_cross_traffics_;
Sebastian Janssond8aff212019-10-11 17:00:39 +0200107 std::list<std::unique_ptr<FakeTcpCrossTraffic>> tcp_cross_traffics_;
Sebastian Janssondcc910a2019-11-12 16:36:34 +0100108 std::list<std::unique_ptr<TcpMessageRoute>> tcp_message_routes_;
Artem Titov0d32a732019-04-05 14:49:59 +0200109 std::vector<std::unique_ptr<EndpointsContainer>> endpoints_containers_;
Artem Titove5cc85b2019-03-28 12:11:09 +0100110 std::vector<std::unique_ptr<EmulatedNetworkManager>> network_managers_;
111
112 std::map<EmulatedEndpoint*, EmulatedNetworkManager*>
113 endpoint_to_network_manager_;
Artem Titov0774bd92019-01-30 15:26:05 +0100114
115 // Must be the last field, so it will be deleted first, because tasks
116 // in the TaskQueue can access other fields of the instance of this class.
Danil Chapovalov982b5762019-03-21 09:58:30 +0100117 TaskQueueForTest task_queue_;
Artem Titov0774bd92019-01-30 15:26:05 +0100118};
119
120} // namespace test
121} // namespace webrtc
122
Artem Titov386802e2019-07-05 10:48:17 +0200123#endif // TEST_NETWORK_NETWORK_EMULATION_MANAGER_H_