aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/build.info6
-rw-r--r--test/quic_tserver_test.c65
2 files changed, 63 insertions, 8 deletions
diff --git a/doc/build.info b/doc/build.info
index f6a8b951f3..a7897abdb3 100644
--- a/doc/build.info
+++ b/doc/build.info
@@ -2583,6 +2583,10 @@ DEPEND[html/man3/SSL_in_init.html]=man3/SSL_in_init.pod
GENERATE[html/man3/SSL_in_init.html]=man3/SSL_in_init.pod
DEPEND[man/man3/SSL_in_init.3]=man3/SSL_in_init.pod
GENERATE[man/man3/SSL_in_init.3]=man3/SSL_in_init.pod
+DEPEND[html/man3/SSL_inject_net_dgram.html]=man3/SSL_inject_net_dgram.pod
+GENERATE[html/man3/SSL_inject_net_dgram.html]=man3/SSL_inject_net_dgram.pod
+DEPEND[man/man3/SSL_inject_net_dgram.3]=man3/SSL_inject_net_dgram.pod
+GENERATE[man/man3/SSL_inject_net_dgram.3]=man3/SSL_inject_net_dgram.pod
DEPEND[html/man3/SSL_key_update.html]=man3/SSL_key_update.pod
GENERATE[html/man3/SSL_key_update.html]=man3/SSL_key_update.pod
DEPEND[man/man3/SSL_key_update.3]=man3/SSL_key_update.pod
@@ -3489,6 +3493,7 @@ html/man3/SSL_get_verify_result.html \
html/man3/SSL_get_version.html \
html/man3/SSL_group_to_name.html \
html/man3/SSL_in_init.html \
+html/man3/SSL_inject_net_dgram.html \
html/man3/SSL_key_update.html \
html/man3/SSL_library_init.html \
html/man3/SSL_load_client_CA_file.html \
@@ -4112,6 +4117,7 @@ man/man3/SSL_get_verify_result.3 \
man/man3/SSL_get_version.3 \
man/man3/SSL_group_to_name.3 \
man/man3/SSL_in_init.3 \
+man/man3/SSL_inject_net_dgram.3 \
man/man3/SSL_key_update.3 \
man/man3/SSL_library_init.3 \
man/man3/SSL_load_client_CA_file.3 \
diff --git a/test/quic_tserver_test.c b/test/quic_tserver_test.c
index e743adbeab..393b11172f 100644
--- a/test/quic_tserver_test.c
+++ b/test/quic_tserver_test.c
@@ -27,12 +27,19 @@ static int is_want(SSL *s, int ret)
return ec == SSL_ERROR_WANT_READ || ec == SSL_ERROR_WANT_WRITE;
}
-static int test_tserver(void)
+#define TEST_KIND_SIMPLE 0
+#define TEST_KIND_INJECT 1
+#define TEST_KIND_COUNT 2
+
+static unsigned char scratch_buf[2048];
+
+static int test_tserver(int test_kind)
{
int testresult = 0, ret;
int s_fd = -1, c_fd = -1;
BIO *s_net_bio = NULL, *s_net_bio_own = NULL;
BIO *c_net_bio = NULL, *c_net_bio_own = NULL;
+ BIO *c_pair_own = NULL, *s_pair_own = NULL;
QUIC_TSERVER_ARGS tserver_args = {0};
QUIC_TSERVER *tserver = NULL;
BIO_ADDR *s_addr_ = NULL;
@@ -92,6 +99,18 @@ static int test_tserver(void)
s_net_bio_own = NULL;
+ if (test_kind == TEST_KIND_INJECT) {
+ /*
+ * In inject mode we create a dgram pair to feed to the QUIC client on
+ * the read side. We don't feed anything to this, it is just a
+ * placeholder to give the client something which never returns any
+ * datagrams..
+ */
+ if (!TEST_true(BIO_new_bio_dgram_pair(&c_pair_own, 5000,
+ &s_pair_own, 5000)))
+ goto err;
+ }
+
/* Setup test client. */
c_fd = BIO_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0);
if (!TEST_int_ge(c_fd, 0))
@@ -117,12 +136,17 @@ static int test_tserver(void)
goto err;
/* Takes ownership of our reference to the BIO. */
- SSL_set0_rbio(c_ssl, c_net_bio);
-
- /* Get another reference to be transferred in the SSL_set0_wbio call. */
- if (!TEST_true(BIO_up_ref(c_net_bio))) {
- c_net_bio_own = NULL; /* SSL_free will free the first reference. */
- goto err;
+ if (test_kind == TEST_KIND_INJECT) {
+ SSL_set0_rbio(c_ssl, c_pair_own);
+ c_pair_own = NULL;
+ } else {
+ SSL_set0_rbio(c_ssl, c_net_bio);
+
+ /* Get another reference to be transferred in the SSL_set0_wbio call. */
+ if (!TEST_true(BIO_up_ref(c_net_bio))) {
+ c_net_bio_own = NULL; /* SSL_free will free the first reference. */
+ goto err;
+ }
}
SSL_set0_wbio(c_ssl, c_net_bio);
@@ -234,6 +258,29 @@ static int test_tserver(void)
*/
SSL_tick(c_ssl);
ossl_quic_tserver_tick(tserver);
+
+ if (test_kind == TEST_KIND_INJECT) {
+ BIO_MSG rmsg = {0};
+ size_t msgs_processed = 0;
+
+ for (;;) {
+ /*
+ * Manually spoonfeed received datagrams from the real BIO_dgram
+ * into QUIC via the injection interface, thereby testing the
+ * injection interface.
+ */
+ rmsg.data = scratch_buf;
+ rmsg.data_len = sizeof(scratch_buf);
+
+ if (!BIO_recvmmsg(c_net_bio, &rmsg, sizeof(rmsg), 1, 0, &msgs_processed)
+ || msgs_processed == 0 || rmsg.data_len == 0)
+ break;
+
+ if (!TEST_true(SSL_inject_net_dgram(c_ssl, rmsg.data, rmsg.data_len,
+ NULL, NULL)))
+ goto err;
+ }
+ }
}
testresult = 1;
@@ -244,6 +291,8 @@ err:
BIO_ADDR_free(s_addr_);
BIO_free(s_net_bio_own);
BIO_free(c_net_bio_own);
+ BIO_free(c_pair_own);
+ BIO_free(s_pair_own);
if (s_fd >= 0)
BIO_closesocket(s_fd);
if (c_fd >= 0)
@@ -264,6 +313,6 @@ int setup_tests(void)
|| !TEST_ptr(keyfile = test_get_argument(1)))
return 0;
- ADD_TEST(test_tserver);
+ ADD_ALL_TESTS(test_tserver, TEST_KIND_COUNT);
return 1;
}