Coverage Report

Created: 2025-10-08 19:34

/work/auto_tests/tox_many_test.c
Line
Count
Source (jump to first uncovered line)
1
/* Auto Tests: Many clients.
2
 */
3
4
#include <stdio.h>
5
#include <string.h>
6
#include <time.h>
7
8
#include "../testing/misc_tools.h"
9
#include "../toxcore/crypto_core.h"
10
#include "../toxcore/os_random.h"
11
#include "../toxcore/tox.h"
12
#include "auto_test_support.h"
13
#include "check_compat.h"
14
15
static void accept_friend_request(const Tox_Event_Friend_Request *event, void *userdata)
16
53
{
17
53
    Tox *tox = (Tox *)userdata;
18
19
53
    const uint8_t *public_key = tox_event_friend_request_get_public_key(event);
20
53
    const uint8_t *message = tox_event_friend_request_get_message(event);
21
53
    const uint32_t message_length = tox_event_friend_request_get_message_length(event);
22
23
53
    if (message_length == 7 && memcmp("Gentoo", message, 7) == 0) {
24
53
        tox_friend_add_norequest(tox, public_key, nullptr);
25
53
    }
26
53
}
27
28
21.8k
#define TCP_TEST_NUM_TOXES 90
29
169
#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
50
loop_top:
68
50
        pairs[i].tox1 = random_u32(rng) % TCP_TEST_NUM_TOXES;
69
50
        pairs[i].tox2 = (pairs[i].tox1 + random_u32(rng) % (TCP_TEST_NUM_TOXES - 1) + 1) % TCP_TEST_NUM_TOXES;
70
71
1.27k
        for (uint32_t j = 0; j < i; ++j) {
72
1.22k
            if (pairs[j].tox2 == pairs[i].tox1 && pairs[j].tox1 == pairs[i].tox2) {
73
0
                goto loop_top;
74
0
            }
75
1.22k
        }
76
77
50
        tox_self_get_address(toxes[pairs[i].tox1], address);
78
79
50
        Tox_Err_Friend_Add test;
80
50
        uint32_t num = tox_friend_add(toxes[pairs[i].tox2], address, (const uint8_t *)"Gentoo", 7, &test);
81
82
50
        if (test == TOX_ERR_FRIEND_ADD_ALREADY_SENT) {
83
0
            goto loop_top;
84
0
        }
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: %u", 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
118
    while (true) {
104
118
        uint16_t counter = 0;
105
106
10.7k
        for (uint32_t i = 0; i < TCP_TEST_NUM_TOXES; ++i) {
107
19.0k
            for (uint32_t j = 0; j < tox_self_get_friend_list_size(toxes[i]); ++j) {
108
8.40k
                if (tox_friend_get_connection_status(toxes[i], j, nullptr) == TOX_CONNECTION_UDP) {
109
3.67k
                    ++counter;
110
3.67k
                }
111
8.40k
            }
112
10.6k
        }
113
114
118
        if (counter != last_count) {
115
40
            printf("many_clients got to %u\n", counter);
116
40
            last_count = counter;
117
40
        }
118
119
118
        if (counter == TCP_TEST_NUM_FRIENDS * 2) {
120
1
            break;
121
1
        }
122
123
10.6k
        for (uint32_t i = 0; i < TCP_TEST_NUM_TOXES; ++i) {
124
10.5k
            Tox_Err_Events_Iterate err = TOX_ERR_EVENTS_ITERATE_OK;
125
10.5k
            Tox_Events *events = tox_events_iterate(toxes[i], true, &err);
126
10.5k
            ck_assert(err == TOX_ERR_EVENTS_ITERATE_OK);
127
10.5k
            tox_dispatch_invoke(dispatch, events, toxes[i]);
128
10.5k
            tox_events_free(events);
129
10.5k
        }
130
131
117
        c_sleep(50);
132
117
    }
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
545
{
144
545
    setvbuf(stdout, nullptr, _IONBF, 0);
145
146
545
    test_many_clients();
147
545
    return 0;
148
545
}