aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/coro/async_io
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2023-01-06 15:22:08 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2023-01-11 14:45:44 +0000
commitb0280f472f6074ed34bd1da4fc1c6b6aa517a765 (patch)
treee1461cd856db3c66f9410c84b00f5e9d55c74a54 /vespalib/src/tests/coro/async_io
parent8cf9722ec8268753dfea424de540fd7133d5de83 (diff)
async crypto socket proof of concept
Diffstat (limited to 'vespalib/src/tests/coro/async_io')
-rw-r--r--vespalib/src/tests/coro/async_io/async_io_test.cpp86
1 files changed, 61 insertions, 25 deletions
diff --git a/vespalib/src/tests/coro/async_io/async_io_test.cpp b/vespalib/src/tests/coro/async_io/async_io_test.cpp
index a506a5dd0d4..f5098e30086 100644
--- a/vespalib/src/tests/coro/async_io/async_io_test.cpp
+++ b/vespalib/src/tests/coro/async_io/async_io_test.cpp
@@ -4,14 +4,22 @@
#include <vespa/vespalib/coro/detached.h>
#include <vespa/vespalib/coro/completion.h>
#include <vespa/vespalib/coro/async_io.h>
+#include <vespa/vespalib/coro/async_crypto_socket.h>
#include <vespa/vespalib/net/socket_spec.h>
#include <vespa/vespalib/net/server_socket.h>
#include <vespa/vespalib/net/socket_handle.h>
#include <vespa/vespalib/net/socket_address.h>
+#include <vespa/vespalib/net/crypto_engine.h>
+#include <vespa/vespalib/util/require.h>
+#include <vespa/vespalib/util/classname.h>
+#include <vespa/vespalib/test/make_tls_options_for_testing.h>
+#include <vespa/vespalib/net/tls/tls_crypto_engine.h>
+#include <vespa/vespalib/net/tls/maybe_tls_crypto_engine.h>
#include <vespa/vespalib/gtest/gtest.h>
using namespace vespalib;
using namespace vespalib::coro;
+using namespace vespalib::test;
Detached self_exiting_run_loop(AsyncIo::SP async) {
for (size_t i = 0; co_await async->schedule(); ++i) {
@@ -53,11 +61,11 @@ TEST(AsyncIoTest, shutdown_with_self_exiting_coroutine) {
f2.wait();
}
-Lazy<size_t> write_msg(AsyncIo &async, SocketHandle &socket, const vespalib::string &msg) {
+Lazy<size_t> write_msg(AsyncCryptoSocket &socket, const vespalib::string &msg) {
size_t written = 0;
while (written < msg.size()) {
size_t write_size = (msg.size() - written);
- ssize_t write_result = co_await async.write(socket, msg.data() + written, write_size);
+ ssize_t write_result = co_await socket.write(msg.data() + written, write_size);
if (write_result <= 0) {
co_return written;
}
@@ -66,12 +74,12 @@ Lazy<size_t> write_msg(AsyncIo &async, SocketHandle &socket, const vespalib::str
co_return written;
}
-Lazy<vespalib::string> read_msg(AsyncIo &async, SocketHandle &socket, size_t wanted_bytes) {
+Lazy<vespalib::string> read_msg(AsyncCryptoSocket &socket, size_t wanted_bytes) {
char tmp[64];
vespalib::string result;
while (result.size() < wanted_bytes) {
size_t read_size = std::min(sizeof(tmp), wanted_bytes - result.size());
- ssize_t read_result = co_await async.read(socket, tmp, read_size);
+ ssize_t read_result = co_await socket.read(tmp, read_size);
if (read_result <= 0) {
co_return result;
}
@@ -80,50 +88,78 @@ Lazy<vespalib::string> read_msg(AsyncIo &async, SocketHandle &socket, size_t wan
co_return result;
}
-Work verify_socket_io(AsyncIo &async, SocketHandle &socket, bool is_server) {
+Work verify_socket_io(AsyncCryptoSocket &socket, bool is_server) {
vespalib::string server_message = "hello, this is the server speaking";
vespalib::string client_message = "please pick up, I need to talk to you";
if (is_server) {
- vespalib::string read = co_await read_msg(async, socket, client_message.size());
+ vespalib::string read = co_await read_msg(socket, client_message.size());
EXPECT_EQ(client_message, read);
- size_t written = co_await write_msg(async, socket, server_message);
+ size_t written = co_await write_msg(socket, server_message);
EXPECT_EQ(written, ssize_t(server_message.size()));
} else {
- size_t written = co_await write_msg(async, socket, client_message);
+ size_t written = co_await write_msg(socket, client_message);
EXPECT_EQ(written, ssize_t(client_message.size()));
- vespalib::string read = co_await read_msg(async, socket, server_message.size());
+ vespalib::string read = co_await read_msg(socket, server_message.size());
EXPECT_EQ(server_message, read);
}
co_return Done{};
}
-Work async_server(AsyncIo &async, ServerSocket &server_socket) {
+Work async_server(AsyncIo &async, CryptoEngine &engine, ServerSocket &server_socket) {
auto server_addr = server_socket.address();
auto server_spec = server_addr.spec();
fprintf(stderr, "listening at '%s' (fd = %d)\n", server_spec.c_str(), server_socket.get_fd());
- auto socket = co_await async.accept(server_socket);
- fprintf(stderr, "server fd: %d\n", socket.get());
- co_return co_await verify_socket_io(async, socket, true);
+ auto raw_socket = co_await async.accept(server_socket);
+ fprintf(stderr, "server fd: %d\n", raw_socket.get());
+ auto socket = co_await AsyncCryptoSocket::accept(async, engine, std::move(raw_socket));
+ EXPECT_TRUE(socket);
+ REQUIRE(socket);
+ fprintf(stderr, "server socket type: %s\n", getClassName(*socket).c_str());
+ co_return co_await verify_socket_io(*socket, true);
}
-Work async_client(AsyncIo &async, ServerSocket &server_socket) {
+Work async_client(AsyncIo &async, CryptoEngine &engine, ServerSocket &server_socket) {
auto server_addr = server_socket.address();
- auto server_spec = server_addr.spec();
- fprintf(stderr, "connecting to '%s'\n", server_spec.c_str());
- auto client_addr = SocketSpec(server_spec).client_address();
- auto socket = co_await async.connect(client_addr);
- fprintf(stderr, "client fd: %d\n", socket.get());
- co_return co_await verify_socket_io(async, socket, false);
+ auto server_spec = SocketSpec(server_addr.spec());
+ fprintf(stderr, "connecting to '%s'\n", server_spec.spec().c_str());
+ auto client_addr = server_spec.client_address();
+ auto raw_socket = co_await async.connect(client_addr);
+ fprintf(stderr, "client fd: %d\n", raw_socket.get());
+ auto socket = co_await AsyncCryptoSocket::connect(async, engine, std::move(raw_socket), server_spec);
+ EXPECT_TRUE(socket);
+ REQUIRE(socket);
+ fprintf(stderr, "client socket type: %s\n", getClassName(*socket).c_str());
+ co_return co_await verify_socket_io(*socket, false);
}
-TEST(AsyncIoTest, raw_socket_io) {
+void verify_socket_io(CryptoEngine &engine) {
ServerSocket server_socket("tcp/0");
server_socket.set_blocking(false);
auto async = AsyncIo::create();
- auto f1 = make_future(async_server(async, server_socket));
- auto f2 = make_future(async_client(async, server_socket));
- f1.wait();
- f2.wait();
+ auto f1 = make_future(async_server(async, engine, server_socket));
+ auto f2 = make_future(async_client(async, engine, server_socket));
+ (void) f1.get();
+ (void) f2.get();
+}
+
+TEST(AsyncIoTest, raw_socket_io) {
+ NullCryptoEngine engine;
+ verify_socket_io(engine);
+}
+
+TEST(AsyncIoTest, tls_socket_io) {
+ TlsCryptoEngine engine(make_tls_options_for_testing());
+ verify_socket_io(engine);
+}
+
+TEST(AsyncIoTest, maybe_tls_true_socket_io) {
+ MaybeTlsCryptoEngine engine(std::make_shared<TlsCryptoEngine>(make_tls_options_for_testing()), true);
+ verify_socket_io(engine);
+}
+
+TEST(AsyncIoTest, maybe_tls_false_socket_io) {
+ MaybeTlsCryptoEngine engine(std::make_shared<TlsCryptoEngine>(make_tls_options_for_testing()), false);
+ verify_socket_io(engine);
}
GTEST_MAIN_RUN_ALL_TESTS()