diff options
author | Håvard Pettersen <havardpe@oath.com> | 2018-10-17 13:16:18 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2018-10-19 10:19:19 +0000 |
commit | a50c6e8b47c6d6e1e7f82dfced1b3cd8f9fc87cd (patch) | |
tree | 2c5a9d60b99af15fadb741b3f0ed391eef3e05e7 /vespalib/src/tests/net | |
parent | 1700fa27f85166c25af98316c4a695dd38c80ff8 (diff) |
half_close for crypto sockets
Diffstat (limited to 'vespalib/src/tests/net')
-rw-r--r-- | vespalib/src/tests/net/crypto_socket/crypto_socket_test.cpp | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/vespalib/src/tests/net/crypto_socket/crypto_socket_test.cpp b/vespalib/src/tests/net/crypto_socket/crypto_socket_test.cpp index 91babc51476..67077f86f1e 100644 --- a/vespalib/src/tests/net/crypto_socket/crypto_socket_test.cpp +++ b/vespalib/src/tests/net/crypto_socket/crypto_socket_test.cpp @@ -76,6 +76,11 @@ void flush(CryptoSocket &socket) { ASSERT_TRUE((res == 0) || is_blocked(res)); } +void half_close(CryptoSocket &socket) { + auto res = socket.half_close(); + ASSERT_TRUE((res == 0) || is_blocked(res)); +} + //----------------------------------------------------------------------------- vespalib::string read_bytes(CryptoSocket &socket, SmartBuffer &read_buffer, size_t wanted_bytes) { @@ -86,7 +91,25 @@ vespalib::string read_bytes(CryptoSocket &socket, SmartBuffer &read_buffer, size drain(socket, read_buffer); } auto data = read_buffer.obtain(); - return vespalib::string(data.data, wanted_bytes); + vespalib::string message(data.data, wanted_bytes); + read_buffer.evict(message.size()); + return message; +} + +//----------------------------------------------------------------------------- + +void read_EOF(CryptoSocket &socket, SmartBuffer &read_buffer) { + ASSERT_EQUAL(read_buffer.obtain().size, 0u); + SingleFdSelector selector(socket.get_fd()); + ASSERT_TRUE(selector.wait_readable()); + size_t chunk_size = std::max(size_t(4096), socket.min_read_buffer_size()); + auto chunk = read_buffer.reserve(chunk_size); + auto res = socket.read(chunk.data, chunk.size); + while (is_blocked(res)) { + ASSERT_TRUE(selector.wait_readable()); + res = socket.read(chunk.data, chunk.size); + } + ASSERT_EQUAL(res, 0); } //----------------------------------------------------------------------------- @@ -106,6 +129,35 @@ void write_bytes(CryptoSocket &socket, const vespalib::string &message) { //----------------------------------------------------------------------------- +void write_EOF(CryptoSocket &socket) { + SingleFdSelector selector(socket.get_fd()); + ASSERT_TRUE(selector.wait_writable()); + auto res = socket.half_close(); + while (is_blocked(res)) { + ASSERT_TRUE(selector.wait_writable()); + res = socket.half_close(); + } + ASSERT_EQUAL(res, 0); +} + +//----------------------------------------------------------------------------- + +void verify_graceful_shutdown(CryptoSocket &socket, SmartBuffer &read_buffer, bool is_server) { + if(is_server) { + TEST_DO(write_EOF(socket)); + TEST_DO(read_EOF(socket, read_buffer)); + TEST_DO(read_EOF(socket, read_buffer)); + TEST_DO(read_EOF(socket, read_buffer)); + } else { + TEST_DO(read_EOF(socket, read_buffer)); + TEST_DO(read_EOF(socket, read_buffer)); + TEST_DO(read_EOF(socket, read_buffer)); + TEST_DO(write_EOF(socket)); + } +} + +//----------------------------------------------------------------------------- + void verify_socket_io(CryptoSocket &socket, SmartBuffer &read_buffer, bool is_server) { vespalib::string client_message = "please pick up, I need to talk to you"; vespalib::string server_message = "hello, this is the server speaking"; @@ -153,6 +205,7 @@ void verify_crypto_socket(SocketPair &sockets, CryptoEngine &engine, bool is_ser TEST_DO(verify_handshake(*my_socket)); drain(*my_socket, read_buffer); TEST_DO(verify_socket_io(*my_socket, read_buffer, is_server)); + TEST_DO(verify_graceful_shutdown(*my_socket, read_buffer, is_server)); } //----------------------------------------------------------------------------- |