/work/auto_tests/tox_many_test.c
Line | Count | Source |
1 | | /* Auto Tests: Many clients. |
2 | | */ |
3 | | |
4 | | #include <stdio.h> |
5 | | #include <stdlib.h> |
6 | | #include <string.h> |
7 | | #include <time.h> |
8 | | |
9 | | #include "../testing/misc_tools.h" |
10 | | #include "../toxcore/crypto_core.h" |
11 | | #include "../toxcore/tox.h" |
12 | | #include "../toxcore/util.h" |
13 | | #include "auto_test_support.h" |
14 | | #include "check_compat.h" |
15 | | |
16 | | static void accept_friend_request(Tox *m, const Tox_Event_Friend_Request *event, void *userdata) |
17 | 53 | { |
18 | 53 | const uint8_t *public_key = tox_event_friend_request_get_public_key(event); |
19 | 53 | const uint8_t *message = tox_event_friend_request_get_message(event); |
20 | 53 | const uint32_t message_length = tox_event_friend_request_get_message_length(event); |
21 | | |
22 | 53 | if (message_length == 7 && memcmp("Gentoo", message, 7) == 0) { |
23 | 53 | tox_friend_add_norequest(m, public_key, nullptr); |
24 | 53 | } |
25 | 53 | } |
26 | | |
27 | | |
28 | 25.9k | #define TCP_TEST_NUM_TOXES 90 |
29 | 191 | #define TCP_TEST_NUM_FRIENDS 50 |
30 | | |
31 | | static void test_many_clients(void) |
32 | 1 | { |
33 | 1 | const Random *rng = os_random(); |
34 | 1 | ck_assert(rng != nullptr); |
35 | 1 | time_t cur_time = time(nullptr); |
36 | 1 | Tox *toxes[TCP_TEST_NUM_TOXES]; |
37 | 1 | uint32_t index[TCP_TEST_NUM_TOXES]; |
38 | | |
39 | 91 | for (uint32_t i = 0; i < TCP_TEST_NUM_TOXES; ++i) { |
40 | 90 | index[i] = i + 1; |
41 | 90 | toxes[i] = tox_new_log(nullptr, nullptr, &index[i]); |
42 | 90 | ck_assert_msg(toxes[i] != nullptr, "failed to create tox instances %u", i); |
43 | 90 | tox_events_init(toxes[i]); |
44 | 90 | } |
45 | | |
46 | 1 | Tox_Dispatch *dispatch = tox_dispatch_new(nullptr); |
47 | 1 | ck_assert(dispatch != nullptr); |
48 | | |
49 | 1 | tox_events_callback_friend_request(dispatch, accept_friend_request); |
50 | | |
51 | 1 | struct { |
52 | 1 | uint16_t tox1; |
53 | 1 | uint16_t tox2; |
54 | 1 | } pairs[TCP_TEST_NUM_FRIENDS]; |
55 | | |
56 | 1 | uint8_t address[TOX_ADDRESS_SIZE]; |
57 | | |
58 | 1 | uint32_t num_f = 0; |
59 | | |
60 | 91 | for (uint32_t i = 0; i < TCP_TEST_NUM_TOXES; ++i) { |
61 | 90 | num_f += tox_self_get_friend_list_size(toxes[i]); |
62 | 90 | } |
63 | | |
64 | 1 | ck_assert_msg(num_f == 0, "bad num friends: %u", num_f); |
65 | | |
66 | 51 | for (uint32_t i = 0; i < TCP_TEST_NUM_FRIENDS; ++i) { |
67 | 52 | loop_top: |
68 | 52 | pairs[i].tox1 = random_u32(rng) % TCP_TEST_NUM_TOXES; |
69 | 52 | pairs[i].tox2 = (pairs[i].tox1 + random_u32(rng) % (TCP_TEST_NUM_TOXES - 1) + 1) % TCP_TEST_NUM_TOXES; |
70 | | |
71 | 1.31k | for (uint32_t j = 0; j < i; ++j) { |
72 | 1.26k | if (pairs[j].tox2 == pairs[i].tox1 && pairs[j].tox1 == pairs[i].tox2) { |
73 | 1 | goto loop_top; |
74 | 1 | } |
75 | 1.26k | } |
76 | | |
77 | 51 | tox_self_get_address(toxes[pairs[i].tox1], address); |
78 | | |
79 | 51 | Tox_Err_Friend_Add test; |
80 | 51 | uint32_t num = tox_friend_add(toxes[pairs[i].tox2], address, (const uint8_t *)"Gentoo", 7, &test); |
81 | | |
82 | 51 | if (test == TOX_ERR_FRIEND_ADD_ALREADY_SENT) { |
83 | 1 | goto loop_top; |
84 | 1 | } |
85 | | |
86 | 50 | uint8_t dht_key[TOX_PUBLIC_KEY_SIZE]; |
87 | 50 | tox_self_get_dht_id(toxes[pairs[i].tox1], dht_key); |
88 | 50 | const uint16_t dht_port = tox_self_get_udp_port(toxes[pairs[i].tox1], nullptr); |
89 | | |
90 | 50 | tox_bootstrap(toxes[pairs[i].tox2], "localhost", dht_port, dht_key, nullptr); |
91 | | |
92 | 50 | ck_assert_msg(num != UINT32_MAX && test == TOX_ERR_FRIEND_ADD_OK, "failed to add friend error code: %i", test); |
93 | 50 | } |
94 | | |
95 | 91 | for (uint32_t i = 0; i < TCP_TEST_NUM_TOXES; ++i) { |
96 | 90 | num_f += tox_self_get_friend_list_size(toxes[i]); |
97 | 90 | } |
98 | | |
99 | 1 | ck_assert_msg(num_f == TCP_TEST_NUM_FRIENDS, "bad num friends: %u", num_f); |
100 | | |
101 | 1 | uint16_t last_count = 0; |
102 | | |
103 | 140 | while (true) { |
104 | 140 | uint16_t counter = 0; |
105 | | |
106 | 12.7k | for (uint32_t i = 0; i < TCP_TEST_NUM_TOXES; ++i) { |
107 | 22.2k | for (uint32_t j = 0; j < tox_self_get_friend_list_size(toxes[i]); ++j) { |
108 | 9.66k | if (tox_friend_get_connection_status(toxes[i], j, nullptr) == TOX_CONNECTION_UDP) { |
109 | 3.59k | ++counter; |
110 | 3.59k | } |
111 | 9.66k | } |
112 | 12.6k | } |
113 | | |
114 | 140 | if (counter != last_count) { |
115 | 33 | printf("many_clients got to %u\n", counter); |
116 | 33 | last_count = counter; |
117 | 33 | } |
118 | | |
119 | 140 | if (counter == TCP_TEST_NUM_FRIENDS * 2) { |
120 | 1 | break; |
121 | 1 | } |
122 | | |
123 | 12.6k | for (uint32_t i = 0; i < TCP_TEST_NUM_TOXES; ++i) { |
124 | 12.5k | Tox_Err_Events_Iterate err = TOX_ERR_EVENTS_ITERATE_OK; |
125 | 12.5k | Tox_Events *events = tox_events_iterate(toxes[i], true, &err); |
126 | 12.5k | ck_assert(err == TOX_ERR_EVENTS_ITERATE_OK); |
127 | 12.5k | tox_dispatch_invoke(dispatch, events, toxes[i], nullptr); |
128 | 12.5k | tox_events_free(events); |
129 | 12.5k | } |
130 | | |
131 | 139 | c_sleep(50); |
132 | 139 | } |
133 | | |
134 | 1 | tox_dispatch_free(dispatch); |
135 | 91 | for (uint32_t i = 0; i < TCP_TEST_NUM_TOXES; ++i) { |
136 | 90 | tox_kill(toxes[i]); |
137 | 90 | } |
138 | | |
139 | 1 | printf("test_many_clients succeeded, took %lu seconds\n", (unsigned long)(time(nullptr) - cur_time)); |
140 | 1 | } |
141 | | |
142 | | int main(void) |
143 | 721 | { |
144 | 721 | setvbuf(stdout, nullptr, _IONBF, 0); |
145 | | |
146 | 721 | test_many_clients(); |
147 | 721 | return 0; |
148 | 721 | } |