diff options
author | zugz <mbays+tox@sdf.org> | 2018-07-25 08:43:48 +0100 |
---|---|---|
committer | zugz (tox) <mbays+tox@sdf.org> | 2018-09-05 20:56:26 +0200 |
commit | 1b2322284f0b688af3a349fe4331be15a565084c (patch) | |
tree | 7651c11b4ec1edd927151e9655727fb0b2365a7c /auto_tests | |
parent | 6872c14e1a02445d945623ee6e85230c5d7ecbce (diff) |
Add mechanism for recovering from disconnections in conferences
* add freezing and unfreezing of peers
* add rejoin packet
* revise handling of temporary invited connections
* rename "peer kill" packet to "peer leave" packet
* test rejoining in conference test
* use custom clock in conference test
Diffstat (limited to 'auto_tests')
-rw-r--r-- | auto_tests/conference_double_invite_test.c | 2 | ||||
-rw-r--r-- | auto_tests/conference_peer_nick_test.c | 2 | ||||
-rw-r--r-- | auto_tests/conference_test.c | 237 | ||||
-rw-r--r-- | auto_tests/friend_connection_test.c | 2 | ||||
-rw-r--r-- | auto_tests/lossless_packet_test.c | 2 | ||||
-rw-r--r-- | auto_tests/lossy_packet_test.c | 2 | ||||
-rw-r--r-- | auto_tests/overflow_recvq_test.c | 2 | ||||
-rw-r--r-- | auto_tests/overflow_sendq_test.c | 2 | ||||
-rw-r--r-- | auto_tests/reconnect_test.c | 2 | ||||
-rw-r--r-- | auto_tests/run_auto_test.h | 27 | ||||
-rw-r--r-- | auto_tests/send_message_test.c | 2 |
11 files changed, 156 insertions, 126 deletions
diff --git a/auto_tests/conference_double_invite_test.c b/auto_tests/conference_double_invite_test.c index 36e93bc0..ba173a90 100644 --- a/auto_tests/conference_double_invite_test.c +++ b/auto_tests/conference_double_invite_test.c | |||
@@ -81,6 +81,6 @@ int main(void) | |||
81 | { | 81 | { |
82 | setvbuf(stdout, nullptr, _IONBF, 0); | 82 | setvbuf(stdout, nullptr, _IONBF, 0); |
83 | 83 | ||
84 | run_auto_test(2, conference_double_invite_test); | 84 | run_auto_test(2, conference_double_invite_test, false); |
85 | return 0; | 85 | return 0; |
86 | } | 86 | } |
diff --git a/auto_tests/conference_peer_nick_test.c b/auto_tests/conference_peer_nick_test.c index eb9bee71..d8d2d64b 100644 --- a/auto_tests/conference_peer_nick_test.c +++ b/auto_tests/conference_peer_nick_test.c | |||
@@ -129,6 +129,6 @@ int main(void) | |||
129 | { | 129 | { |
130 | setvbuf(stdout, nullptr, _IONBF, 0); | 130 | setvbuf(stdout, nullptr, _IONBF, 0); |
131 | 131 | ||
132 | run_auto_test(2, conference_peer_nick_test); | 132 | run_auto_test(2, conference_peer_nick_test, false); |
133 | return 0; | 133 | return 0; |
134 | } | 134 | } |
diff --git a/auto_tests/conference_test.c b/auto_tests/conference_test.c index 235200cd..fb6e7ca8 100644 --- a/auto_tests/conference_test.c +++ b/auto_tests/conference_test.c | |||
@@ -16,26 +16,31 @@ | |||
16 | #include "check_compat.h" | 16 | #include "check_compat.h" |
17 | 17 | ||
18 | #define NUM_GROUP_TOX 16 | 18 | #define NUM_GROUP_TOX 16 |
19 | #define NUM_DISCONNECT 8 | ||
19 | #define GROUP_MESSAGE "Install Gentoo" | 20 | #define GROUP_MESSAGE "Install Gentoo" |
20 | 21 | ||
21 | #define NAME_FORMAT_STR "Tox #%4u" | ||
22 | #define NAMELEN 9 | 22 | #define NAMELEN 9 |
23 | #define NAME_FORMAT "%9s" | 23 | #define NAME_FORMAT_STR "Tox #%4u" |
24 | #define NEW_NAME_FORMAT_STR "New #%4u" | ||
24 | 25 | ||
25 | typedef struct State { | 26 | typedef struct State { |
26 | uint32_t id; | 27 | uint32_t index; |
28 | uint64_t clock; | ||
29 | |||
27 | bool invited_next; | 30 | bool invited_next; |
28 | } State; | 31 | } State; |
29 | 32 | ||
33 | #include "run_auto_test.h" | ||
34 | |||
30 | static void handle_self_connection_status( | 35 | static void handle_self_connection_status( |
31 | Tox *tox, TOX_CONNECTION connection_status, void *user_data) | 36 | Tox *tox, TOX_CONNECTION connection_status, void *user_data) |
32 | { | 37 | { |
33 | const State *state = (State *)user_data; | 38 | const State *state = (State *)user_data; |
34 | 39 | ||
35 | if (connection_status != TOX_CONNECTION_NONE) { | 40 | if (connection_status != TOX_CONNECTION_NONE) { |
36 | printf("tox #%u: is now connected\n", state->id); | 41 | printf("tox #%u: is now connected\n", state->index); |
37 | } else { | 42 | } else { |
38 | printf("tox #%u: is now disconnected\n", state->id); | 43 | printf("tox #%u: is now disconnected\n", state->index); |
39 | } | 44 | } |
40 | } | 45 | } |
41 | 46 | ||
@@ -45,9 +50,9 @@ static void handle_friend_connection_status( | |||
45 | const State *state = (State *)user_data; | 50 | const State *state = (State *)user_data; |
46 | 51 | ||
47 | if (connection_status != TOX_CONNECTION_NONE) { | 52 | if (connection_status != TOX_CONNECTION_NONE) { |
48 | printf("tox #%u: is now connected to friend %u\n", state->id, friendnumber); | 53 | printf("tox #%u: is now connected to friend %u\n", state->index, friendnumber); |
49 | } else { | 54 | } else { |
50 | printf("tox #%u: is now disconnected from friend %u\n", state->id, friendnumber); | 55 | printf("tox #%u: is now disconnected from friend %u\n", state->index, friendnumber); |
51 | } | 56 | } |
52 | } | 57 | } |
53 | 58 | ||
@@ -56,18 +61,18 @@ static void handle_conference_invite( | |||
56 | const uint8_t *data, size_t length, void *user_data) | 61 | const uint8_t *data, size_t length, void *user_data) |
57 | { | 62 | { |
58 | const State *state = (State *)user_data; | 63 | const State *state = (State *)user_data; |
59 | ck_assert_msg(type == TOX_CONFERENCE_TYPE_TEXT, "tox #%u: wrong conference type: %d", state->id, type); | 64 | ck_assert_msg(type == TOX_CONFERENCE_TYPE_TEXT, "tox #%u: wrong conference type: %d", state->index, type); |
60 | 65 | ||
61 | TOX_ERR_CONFERENCE_JOIN err; | 66 | TOX_ERR_CONFERENCE_JOIN err; |
62 | uint32_t g_num = tox_conference_join(tox, friendnumber, data, length, &err); | 67 | uint32_t g_num = tox_conference_join(tox, friendnumber, data, length, &err); |
63 | 68 | ||
64 | ck_assert_msg(err == TOX_ERR_CONFERENCE_JOIN_OK, "tox #%u: error joining group: %d", state->id, err); | 69 | ck_assert_msg(err == TOX_ERR_CONFERENCE_JOIN_OK, "tox #%u: error joining group: %d", state->index, err); |
65 | ck_assert_msg(g_num == 0, "tox #%u: group number was not 0", state->id); | 70 | ck_assert_msg(g_num == 0, "tox #%u: group number was not 0", state->index); |
66 | 71 | ||
67 | // Try joining again. We should only be allowed to join once. | 72 | // Try joining again. We should only be allowed to join once. |
68 | tox_conference_join(tox, friendnumber, data, length, &err); | 73 | tox_conference_join(tox, friendnumber, data, length, &err); |
69 | ck_assert_msg(err != TOX_ERR_CONFERENCE_JOIN_OK, | 74 | ck_assert_msg(err != TOX_ERR_CONFERENCE_JOIN_OK, |
70 | "tox #%u: joining groupchat twice should be impossible.", state->id); | 75 | "tox #%u: joining groupchat twice should be impossible.", state->index); |
71 | } | 76 | } |
72 | 77 | ||
73 | static void handle_conference_connected( | 78 | static void handle_conference_connected( |
@@ -81,8 +86,8 @@ static void handle_conference_connected( | |||
81 | 86 | ||
82 | TOX_ERR_CONFERENCE_INVITE err; | 87 | TOX_ERR_CONFERENCE_INVITE err; |
83 | tox_conference_invite(tox, 1, 0, &err); | 88 | tox_conference_invite(tox, 1, 0, &err); |
84 | ck_assert_msg(err == TOX_ERR_CONFERENCE_INVITE_OK, "tox #%u failed to invite next friend: err = %d", state->id, err); | 89 | ck_assert_msg(err == TOX_ERR_CONFERENCE_INVITE_OK, "tox #%u failed to invite next friend: err = %d", state->index, err); |
85 | printf("tox #%u: invited next friend\n", state->id); | 90 | printf("tox #%u: invited next friend\n", state->index); |
86 | state->invited_next = true; | 91 | state->invited_next = true; |
87 | } | 92 | } |
88 | 93 | ||
@@ -97,8 +102,93 @@ static void handle_conference_message( | |||
97 | } | 102 | } |
98 | } | 103 | } |
99 | 104 | ||
105 | static bool toxes_are_disconnected_from_group(uint32_t tox_count, Tox **toxes, int disconnected_count, | ||
106 | bool *disconnected) | ||
107 | { | ||
108 | for (uint32_t i = 0; i < tox_count; i++) { | ||
109 | if (disconnected[i]) { | ||
110 | continue; | ||
111 | } | ||
112 | |||
113 | if (tox_conference_peer_count(toxes[i], 0, nullptr) > tox_count - NUM_DISCONNECT) { | ||
114 | return false; | ||
115 | } | ||
116 | } | ||
117 | |||
118 | return true; | ||
119 | } | ||
120 | |||
121 | static bool all_connected_to_group(uint32_t tox_count, Tox **toxes) | ||
122 | { | ||
123 | for (uint32_t i = 0; i < tox_count; i++) { | ||
124 | if (tox_conference_peer_count(toxes[i], 0, nullptr) < tox_count) { | ||
125 | return false; | ||
126 | } | ||
127 | } | ||
128 | |||
129 | return true; | ||
130 | } | ||
131 | |||
132 | /* returns a random index at which a list of booleans is false | ||
133 | * (some such index is required to exist) | ||
134 | * */ | ||
135 | static uint32_t random_false_index(bool *list, const uint32_t length) | ||
136 | { | ||
137 | uint32_t index; | ||
138 | |||
139 | do { | ||
140 | index = random_u32() % length; | ||
141 | } while (list[index]); | ||
142 | |||
143 | return index; | ||
144 | } | ||
145 | |||
100 | static void run_conference_tests(Tox **toxes, State *state) | 146 | static void run_conference_tests(Tox **toxes, State *state) |
101 | { | 147 | { |
148 | /* disabling name propagation check for now, as it occasionally fails due | ||
149 | * to disconnections too short to trigger freezing */ | ||
150 | const bool check_name_propagation = false; | ||
151 | |||
152 | printf("letting random toxes timeout\n"); | ||
153 | bool disconnected[NUM_GROUP_TOX] = {0}; | ||
154 | |||
155 | ck_assert(NUM_DISCONNECT < NUM_GROUP_TOX); | ||
156 | |||
157 | for (uint16_t i = 0; i < NUM_DISCONNECT; ++i) { | ||
158 | uint32_t disconnect = random_false_index(disconnected, NUM_GROUP_TOX); | ||
159 | disconnected[disconnect] = true; | ||
160 | printf("Disconnecting #%u\n", state[disconnect].index); | ||
161 | } | ||
162 | |||
163 | do { | ||
164 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | ||
165 | if (!disconnected[i]) { | ||
166 | tox_iterate(toxes[i], &state[i]); | ||
167 | state[i].clock += 1000; | ||
168 | } | ||
169 | } | ||
170 | |||
171 | c_sleep(20); | ||
172 | } while (!toxes_are_disconnected_from_group(NUM_GROUP_TOX, toxes, NUM_DISCONNECT, disconnected)); | ||
173 | |||
174 | if (check_name_propagation) { | ||
175 | printf("changing names\n"); | ||
176 | |||
177 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | ||
178 | char name[NAMELEN + 1]; | ||
179 | snprintf(name, NAMELEN + 1, NEW_NAME_FORMAT_STR, state[i].index); | ||
180 | tox_self_set_name(toxes[i], (const uint8_t *)name, NAMELEN, nullptr); | ||
181 | } | ||
182 | } | ||
183 | |||
184 | printf("reconnecting toxes\n"); | ||
185 | |||
186 | do { | ||
187 | iterate_all_wait(NUM_GROUP_TOX, toxes, state, ITERATION_INTERVAL); | ||
188 | } while (!all_connected_to_group(NUM_GROUP_TOX, toxes)); | ||
189 | |||
190 | printf("running conference tests\n"); | ||
191 | |||
102 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | 192 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { |
103 | tox_callback_conference_message(toxes[i], &handle_conference_message); | 193 | tox_callback_conference_message(toxes[i], &handle_conference_message); |
104 | } | 194 | } |
@@ -112,41 +202,33 @@ static void run_conference_tests(Tox **toxes, State *state) | |||
112 | err == TOX_ERR_CONFERENCE_SEND_MESSAGE_OK, "failed to send group message"); | 202 | err == TOX_ERR_CONFERENCE_SEND_MESSAGE_OK, "failed to send group message"); |
113 | num_recv = 0; | 203 | num_recv = 0; |
114 | 204 | ||
115 | for (uint8_t j = 0; j < 20; ++j) { | 205 | for (uint8_t j = 0; j < NUM_GROUP_TOX * 2; ++j) { |
116 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | 206 | iterate_all_wait(NUM_GROUP_TOX, toxes, state, ITERATION_INTERVAL); |
117 | tox_iterate(toxes[i], &state[i]); | ||
118 | } | ||
119 | |||
120 | c_sleep(25); | ||
121 | } | 207 | } |
122 | 208 | ||
123 | c_sleep(25); | ||
124 | ck_assert_msg(num_recv == NUM_GROUP_TOX, "failed to recv group messages"); | 209 | ck_assert_msg(num_recv == NUM_GROUP_TOX, "failed to recv group messages"); |
125 | 210 | ||
126 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | 211 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { |
127 | for (uint16_t j = 0; j < NUM_GROUP_TOX; ++j) { | 212 | for (uint16_t j = 0; j < NUM_GROUP_TOX; ++j) { |
128 | const size_t len = tox_conference_peer_get_name_size(toxes[i], 0, j, nullptr); | 213 | const size_t len = tox_conference_peer_get_name_size(toxes[i], 0, j, nullptr); |
129 | ck_assert_msg(len == NAMELEN, "name of #%u according to #%u has incorrect length %u", state[j].id, state[i].id, | 214 | ck_assert_msg(len == NAMELEN, "name of #%u according to #%u has incorrect length %u", state[j].index, state[i].index, |
130 | (unsigned int)len); | 215 | (unsigned int)len); |
131 | uint8_t name[NAMELEN]; | 216 | |
132 | tox_conference_peer_get_name(toxes[i], 0, j, name, nullptr); | 217 | if (check_name_propagation) { |
133 | char expected_name[NAMELEN + 1]; | 218 | uint8_t name[NAMELEN]; |
134 | snprintf(expected_name, NAMELEN + 1, NAME_FORMAT_STR, state[j].id); | 219 | tox_conference_peer_get_name(toxes[i], 0, j, name, nullptr); |
135 | ck_assert_msg(memcmp(name, expected_name, NAMELEN) == 0, | 220 | /* Note the toxes will have been reordered */ |
136 | "name of #%u according to #%u is \"" NAME_FORMAT "\"; expected \"%s\"", | 221 | ck_assert_msg(memcmp(name, "New", 3) == 0, |
137 | state[j].id, state[i].id, name, expected_name); | 222 | "name of #%u according to #%u not updated", state[j].index, state[i].index); |
223 | } | ||
138 | } | 224 | } |
139 | } | 225 | } |
140 | 226 | ||
141 | for (uint16_t k = NUM_GROUP_TOX; k != 0 ; --k) { | 227 | for (uint16_t k = NUM_GROUP_TOX; k != 0 ; --k) { |
142 | tox_conference_delete(toxes[k - 1], 0, nullptr); | 228 | tox_conference_delete(toxes[k - 1], 0, nullptr); |
143 | 229 | ||
144 | for (uint8_t j = 0; j < 10; ++j) { | 230 | for (uint8_t j = 0; j < 10 || j < NUM_GROUP_TOX; ++j) { |
145 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | 231 | iterate_all_wait(NUM_GROUP_TOX, toxes, state, ITERATION_INTERVAL); |
146 | tox_iterate(toxes[i], &state[i]); | ||
147 | } | ||
148 | |||
149 | c_sleep(50); | ||
150 | } | 232 | } |
151 | 233 | ||
152 | for (uint16_t i = 0; i < k - 1; ++i) { | 234 | for (uint16_t i = 0; i < k - 1; ++i) { |
@@ -158,82 +240,23 @@ static void run_conference_tests(Tox **toxes, State *state) | |||
158 | } | 240 | } |
159 | } | 241 | } |
160 | 242 | ||
161 | static void test_many_group(void) | 243 | static void test_many_group(Tox **toxes, State *state) |
162 | { | 244 | { |
163 | const time_t test_start_time = time(nullptr); | 245 | const time_t test_start_time = time(nullptr); |
164 | 246 | ||
165 | Tox *toxes[NUM_GROUP_TOX]; | ||
166 | State state[NUM_GROUP_TOX]; | ||
167 | memset(state, 0, NUM_GROUP_TOX * sizeof(State)); | ||
168 | time_t cur_time = time(nullptr); | ||
169 | struct Tox_Options *opts = tox_options_new(nullptr); | ||
170 | tox_options_set_start_port(opts, 33445); | ||
171 | tox_options_set_end_port(opts, 34445); | ||
172 | |||
173 | printf("creating %d toxes\n", NUM_GROUP_TOX); | ||
174 | |||
175 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | 247 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { |
176 | TOX_ERR_NEW err; | ||
177 | state[i].id = i + 1; | ||
178 | toxes[i] = tox_new_log(opts, &err, &state[i]); | ||
179 | |||
180 | ck_assert_msg(toxes[i] != nullptr, "failed to create tox instance %u: error %d", i, err); | ||
181 | tox_callback_self_connection_status(toxes[i], &handle_self_connection_status); | 248 | tox_callback_self_connection_status(toxes[i], &handle_self_connection_status); |
182 | tox_callback_friend_connection_status(toxes[i], &handle_friend_connection_status); | 249 | tox_callback_friend_connection_status(toxes[i], &handle_friend_connection_status); |
183 | tox_callback_conference_invite(toxes[i], &handle_conference_invite); | 250 | tox_callback_conference_invite(toxes[i], &handle_conference_invite); |
184 | tox_callback_conference_connected(toxes[i], &handle_conference_connected); | 251 | tox_callback_conference_connected(toxes[i], &handle_conference_connected); |
185 | 252 | ||
186 | char name[NAMELEN + 1]; | 253 | char name[NAMELEN + 1]; |
187 | snprintf(name, NAMELEN + 1, NAME_FORMAT_STR, state[i].id); | 254 | snprintf(name, NAMELEN + 1, NAME_FORMAT_STR, state[i].index); |
188 | tox_self_set_name(toxes[i], (const uint8_t *)name, NAMELEN, nullptr); | 255 | tox_self_set_name(toxes[i], (const uint8_t *)name, NAMELEN, nullptr); |
189 | |||
190 | if (i != 0) { | ||
191 | uint8_t dht_key[TOX_PUBLIC_KEY_SIZE]; | ||
192 | tox_self_get_dht_id(toxes[0], dht_key); | ||
193 | const uint16_t dht_port = tox_self_get_udp_port(toxes[0], nullptr); | ||
194 | |||
195 | tox_bootstrap(toxes[i], "localhost", dht_port, dht_key, nullptr); | ||
196 | } | ||
197 | } | 256 | } |
198 | 257 | ||
199 | tox_options_free(opts); | ||
200 | |||
201 | printf("creating a chain of friends\n"); | ||
202 | |||
203 | for (unsigned i = 1; i < NUM_GROUP_TOX; ++i) { | ||
204 | TOX_ERR_FRIEND_ADD err; | ||
205 | uint8_t key[TOX_PUBLIC_KEY_SIZE]; | ||
206 | |||
207 | tox_self_get_public_key(toxes[i - 1], key); | ||
208 | tox_friend_add_norequest(toxes[i], key, &err); | ||
209 | ck_assert_msg(err == TOX_ERR_FRIEND_ADD_OK, "failed to add friend: error %d", err); | ||
210 | |||
211 | tox_self_get_public_key(toxes[i], key); | ||
212 | tox_friend_add_norequest(toxes[i - 1], key, &err); | ||
213 | ck_assert_msg(err == TOX_ERR_FRIEND_ADD_OK, "failed to add friend: error %d", err); | ||
214 | } | ||
215 | |||
216 | printf("waiting for everyone to come online\n"); | ||
217 | unsigned online_count = 0; | ||
218 | |||
219 | do { | ||
220 | online_count = 0; | ||
221 | |||
222 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | ||
223 | tox_iterate(toxes[i], &state[i]); | ||
224 | online_count += tox_friend_get_connection_status(toxes[i], 0, nullptr) != TOX_CONNECTION_NONE; | ||
225 | } | ||
226 | |||
227 | printf("currently %u toxes are online\n", online_count); | ||
228 | fflush(stdout); | ||
229 | |||
230 | c_sleep(1000); | ||
231 | } while (online_count != NUM_GROUP_TOX); | ||
232 | |||
233 | printf("friends connected, took %d seconds\n", (int)(time(nullptr) - cur_time)); | ||
234 | |||
235 | ck_assert_msg(tox_conference_new(toxes[0], nullptr) != UINT32_MAX, "failed to create group"); | 258 | ck_assert_msg(tox_conference_new(toxes[0], nullptr) != UINT32_MAX, "failed to create group"); |
236 | printf("tox #%u: inviting its first friend\n", state[0].id); | 259 | printf("tox #%u: inviting its first friend\n", state[0].index); |
237 | ck_assert_msg(tox_conference_invite(toxes[0], 0, 0, nullptr) != 0, "failed to invite friend"); | 260 | ck_assert_msg(tox_conference_invite(toxes[0], 0, 0, nullptr) != 0, "failed to invite friend"); |
238 | state[0].invited_next = true; | 261 | state[0].invited_next = true; |
239 | ck_assert_msg(tox_conference_set_title(toxes[0], 0, (const uint8_t *)"Gentoo", sizeof("Gentoo") - 1, nullptr) != 0, | 262 | ck_assert_msg(tox_conference_set_title(toxes[0], 0, (const uint8_t *)"Gentoo", sizeof("Gentoo") - 1, nullptr) != 0, |
@@ -244,17 +267,16 @@ static void test_many_group(void) | |||
244 | uint16_t invited_count = 0; | 267 | uint16_t invited_count = 0; |
245 | 268 | ||
246 | do { | 269 | do { |
270 | iterate_all_wait(NUM_GROUP_TOX, toxes, state, ITERATION_INTERVAL); | ||
271 | |||
247 | invited_count = 0; | 272 | invited_count = 0; |
248 | 273 | ||
249 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | 274 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { |
250 | tox_iterate(toxes[i], &state[i]); | ||
251 | invited_count += state[i].invited_next; | 275 | invited_count += state[i].invited_next; |
252 | } | 276 | } |
253 | |||
254 | c_sleep(50); | ||
255 | } while (invited_count != NUM_GROUP_TOX - 1); | 277 | } while (invited_count != NUM_GROUP_TOX - 1); |
256 | 278 | ||
257 | cur_time = time(nullptr); | 279 | uint64_t pregroup_clock = state[0].clock; |
258 | printf("waiting for all toxes to be in the group\n"); | 280 | printf("waiting for all toxes to be in the group\n"); |
259 | uint16_t fully_connected_count = 0; | 281 | uint16_t fully_connected_count = 0; |
260 | 282 | ||
@@ -262,8 +284,9 @@ static void test_many_group(void) | |||
262 | fully_connected_count = 0; | 284 | fully_connected_count = 0; |
263 | printf("current peer counts: ["); | 285 | printf("current peer counts: ["); |
264 | 286 | ||
287 | iterate_all_wait(NUM_GROUP_TOX, toxes, state, ITERATION_INTERVAL); | ||
288 | |||
265 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | 289 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { |
266 | tox_iterate(toxes[i], &state[i]); | ||
267 | TOX_ERR_CONFERENCE_PEER_QUERY err; | 290 | TOX_ERR_CONFERENCE_PEER_QUERY err; |
268 | uint32_t peer_count = tox_conference_peer_count(toxes[i], 0, &err); | 291 | uint32_t peer_count = tox_conference_peer_count(toxes[i], 0, &err); |
269 | 292 | ||
@@ -282,8 +305,6 @@ static void test_many_group(void) | |||
282 | 305 | ||
283 | printf("]\n"); | 306 | printf("]\n"); |
284 | fflush(stdout); | 307 | fflush(stdout); |
285 | |||
286 | c_sleep(200); | ||
287 | } while (fully_connected_count != NUM_GROUP_TOX); | 308 | } while (fully_connected_count != NUM_GROUP_TOX); |
288 | 309 | ||
289 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | 310 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { |
@@ -300,16 +321,10 @@ static void test_many_group(void) | |||
300 | ck_assert_msg(memcmp("Gentoo", title, ret) == 0, "Wrong title"); | 321 | ck_assert_msg(memcmp("Gentoo", title, ret) == 0, "Wrong title"); |
301 | } | 322 | } |
302 | 323 | ||
303 | printf("group connected, took %d seconds\n", (int)(time(nullptr) - cur_time)); | 324 | printf("group connected, took %d seconds\n", (int)((state[0].clock - pregroup_clock) / 1000)); |
304 | 325 | ||
305 | run_conference_tests(toxes, state); | 326 | run_conference_tests(toxes, state); |
306 | 327 | ||
307 | printf("tearing down toxes\n"); | ||
308 | |||
309 | for (uint16_t i = 0; i < NUM_GROUP_TOX; ++i) { | ||
310 | tox_kill(toxes[i]); | ||
311 | } | ||
312 | |||
313 | printf("test_many_group succeeded, took %d seconds\n", (int)(time(nullptr) - test_start_time)); | 328 | printf("test_many_group succeeded, took %d seconds\n", (int)(time(nullptr) - test_start_time)); |
314 | } | 329 | } |
315 | 330 | ||
@@ -317,6 +332,6 @@ int main(void) | |||
317 | { | 332 | { |
318 | setvbuf(stdout, nullptr, _IONBF, 0); | 333 | setvbuf(stdout, nullptr, _IONBF, 0); |
319 | 334 | ||
320 | test_many_group(); | 335 | run_auto_test(NUM_GROUP_TOX, test_many_group, true); |
321 | return 0; | 336 | return 0; |
322 | } | 337 | } |
diff --git a/auto_tests/friend_connection_test.c b/auto_tests/friend_connection_test.c index ab91e0f0..55a930e2 100644 --- a/auto_tests/friend_connection_test.c +++ b/auto_tests/friend_connection_test.c | |||
@@ -27,6 +27,6 @@ int main(void) | |||
27 | { | 27 | { |
28 | setvbuf(stdout, nullptr, _IONBF, 0); | 28 | setvbuf(stdout, nullptr, _IONBF, 0); |
29 | 29 | ||
30 | run_auto_test(2, friend_connection_test); | 30 | run_auto_test(2, friend_connection_test, false); |
31 | return 0; | 31 | return 0; |
32 | } | 32 | } |
diff --git a/auto_tests/lossless_packet_test.c b/auto_tests/lossless_packet_test.c index 5b8ee947..1b6de806 100644 --- a/auto_tests/lossless_packet_test.c +++ b/auto_tests/lossless_packet_test.c | |||
@@ -61,6 +61,6 @@ int main(void) | |||
61 | { | 61 | { |
62 | setvbuf(stdout, nullptr, _IONBF, 0); | 62 | setvbuf(stdout, nullptr, _IONBF, 0); |
63 | 63 | ||
64 | run_auto_test(2, test_lossless_packet); | 64 | run_auto_test(2, test_lossless_packet, false); |
65 | return 0; | 65 | return 0; |
66 | } | 66 | } |
diff --git a/auto_tests/lossy_packet_test.c b/auto_tests/lossy_packet_test.c index 10d4e505..5080b006 100644 --- a/auto_tests/lossy_packet_test.c +++ b/auto_tests/lossy_packet_test.c | |||
@@ -57,6 +57,6 @@ int main(void) | |||
57 | { | 57 | { |
58 | setvbuf(stdout, nullptr, _IONBF, 0); | 58 | setvbuf(stdout, nullptr, _IONBF, 0); |
59 | 59 | ||
60 | run_auto_test(2, test_lossy_packet); | 60 | run_auto_test(2, test_lossy_packet, false); |
61 | return 0; | 61 | return 0; |
62 | } | 62 | } |
diff --git a/auto_tests/overflow_recvq_test.c b/auto_tests/overflow_recvq_test.c index f70618c4..3f7561e1 100644 --- a/auto_tests/overflow_recvq_test.c +++ b/auto_tests/overflow_recvq_test.c | |||
@@ -62,6 +62,6 @@ int main(void) | |||
62 | { | 62 | { |
63 | setvbuf(stdout, nullptr, _IONBF, 0); | 63 | setvbuf(stdout, nullptr, _IONBF, 0); |
64 | 64 | ||
65 | run_auto_test(3, net_crypto_overflow_test); | 65 | run_auto_test(3, net_crypto_overflow_test, false); |
66 | return 0; | 66 | return 0; |
67 | } | 67 | } |
diff --git a/auto_tests/overflow_sendq_test.c b/auto_tests/overflow_sendq_test.c index ce132d63..e67da1cf 100644 --- a/auto_tests/overflow_sendq_test.c +++ b/auto_tests/overflow_sendq_test.c | |||
@@ -47,6 +47,6 @@ int main(void) | |||
47 | { | 47 | { |
48 | setvbuf(stdout, nullptr, _IONBF, 0); | 48 | setvbuf(stdout, nullptr, _IONBF, 0); |
49 | 49 | ||
50 | run_auto_test(2, net_crypto_overflow_test); | 50 | run_auto_test(2, net_crypto_overflow_test, false); |
51 | return 0; | 51 | return 0; |
52 | } | 52 | } |
diff --git a/auto_tests/reconnect_test.c b/auto_tests/reconnect_test.c index e56d818c..9ccceb39 100644 --- a/auto_tests/reconnect_test.c +++ b/auto_tests/reconnect_test.c | |||
@@ -101,6 +101,6 @@ int main(void) | |||
101 | { | 101 | { |
102 | setvbuf(stdout, nullptr, _IONBF, 0); | 102 | setvbuf(stdout, nullptr, _IONBF, 0); |
103 | 103 | ||
104 | run_auto_test(TOX_COUNT, test_reconnect); | 104 | run_auto_test(TOX_COUNT, test_reconnect, false); |
105 | return 0; | 105 | return 0; |
106 | } | 106 | } |
diff --git a/auto_tests/run_auto_test.h b/auto_tests/run_auto_test.h index bcbfed55..4f2dc278 100644 --- a/auto_tests/run_auto_test.h +++ b/auto_tests/run_auto_test.h | |||
@@ -48,7 +48,7 @@ static uint64_t get_state_clock_callback(Mono_Time *mono_time, void *user_data) | |||
48 | return state->clock; | 48 | return state->clock; |
49 | } | 49 | } |
50 | 50 | ||
51 | static void run_auto_test(uint32_t tox_count, void test(Tox **toxes, State *state)) | 51 | static void run_auto_test(uint32_t tox_count, void test(Tox **toxes, State *state), bool chain) |
52 | { | 52 | { |
53 | printf("initialising %u toxes\n", tox_count); | 53 | printf("initialising %u toxes\n", tox_count); |
54 | Tox **toxes = (Tox **)calloc(tox_count, sizeof(Tox *)); | 54 | Tox **toxes = (Tox **)calloc(tox_count, sizeof(Tox *)); |
@@ -66,19 +66,34 @@ static void run_auto_test(uint32_t tox_count, void test(Tox **toxes, State *stat | |||
66 | mono_time_set_current_time_callback(mono_time, get_state_clock_callback, &state[i]); | 66 | mono_time_set_current_time_callback(mono_time, get_state_clock_callback, &state[i]); |
67 | } | 67 | } |
68 | 68 | ||
69 | printf("toxes all add each other as friends\n"); | 69 | if (chain) { |
70 | printf("each tox adds adjacent toxes as friends\n"); | ||
71 | |||
72 | for (uint32_t i = 0; i < tox_count; i++) { | ||
73 | for (uint32_t j = i - 1; j != i + 3; j += 2) { | ||
74 | if (j >= tox_count) { | ||
75 | continue; | ||
76 | } | ||
70 | 77 | ||
71 | for (uint32_t i = 0; i < tox_count; i++) { | ||
72 | for (uint32_t j = 0; j < tox_count; j++) { | ||
73 | if (i != j) { | ||
74 | uint8_t public_key[TOX_PUBLIC_KEY_SIZE]; | 78 | uint8_t public_key[TOX_PUBLIC_KEY_SIZE]; |
75 | tox_self_get_public_key(toxes[j], public_key); | 79 | tox_self_get_public_key(toxes[j], public_key); |
76 | tox_friend_add_norequest(toxes[i], public_key, nullptr); | 80 | tox_friend_add_norequest(toxes[i], public_key, nullptr); |
77 | } | 81 | } |
78 | } | 82 | } |
83 | } else { | ||
84 | printf("toxes all add each other as friends\n"); | ||
85 | |||
86 | for (uint32_t i = 0; i < tox_count; i++) { | ||
87 | for (uint32_t j = 0; j < tox_count; j++) { | ||
88 | if (i != j) { | ||
89 | uint8_t public_key[TOX_PUBLIC_KEY_SIZE]; | ||
90 | tox_self_get_public_key(toxes[j], public_key); | ||
91 | tox_friend_add_norequest(toxes[i], public_key, nullptr); | ||
92 | } | ||
93 | } | ||
94 | } | ||
79 | } | 95 | } |
80 | 96 | ||
81 | |||
82 | printf("bootstrapping all toxes off toxes[0]\n"); | 97 | printf("bootstrapping all toxes off toxes[0]\n"); |
83 | uint8_t dht_key[TOX_PUBLIC_KEY_SIZE]; | 98 | uint8_t dht_key[TOX_PUBLIC_KEY_SIZE]; |
84 | tox_self_get_dht_id(toxes[0], dht_key); | 99 | tox_self_get_dht_id(toxes[0], dht_key); |
diff --git a/auto_tests/send_message_test.c b/auto_tests/send_message_test.c index 81969d59..5346dc9e 100644 --- a/auto_tests/send_message_test.c +++ b/auto_tests/send_message_test.c | |||
@@ -61,6 +61,6 @@ int main(void) | |||
61 | { | 61 | { |
62 | setvbuf(stdout, nullptr, _IONBF, 0); | 62 | setvbuf(stdout, nullptr, _IONBF, 0); |
63 | 63 | ||
64 | run_auto_test(2, send_message_test); | 64 | run_auto_test(2, send_message_test, false); |
65 | return 0; | 65 | return 0; |
66 | } | 66 | } |