summaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/net
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2018-10-09 13:52:35 +0000
committerHåvard Pettersen <havardpe@oath.com>2018-10-09 13:52:35 +0000
commit765b932a3368297044c349050d11f3f57188b1bd (patch)
tree5b65e1ba4758575c6aaae4413b2265d9eee10350 /vespalib/src/tests/net
parent58850f92f00b6289ff5feccf3634a34943e760d2 (diff)
added sync crypto socket with test
Diffstat (limited to 'vespalib/src/tests/net')
-rw-r--r--vespalib/src/tests/net/sync_crypto_socket/CMakeLists.txt8
-rw-r--r--vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp110
2 files changed, 118 insertions, 0 deletions
diff --git a/vespalib/src/tests/net/sync_crypto_socket/CMakeLists.txt b/vespalib/src/tests/net/sync_crypto_socket/CMakeLists.txt
new file mode 100644
index 00000000000..e66e62b68d0
--- /dev/null
+++ b/vespalib/src/tests/net/sync_crypto_socket/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vespalib_sync_crypto_socket_test_app TEST
+ SOURCES
+ sync_crypto_socket_test.cpp
+ DEPENDS
+ vespalib
+)
+vespa_add_test(NAME vespalib_sync_crypto_socket_test_app COMMAND vespalib_sync_crypto_socket_test_app)
diff --git a/vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp b/vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp
new file mode 100644
index 00000000000..b299990fd4e
--- /dev/null
+++ b/vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp
@@ -0,0 +1,110 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/vespalib/net/crypto_engine.h>
+#include <vespa/vespalib/net/tls/tls_crypto_engine.h>
+#include <vespa/vespalib/net/tls/maybe_tls_crypto_engine.h>
+#include <vespa/vespalib/net/sync_crypto_socket.h>
+#include <vespa/vespalib/net/selector.h>
+#include <vespa/vespalib/net/server_socket.h>
+#include <vespa/vespalib/net/socket_handle.h>
+#include <vespa/vespalib/net/socket_spec.h>
+#include <vespa/vespalib/data/smart_buffer.h>
+#include <vespa/vespalib/test/make_tls_options_for_testing.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+
+using namespace vespalib;
+
+struct SocketPair {
+ SocketHandle client;
+ SocketHandle server;
+ SocketPair() : client(), server() {
+ int sockets[2];
+ ASSERT_EQUAL(0, socketpair(AF_UNIX, SOCK_STREAM | O_NONBLOCK, 0, sockets));
+ client.reset(sockets[0]);
+ server.reset(sockets[1]);
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+vespalib::string read_bytes(SyncCryptoSocket &socket, size_t wanted_bytes) {
+ SmartBuffer read_buffer(wanted_bytes);
+ while (read_buffer.obtain().size < wanted_bytes) {
+ auto chunk = read_buffer.reserve(wanted_bytes - read_buffer.obtain().size);
+ auto res = socket.read(chunk.data, chunk.size);
+ ASSERT_TRUE(res > 0);
+ read_buffer.commit(res);
+ }
+ auto data = read_buffer.obtain();
+ return vespalib::string(data.data, wanted_bytes);
+}
+
+//-----------------------------------------------------------------------------
+
+void write_bytes(SyncCryptoSocket &socket, const vespalib::string &message) {
+ auto res = socket.write(message.data(), message.size());
+ ASSERT_EQUAL(size_t(res), message.size());
+}
+
+//-----------------------------------------------------------------------------
+
+void verify_socket_io(SyncCryptoSocket &socket, 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";
+ if(is_server) {
+ vespalib::string read = read_bytes(socket, client_message.size());
+ write_bytes(socket, server_message);
+ EXPECT_EQUAL(client_message, read);
+ } else {
+ write_bytes(socket, client_message);
+ vespalib::string read = read_bytes(socket, server_message.size());
+ EXPECT_EQUAL(server_message, read);
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+void verify_crypto_socket(SocketPair &sockets, CryptoEngine &engine, bool is_server) {
+ SocketHandle &my_handle = is_server ? sockets.server : sockets.client;
+ my_handle.set_blocking(false);
+ SyncCryptoSocket::UP my_socket = SyncCryptoSocket::create(engine, std::move(my_handle), is_server);
+ ASSERT_TRUE(my_socket);
+ TEST_DO(verify_socket_io(*my_socket, is_server));
+}
+
+//-----------------------------------------------------------------------------
+
+TEST_MT_FFF("require that encrypted sync socket io works with NullCryptoEngine",
+ 2, SocketPair(), NullCryptoEngine(), TimeBomb(60))
+{
+ TEST_DO(verify_crypto_socket(f1, f2, (thread_id == 0)));
+}
+
+TEST_MT_FFF("require that encrypted sync socket io works with XorCryptoEngine",
+ 2, SocketPair(), XorCryptoEngine(), TimeBomb(60))
+{
+ TEST_DO(verify_crypto_socket(f1, f2, (thread_id == 0)));
+}
+
+TEST_MT_FFF("require that encrypted sync socket io works with TlsCryptoEngine",
+ 2, SocketPair(), TlsCryptoEngine(vespalib::test::make_tls_options_for_testing()), TimeBomb(60))
+{
+ TEST_DO(verify_crypto_socket(f1, f2, (thread_id == 0)));
+}
+
+TEST_MT_FFF("require that encrypted sync socket io works with MaybeTlsCryptoEngine(true)",
+ 2, SocketPair(), MaybeTlsCryptoEngine(std::make_shared<TlsCryptoEngine>(vespalib::test::make_tls_options_for_testing()), true), TimeBomb(60))
+{
+ TEST_DO(verify_crypto_socket(f1, f2, (thread_id == 0)));
+}
+
+TEST_MT_FFF("require that encrypted sync socket io works with MaybeTlsCryptoEngine(false)",
+ 2, SocketPair(), MaybeTlsCryptoEngine(std::make_shared<TlsCryptoEngine>(vespalib::test::make_tls_options_for_testing()), false), TimeBomb(60))
+{
+ TEST_DO(verify_crypto_socket(f1, f2, (thread_id == 0)));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }