Skip to content

Commit

Permalink
QUIC RCIDM: Add test
Browse files Browse the repository at this point in the history
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from #23022)
  • Loading branch information
hlandau authored and t8m committed Jan 11, 2024
1 parent 9575b21 commit 433ef94
Show file tree
Hide file tree
Showing 3 changed files with 151 additions and 1 deletion.
6 changes: 5 additions & 1 deletion test/build.info
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,10 @@ IF[{- !$disabled{tests} -}]
INCLUDE[quic_lcidm_test]=../include ../apps/include
DEPEND[quic_lcidm_test]=../libcrypto.a ../libssl.a libtestutil.a

SOURCE[quic_rcidm_test]=quic_rcidm_test.c
INCLUDE[quic_rcidm_test]=../include ../apps/include
DEPEND[quic_rcidm_test]=../libcrypto.a ../libssl.a libtestutil.a

SOURCE[quic_fifd_test]=quic_fifd_test.c cc_dummy.c
INCLUDE[quic_fifd_test]=../include ../apps/include
DEPEND[quic_fifd_test]=../libcrypto.a ../libssl.a libtestutil.a
Expand Down Expand Up @@ -1160,7 +1164,7 @@ ENDIF
IF[{- !$disabled{'quic'} -}]
PROGRAMS{noinst}=quic_wire_test quic_ackm_test quic_record_test
PROGRAMS{noinst}=quic_fc_test quic_stream_test quic_cfq_test quic_txpim_test
PROGRAMS{noinst}=quic_srtm_test quic_lcidm_test
PROGRAMS{noinst}=quic_srtm_test quic_lcidm_test quic_rcidm_test
PROGRAMS{noinst}=quic_fifd_test quic_txp_test quic_tserver_test
PROGRAMS{noinst}=quic_client_test quic_cc_test quic_multistream_test
ENDIF
Expand Down
127 changes: 127 additions & 0 deletions test/quic_rcidm_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
/*
* Copyright 2023 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 } };

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;
}
19 changes: 19 additions & 0 deletions test/recipes/70-test_quic_rcidm.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#! /usr/bin/env perl
# Copyright 2023 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

use OpenSSL::Test;
use OpenSSL::Test::Utils;

setup("test_quic_rcidm");

plan skip_all => "QUIC protocol is not supported by this OpenSSL build"
if disabled('quic');

plan tests => 1;

ok(run(test(["quic_rcidm_test"])));

0 comments on commit 433ef94

Please sign in to comment.