diff options
author | Håvard Pettersen <havardpe@oath.com> | 2018-10-09 13:52:35 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2018-10-09 13:52:35 +0000 |
commit | 765b932a3368297044c349050d11f3f57188b1bd (patch) | |
tree | 5b65e1ba4758575c6aaae4413b2265d9eee10350 /vespalib/src/tests/net | |
parent | 58850f92f00b6289ff5feccf3634a34943e760d2 (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.txt | 8 | ||||
-rw-r--r-- | vespalib/src/tests/net/sync_crypto_socket/sync_crypto_socket_test.cpp | 110 |
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(); } |