Coverage Report

Created: 2025-10-08 19:34

/work/auto_tests/conference_double_invite_test.c
Line
Count
Source (jump to first uncovered line)
1
#include <stdbool.h>
2
#include <stdint.h>
3
4
typedef struct State {
5
    bool self_online;
6
    bool friend_online;
7
8
    bool joined;
9
    uint32_t conference;
10
} State;
11
12
#include "auto_test_support.h"
13
14
static void handle_conference_invite(
15
    const Tox_Event_Conference_Invite *event, void *user_data)
16
18
{
17
18
    const AutoTox *autotox = (AutoTox *)user_data;
18
18
    State *state = (State *)autotox->state;
19
20
18
    const uint32_t friend_number = tox_event_conference_invite_get_friend_number(event);
21
18
    const Tox_Conference_Type type = tox_event_conference_invite_get_type(event);
22
18
    const uint8_t *cookie = tox_event_conference_invite_get_cookie(event);
23
18
    const size_t length = tox_event_conference_invite_get_cookie_length(event);
24
25
18
    fprintf(stderr, "handle_conference_invite(#%u, %u, %u, uint8_t[%u], _)\n",
26
18
            autotox->index, friend_number, type, (unsigned)length);
27
18
    fprintf(stderr, "tox%u joining conference\n", autotox->index);
28
29
18
    ck_assert_msg(!state->joined, "invitation callback generated for already joined conference");
30
31
18
    if (friend_number != UINT32_MAX) {
32
18
        Tox_Err_Conference_Join err;
33
18
        state->conference = tox_conference_join(autotox->tox, friend_number, cookie, length, &err);
34
18
        ck_assert_msg(err == TOX_ERR_CONFERENCE_JOIN_OK,
35
18
                      "attempting to join the conference returned with an error: %u", err);
36
15
        fprintf(stderr, "tox%u joined conference %u\n", autotox->index, state->conference);
37
15
        state->joined = true;
38
15
    }
39
18
}
40
41
static void conference_double_invite_test(AutoTox *autotoxes)
42
27
{
43
    // Conference callbacks.
44
27
    tox_events_callback_conference_invite(autotoxes[0].dispatch, handle_conference_invite);
45
27
    tox_events_callback_conference_invite(autotoxes[1].dispatch, handle_conference_invite);
46
47
27
    State *state[2];
48
27
    state[0] = (State *)autotoxes[0].state;
49
27
    state[1] = (State *)autotoxes[1].state;
50
51
27
    {
52
        // Create new conference, tox0 is the founder.
53
27
        Tox_Err_Conference_New err;
54
27
        state[0]->conference = tox_conference_new(autotoxes[0].tox, &err);
55
27
        state[0]->joined = true;
56
27
        ck_assert_msg(err == TOX_ERR_CONFERENCE_NEW_OK,
57
27
                      "attempting to create a new conference returned with an error: %u", err);
58
25
        fprintf(stderr, "Created conference: index=%u\n", state[0]->conference);
59
25
    }
60
61
0
    {
62
        // Invite friend.
63
25
        Tox_Err_Conference_Invite err;
64
25
        tox_conference_invite(autotoxes[0].tox, 0, state[0]->conference, &err);
65
25
        ck_assert_msg(err == TOX_ERR_CONFERENCE_INVITE_OK,
66
25
                      "attempting to invite a friend returned with an error: %u", err);
67
24
        fprintf(stderr, "tox0 invited tox1\n");
68
24
    }
69
70
0
    fprintf(stderr, "Waiting for invitation to arrive\n");
71
72
49
    do {
73
49
        iterate_all_wait(autotoxes, 2, ITERATION_INTERVAL);
74
49
    } while (!state[0]->joined || !state[1]->joined);
75
76
24
    fprintf(stderr, "Invitations accepted\n");
77
78
24
    fprintf(stderr, "Sending second invitation; should be ignored\n");
79
24
    tox_conference_invite(autotoxes[0].tox, 0, state[0]->conference, nullptr);
80
81
24
    iterate_all_wait(autotoxes, 2, ITERATION_INTERVAL);
82
24
}
83
84
int main(void)
85
545
{
86
545
    setvbuf(stdout, nullptr, _IONBF, 0);
87
88
545
    Run_Auto_Options options = default_run_auto_options();
89
545
    options.graph = GRAPH_LINEAR;
90
91
545
    run_auto_test(nullptr, 2, conference_double_invite_test, sizeof(State), &options);
92
93
545
    return 0;
94
545
}