summaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/net
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2018-10-17 13:16:18 +0000
committerHåvard Pettersen <havardpe@oath.com>2018-10-19 10:19:19 +0000
commita50c6e8b47c6d6e1e7f82dfced1b3cd8f9fc87cd (patch)
tree2c5a9d60b99af15fadb741b3f0ed391eef3e05e7 /vespalib/src/tests/net
parent1700fa27f85166c25af98316c4a695dd38c80ff8 (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.cpp55
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));
}
//-----------------------------------------------------------------------------