Coverage Report

Created: 2026-10-24 08:16

/work/auto_tests/scenarios/scenario_conference_simple_test.c
Line
Count
Source (jump to first uncovered line)
1
#include "framework/framework.h"
2
#include <stdio.h>
3
#include <string.h>
4
5
typedef struct {
6
    bool joined;
7
    bool connected;
8
    uint32_t conference;
9
    bool received;
10
    uint32_t peers;
11
} State;
12
13
static void on_conference_connected(const Tox_Event_Conference_Connected *event, void *user_data)
14
20
{
15
20
    ToxNode *self = (ToxNode *)user_data;
16
20
    State *state = (State *)tox_node_get_script_ctx(self);
17
20
    state->connected = true;
18
20
    tox_node_log(self, "Connected to conference %u", tox_event_conference_connected_get_conference_number(event));
19
20
}
20
21
static void on_conference_invite(const Tox_Event_Conference_Invite *event, void *user_data)
22
2
{
23
2
    ToxNode *self = (ToxNode *)user_data;
24
2
    State *state = (State *)tox_node_get_script_ctx(self);
25
26
2
    tox_node_log(self, "Received conference invite from friend %u", tox_event_conference_invite_get_friend_number(event));
27
2
    Tox_Err_Conference_Join err;
28
2
    state->conference = tox_conference_join(tox_node_get_tox(self),
29
2
                                            tox_event_conference_invite_get_friend_number(event),
30
2
                                            tox_event_conference_invite_get_cookie(event),
31
2
                                            tox_event_conference_invite_get_cookie_length(event),
32
2
                                            &err);
33
2
    if (err == TOX_ERR_CONFERENCE_JOIN_OK) {
34
2
        state->joined = true;
35
2
        tox_node_log(self, "Joined conference %u", state->conference);
36
2
    } else {
37
0
        tox_node_log(self, "Failed to join conference: %u", err);
38
0
    }
39
2
}
40
41
static void on_conference_message(const Tox_Event_Conference_Message *event, void *user_data)
42
18
{
43
18
    ToxNode *self = (ToxNode *)user_data;
44
18
    State *state = (State *)tox_node_get_script_ctx(self);
45
18
    const uint8_t *msg = tox_event_conference_message_get_message(event);
46
18
    if (memcmp(msg, "hello!", 6) == 0) {
47
18
        state->received = true;
48
18
    }
49
18
}
50
51
static void on_conference_peer_list_changed(const Tox_Event_Conference_Peer_List_Changed *event, void *user_data)
52
8
{
53
8
    ToxNode *self = (ToxNode *)user_data;
54
8
    State *state = (State *)tox_node_get_script_ctx(self);
55
56
8
    state->peers = tox_conference_peer_count(tox_node_get_tox(self), tox_event_conference_peer_list_changed_get_conference_number(event), nullptr);
57
8
}
58
59
static void tox1_script(ToxNode *self, void *ctx)
60
1
{
61
1
    Tox *tox = tox_node_get_tox(self);
62
1
    State *state = (State *)ctx;
63
1
    tox_events_callback_conference_peer_list_changed(tox_node_get_dispatch(self), on_conference_peer_list_changed);
64
65
1
    WAIT_UNTIL(tox_node_is_self_connected(self));
66
1
    WAIT_UNTIL(tox_node_is_friend_connected(self, 0));
67
68
1
    tox_node_log(self, "Creating conference...");
69
1
    Tox_Err_Conference_New err_new;
70
1
    state->conference = tox_conference_new(tox, &err_new);
71
1
    state->joined = true;
72
73
1
    tox_node_log(self, "Inviting Bob...");
74
1
    Tox_Err_Conference_Invite err_inv;
75
1
    tox_conference_invite(tox, 0, state->conference, &err_inv);
76
77
1
    WAIT_UNTIL(state->peers == 3);
78
1
    tox_node_log(self, "All peers joined!");
79
80
1
    Tox_Err_Conference_Send_Message err_msg;
81
1
    tox_conference_send_message(tox, state->conference, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)"hello!", 6, &err_msg);
