QUIC Test Server: Exercise end-of-stream condition on read and write

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19897)
This commit is contained in:
Hugo Landau 2022-12-13 12:29:23 +00:00
parent a9979965bf
commit c0f694039a
1 changed files with 34 additions and 13 deletions

View File

@ -41,7 +41,8 @@ static int test_tserver(void)
SSL_CTX *c_ctx = NULL;
SSL *c_ssl = NULL;
short port = 8186;
int c_connected = 0, c_write_done = 0, c_begin_read = 0;
int c_connected = 0, c_write_done = 0, c_begin_read = 0, s_read_done = 0;
int c_wait_eos = 0;
size_t l = 0, s_total_read = 0, s_total_written = 0, c_total_read = 0;
int s_begin_write = 0;
OSSL_TIME start_time;
@ -151,22 +152,27 @@ static int test_tserver(void)
(int)sizeof(msg1) - 1))
goto err;
if (!TEST_true(SSL_stream_conclude(c_ssl, 0)))
goto err;
c_write_done = 1;
}
if (c_connected && c_write_done && s_total_read < sizeof(msg1) - 1) {
if (!TEST_true(ossl_quic_tserver_read(tserver,
(unsigned char *)msg2 + s_total_read,
sizeof(msg2) - s_total_read, &l)))
goto err;
if (c_connected && c_write_done && !s_read_done) {
if (!ossl_quic_tserver_read(tserver,
(unsigned char *)msg2 + s_total_read,
sizeof(msg2) - s_total_read, &l)) {
if (!TEST_true(ossl_quic_tserver_has_read_ended(tserver)))
goto err;
s_total_read += l;
if (s_total_read == sizeof(msg1) - 1) {
if (!TEST_mem_eq(msg1, sizeof(msg1) - 1,
msg2, sizeof(msg1) - 1))
if (!TEST_mem_eq(msg1, sizeof(msg1) - 1, msg2, s_total_read))
goto err;
s_begin_write = 1;
} else {
s_total_read += l;
if (!TEST_size_t_le(s_total_read, sizeof(msg1) - 1))
goto err;
}
}
@ -178,8 +184,10 @@ static int test_tserver(void)
s_total_written += l;
if (s_total_written == sizeof(msg1) - 1)
if (s_total_written == sizeof(msg1) - 1) {
ossl_quic_tserver_conclude(tserver);
c_begin_read = 1;
}
}
if (c_begin_read && c_total_read < sizeof(msg1) - 1) {
@ -195,11 +203,24 @@ static int test_tserver(void)
msg3, c_total_read))
goto err;
/* MATCH */
break;
c_wait_eos = 1;
}
}
if (c_wait_eos) {
unsigned char c;
ret = SSL_read_ex(c_ssl, &c, sizeof(c), &l);
if (!TEST_false(ret))
goto err;
if (!TEST_int_eq(SSL_get_error(c_ssl, ret), SSL_ERROR_ZERO_RETURN))
goto err;
/* DONE */
break;
}
/*
* This is inefficient because we spin until things work without
* blocking but this is just a test.