Skip to content

Commit 0457256

Browse files
Consolidate test logic
1 parent 6f4c696 commit 0457256

File tree

1 file changed

+22
-47
lines changed

1 file changed

+22
-47
lines changed

ssl/ssl_test.cc

Lines changed: 22 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10458,9 +10458,7 @@ TEST(SSLTest, ErrorSyscallAfterCloseNotify) {
1045810458
write_failed = false;
1045910459
}
1046010460

10461-
// Test that |SSL_MODE_AUTO_RETRY| suppresses failure on (potentially)
10462-
// transient empty reads.
10463-
TEST(SSLTest, IntermittentEmptyRead) {
10461+
static void TestIntermittentEmptyRead(bool auto_retry) {
1046410462
bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
1046510463
bssl::UniquePtr<SSL_CTX> server_ctx =
1046610464
CreateContextWithTestCertificate(TLS_method());
@@ -10491,20 +10489,31 @@ TEST(SSLTest, IntermittentEmptyRead) {
1049110489
ASSERT_TRUE(BIO_up_ref(client_rbio.get()));
1049210490
SSL_set0_rbio(client.get(), rbio_empty.release());
1049310491

10494-
// |SSL_MODE_AUTO_RETRY| is off by default
10495-
ASSERT_FALSE(SSL_CTX_get_mode(client_ctx.get()) & SSL_MODE_AUTO_RETRY);
10492+
if (auto_retry) {
10493+
// Set flag under test
10494+
ASSERT_TRUE(SSL_CTX_set_mode(client_ctx.get(), SSL_MODE_AUTO_RETRY));
10495+
ASSERT_TRUE(SSL_CTX_get_mode(client_ctx.get()) & SSL_MODE_AUTO_RETRY);
10496+
} else {
10497+
// |SSL_MODE_AUTO_RETRY| is off by default
10498+
ASSERT_FALSE(SSL_CTX_get_mode(client_ctx.get()) & SSL_MODE_AUTO_RETRY);
10499+
}
1049610500

1049710501
// Server writes some data to the client
1049810502
const uint8_t write_data[] = {1, 2, 3};
1049910503
int ret = SSL_write(server.get(), write_data, (int) sizeof(write_data));
1050010504
EXPECT_EQ(ret, (int) sizeof(write_data));
1050110505
EXPECT_EQ(SSL_get_error(server.get(), ret), SSL_ERROR_NONE);
1050210506

10503-
// On empty read, client should error out signaling EOF
1050410507
uint8_t read_data[] = {0, 0, 0};
1050510508
ret = SSL_read(client.get(), read_data, sizeof(read_data));
1050610509
EXPECT_EQ(ret, 0);
10507-
EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_SYSCALL);
10510+
if (auto_retry) {
10511+
// On empty read, client should still want a read so caller will retry
10512+
EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_WANT_READ);
10513+
} else {
10514+
// On empty read, client should error out signaling EOF
10515+
EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_SYSCALL);
10516+
}
1050810517

1050910518
// Reset client rbio, read should succeed
1051010519
SSL_set0_rbio(client.get(), client_rbio.release());
@@ -10517,47 +10526,13 @@ TEST(SSLTest, IntermittentEmptyRead) {
1051710526
ret = SSL_read(client.get(), read_data, sizeof(read_data));
1051810527
EXPECT_LT(ret, 0);
1051910528
EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_WANT_READ);
10529+
}
1052010530

10521-
// Next, setu up the same test with |SSL_MODE_AUTO_RETRY| set
10522-
client_ctx.reset(SSL_CTX_new(TLS_method()));
10523-
server_ctx = CreateContextWithTestCertificate(TLS_method());
10524-
ASSERT_TRUE(client_ctx);
10525-
ASSERT_TRUE(server_ctx);
10526-
ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
10527-
server_ctx.get()));
10528-
rbio_empty.reset(BIO_new(method.get()));
10529-
ASSERT_TRUE(rbio_empty);
10530-
BIO_set_flags(rbio_empty.get(), BIO_FLAGS_READ);
10531-
client_rbio.reset(SSL_get_rbio(client.get()));
10532-
ASSERT_TRUE(client_rbio);
10533-
ASSERT_TRUE(BIO_up_ref(client_rbio.get()));
10534-
SSL_set0_rbio(client.get(), rbio_empty.release());
10535-
10536-
// Set flag under test
10537-
ASSERT_TRUE(SSL_CTX_set_mode(client_ctx.get(), SSL_MODE_AUTO_RETRY));
10538-
ASSERT_TRUE(SSL_CTX_get_mode(client_ctx.get()) & SSL_MODE_AUTO_RETRY);
10539-
10540-
// Server writes some data to the client
10541-
ret = SSL_write(server.get(), write_data, (int) sizeof(write_data));
10542-
EXPECT_EQ(ret, (int) sizeof(write_data));
10543-
EXPECT_EQ(SSL_get_error(server.get(), ret), SSL_ERROR_NONE);
10544-
10545-
// On empty read, client should still want a read so caller will retry
10546-
ret = SSL_read(client.get(), read_data, sizeof(read_data));
10547-
EXPECT_EQ(ret, 0);
10548-
EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_WANT_READ);
10549-
10550-
// Reset client rbio, read should succeed
10551-
SSL_set0_rbio(client.get(), client_rbio.release());
10552-
ret = SSL_read(client.get(), read_data, sizeof(read_data));
10553-
EXPECT_EQ(ret, (int) sizeof(write_data));
10554-
EXPECT_EQ(OPENSSL_memcmp(read_data, write_data, sizeof(write_data)), 0);
10555-
EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_NONE);
10556-
10557-
// Subsequent attempts to read should fail
10558-
ret = SSL_read(client.get(), read_data, sizeof(read_data));
10559-
EXPECT_LT(ret, 0);
10560-
EXPECT_EQ(SSL_get_error(client.get(), ret), SSL_ERROR_WANT_READ);
10531+
// Test that |SSL_MODE_AUTO_RETRY| suppresses failure on (potentially)
10532+
// transient empty reads.
10533+
TEST(SSLTest, IntermittentEmptyRead) {
10534+
TestIntermittentEmptyRead(false);
10535+
TestIntermittentEmptyRead(true);
1056110536
}
1056210537

1056310538
// Test that |SSL_shutdown|, when quiet shutdown is enabled, simulates receiving

0 commit comments

Comments
 (0)