82
1
}
83
84
static void tox2_script(ToxNode *self, void *ctx)
85
1
{
86
1
    Tox *tox = tox_node_get_tox(self);
87
1
    State *state = (State *)ctx;
88
1
    tox_events_callback_conference_connected(tox_node_get_dispatch(self), on_conference_connected);
89
1
    tox_events_callback_conference_invite(tox_node_get_dispatch(self), on_conference_invite);
90
1
    tox_events_callback_conference_message(tox_node_get_dispatch(self), on_conference_message);
91
1
    tox_events_callback_conference_peer_list_changed(tox_node_get_dispatch(self), on_conference_peer_list_changed);
92
93
1
    WAIT_UNTIL(tox_node_is_self_connected(self));
94
1
    tox_node_log(self, "Waiting for join...");
95
1
    WAIT_UNTIL(state->joined);
96
1
    tox_node_log(self, "Joined conference %u. Waiting for connection...", state->conference);
97
1
    WAIT_UNTIL(state->connected);
98
1
    tox_node_log(self, "Connected. Waiting for Charlie to connect...");
99
100
1
    WAIT_UNTIL(tox_node_is_friend_connected(self, 1));
101
1
    tox_node_log(self, "Charlie connected. Inviting Charlie...");
102
103
1
    Tox_Err_Conference_Invite err_inv;
104
1
    bool ok = tox_conference_invite(tox, 1, state->conference, &err_inv);
105
1
    if (ok) {
106
1
        tox_node_log(self, "Successfully invited Charlie");
107
1
    } else {
108
0
        tox_node_log(self, "Failed to invite Charlie: %u", err_inv);
109
0
    }
110
111
1
    WAIT_UNTIL(state->received);
112
1
    tox_node_log(self, "Received message!");
113
1
}
114
115
static void tox3_script(ToxNode *self, void *ctx)
116
1
{
117
1
    const State *state = (const State *)ctx;
118
1
    tox_events_callback_conference_invite(tox_node_get_dispatch(self), on_conference_invite);
119
1
    tox_events_callback_conference_message(tox_node_get_dispatch(self), on_conference_message);
120
1
    tox_events_callback_conference_peer_list_changed(tox_node_get_dispatch(self), on_conference_peer_list_changed);
121
122
1
    WAIT_UNTIL(tox_node_is_self_connected(self));
123
1
    tox_node_log(self, "Waiting for message...");
124
1
    WAIT_UNTIL(state->received);
125
1
    tox_node_log(self, "Received message!");
126
1
}
127
128
int main(int argc, char *argv[])
129
31
{
130
31
    ToxScenario *s = tox_scenario_new(argc, argv, 600000); // 10m virtual timeout
131
31
    State s1 = {0}, s2 = {0}, s3 = {0};
132
133
31
    ToxNode *t1 = tox_scenario_add_node(s, "Alice", tox1_script, &s1, sizeof(State));
134
31
    ToxNode *t2 = tox_scenario_add_node(s, "Bob", tox2_script, &s2, sizeof(State));
135
31
    ToxNode *t3 = tox_scenario_add_node(s, "Charlie", tox3_script, &s3, sizeof(State));
136
137
    // t1 <-> t2, t2 <-> t3
138
31
    tox_node_friend_add(t1, t2);
139
31
    tox_node_friend_add(t2, t1);
140
31
    tox_node_friend_add(t2, t3);
141
31
    tox_node_friend_add(t3, t2);
142
143
31
    tox_node_bootstrap(t2, t1);
144
31
    tox_node_bootstrap(t3, t1); // All bootstrap from Alice
145
31
    tox_node_bootstrap(t3, t2);
146
147
31
    ToxScenarioStatus res = tox_scenario_run(s);
148
31
    if (res != TOX_SCENARIO_DONE) {
149
0
        tox_scenario_log(s, "Test failed with status %u", res);
150
0
        return 1;
151
0
    }
152
153
31
    tox_scenario_free(s);
154
31
    return 0;
155
31
}