summaryrefslogtreecommitdiffstats
path: root/test/quic_rcidm_test.c
blob: 4b7fa50eea4d7204669c41c89f10775c9c31b0b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Copyright 2023-2024 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include "internal/quic_rcidm.h"
#include "testutil.h"

static const QUIC_CONN_ID cid8_1 = { 8, { 1 } };
static const QUIC_CONN_ID cid8_2 = { 8, { 2 } };
static const QUIC_CONN_ID cid8_3 = { 8, { 3 } };
static const QUIC_CONN_ID cid8_4 = { 8, { 4 } };
static const QUIC_CONN_ID cid8_5 = { 8, { 5 } };

/*
 * 0: Client, Initial ODCID
 * 1: Client, Initial ODCID + Retry ODCID
 * 2: Server, doesn't start with Initial ODCID
 */
static int test_rcidm(int idx)
{
    int testresult = 0;
    QUIC_RCIDM *rcidm;
    OSSL_QUIC_FRAME_NEW_CONN_ID ncid_frame_1 = {0}, ncid_frame_2 = {0};
    QUIC_CONN_ID dcid_out;
    const QUIC_CONN_ID *odcid = NULL;
    uint64_t seq_num_out;

    ncid_frame_1.seq_num        = 2;
    ncid_frame_1.conn_id.id_len = 8;
    ncid_frame_1.conn_id.id[0]  = 3;

    ncid_frame_2.seq_num        = 3;
    ncid_frame_2.conn_id.id_len = 8;
    ncid_frame_2.conn_id.id[0]  = 4;

    odcid = ((idx == 2) ? NULL : &cid8_1);
    if (!TEST_ptr(rcidm = ossl_quic_rcidm_new(odcid)))
        goto err;

    if (idx != 2) {
        if (/* ODCID not counted */
            !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
            || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
            || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))

            || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_1))
            || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
            goto err;
    } else {
        if (!TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
            || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
            goto err;
    }

    if (idx == 1) {
        if (!TEST_true(ossl_quic_rcidm_add_from_server_retry(rcidm, &cid8_5))
            || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
            || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
            || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))

            || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_5))
            || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
            goto err;
    }

    if (!TEST_true(ossl_quic_rcidm_add_from_initial(rcidm, &cid8_2))
        /* Initial SCID (seq=0) is counted */
        || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 1)
        || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
        || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
        || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
        || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2))

        || !TEST_true(ossl_quic_rcidm_add_from_ncid(rcidm, &ncid_frame_1))
        || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 2)
        /* Not changed over yet - handshake not confirmed */
        || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
        || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
        || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2))

        || !TEST_true(ossl_quic_rcidm_add_from_ncid(rcidm, &ncid_frame_2))
        || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 3)
        || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 0)
        || !TEST_false(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
        /* Not changed over yet - handshake not confirmed */
        || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
        || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
        || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2)))
        goto err;

    ossl_quic_rcidm_on_handshake_complete(rcidm);

    if (!TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
        || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
        || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
        || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_3))
        || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 1)
        || !TEST_true(ossl_quic_rcidm_peek_retire_seq_num(rcidm, &seq_num_out))
        || !TEST_uint64_t_eq(seq_num_out, 0))
        goto err;

    ossl_quic_rcidm_request_roll(rcidm);

    if (!TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
        || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
        || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
        || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_4))
        || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 2)
        || !TEST_true(ossl_quic_rcidm_peek_retire_seq_num(rcidm, &seq_num_out))
        || !TEST_uint64_t_eq(seq_num_out, 0)
        || !TEST_true(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
        || !TEST_uint64_t_eq(seq_num_out, 0)
        || !TEST_true(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
        || !TEST_uint64_t_eq(seq_num_out, 2))
        goto err;

    testresult = 1;
err:
    ossl_quic_rcidm_free(rcidm);
    return testresult;
}

int setup_tests(void)
{
    ADD_ALL_TESTS(test_rcidm, 3);
    return 1;
}