/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 | } |