/work/testing/support/src/simulated_environment.cc
Line | Count | Source (jump to first uncovered line) |
1 | | #include "../public/simulated_environment.hh" |
2 | | |
3 | | #include <iostream> |
4 | | |
5 | | namespace tox::test { |
6 | | |
7 | | SimulatedEnvironment::SimulatedEnvironment(uint64_t seed) |
8 | | : sim_(std::make_unique<Simulation>(seed)) |
9 | | , global_random_(std::make_unique<FakeRandom>(seed)) |
10 | | , global_memory_(std::make_unique<FakeMemory>()) |
11 | 2.81k | { |
12 | 2.81k | } |
13 | | |
14 | 2.81k | SimulatedEnvironment::~SimulatedEnvironment() = default; |
15 | | |
16 | | NetworkSystem &SimulatedEnvironment::network() |
17 | 0 | { |
18 | | // Return a dummy stack for interface compliance; real networking is per-node. |
19 | 0 | static FakeNetworkStack *dummy = nullptr; |
20 | 0 | if (!dummy) { |
21 | 0 | IP dummy_ip; |
22 | 0 | ip_init(&dummy_ip, false); |
23 | 0 | dummy = new FakeNetworkStack(sim_->net(), dummy_ip); |
24 | 0 | } |
25 | 0 | return *dummy; |
26 | 0 | } |
27 | | |
28 | 280 | ClockSystem &SimulatedEnvironment::clock() { return sim_->clock(); } |
29 | 0 | RandomSystem &SimulatedEnvironment::random() { return *global_random_; } |
30 | 0 | MemorySystem &SimulatedEnvironment::memory() { return *global_memory_; } |
31 | | |
32 | 858 | FakeClock &SimulatedEnvironment::fake_clock() { return sim_->clock(); } |
33 | 23 | FakeRandom &SimulatedEnvironment::fake_random() { return *global_random_; } |
34 | 1.29k | FakeMemory &SimulatedEnvironment::fake_memory() { return *global_memory_; } |
35 | | |
36 | | std::unique_ptr<ScopedToxSystem> SimulatedEnvironment::create_node(uint16_t port) |
37 | 2.42k | { |
38 | 2.42k | auto scoped = std::make_unique<ScopedToxSystem>(); |
39 | 2.42k | scoped->node = sim_->create_node(); |
40 | | |
41 | | // Bind port |
42 | 2.42k | if (port != 0) { |
43 | 2.26k | Socket s = scoped->node->fake_network().socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
44 | 2.26k | IP_Port addr; |
45 | 2.26k | ip_init(&addr.ip, false); |
46 | 2.26k | addr.ip.ip.v4.uint32 = 0; |
47 | 2.26k | addr.port = net_htons(port); |
48 | 2.26k | scoped->node->fake_network().bind(s, &addr); |
49 | 2.26k | } |
50 | | |
51 | | // Get Primary Endpoint for Fuzzer |
52 | 2.42k | scoped->endpoint = scoped->node->get_primary_socket(); |
53 | | |
54 | | // Use global Random and Memory for legacy compatibility. |
55 | 2.42k | scoped->c_random = global_random_->c_random(); |
56 | 2.42k | scoped->c_memory = global_memory_->c_memory(); |
57 | | |
58 | | // Use Node's Network |
59 | 2.42k | scoped->c_network = scoped->node->c_network; |
60 | | |
61 | | // Setup System |
62 | 2.42k | scoped->system.mem = &scoped->c_memory; |
63 | 2.42k | scoped->system.ns = &scoped->c_network; |
64 | 2.42k | scoped->system.rng = &scoped->c_random; |
65 | | |
66 | 2.42k | scoped->system.mono_time_user_data = &sim_->clock(); |
67 | 2.42k | scoped->system.mono_time_callback = [](void *_Nullable user_data) -> uint64_t { |
68 | 1.50k | return static_cast<FakeClock *>(user_data)->current_time_ms(); |
69 | 1.50k | }; |
70 | | |
71 | 2.42k | return scoped; |
72 | 2.42k | } |
73 | | |
74 | 2.90k | void SimulatedEnvironment::advance_time(uint64_t ms) { sim_->advance_time(ms); } |
75 | | |
76 | | } // namespace tox::test |