diff options
Diffstat (limited to 'lldb/unittests/Host/ConnectionFileDescriptorPosixTest.cpp')
-rw-r--r-- | lldb/unittests/Host/ConnectionFileDescriptorPosixTest.cpp | 135 |
1 files changed, 0 insertions, 135 deletions
diff --git a/lldb/unittests/Host/ConnectionFileDescriptorPosixTest.cpp b/lldb/unittests/Host/ConnectionFileDescriptorPosixTest.cpp deleted file mode 100644 index 29ae66fe53f..00000000000 --- a/lldb/unittests/Host/ConnectionFileDescriptorPosixTest.cpp +++ /dev/null @@ -1,135 +0,0 @@ -//===-- ConnectionFileDescriptorPosixTest.cpp -------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#if defined(_MSC_VER) && (_HAS_EXCEPTIONS == 0) -// Workaround for MSVC standard library bug, which fails to include <thread> when -// exceptions are disabled. -#include <eh.h> -#endif - -#include "gtest/gtest.h" - -#include "SocketUtil.h" - -#include "lldb/Host/ConnectionFileDescriptor.h" - -using namespace lldb_private; -using namespace lldb; - -class ConnectionFileDescriptorPosixTest : public testing::Test -{ -public: - void - SetUp() override - { -#if defined(_MSC_VER) - WSADATA data; - ::WSAStartup(MAKEWORD(2, 2), &data); -#endif - } - - void - TearDown() override - { -#if defined(_MSC_VER) - ::WSACleanup(); -#endif - } -}; - -TEST_F(ConnectionFileDescriptorPosixTest, ReadAll) -{ - const bool read_full_buffer = true; - - std::unique_ptr<TCPSocket> socket_a_up; - std::unique_ptr<TCPSocket> socket_b_up; - std::tie(socket_a_up, socket_b_up) = CreateConnectedTCPSockets(); - - ConnectionFileDescriptor connection_a(socket_a_up.release()); - - // First, make sure Read returns nothing. - const auto k_reasonable_timeout_us = 10 * 1000; - char buffer[100]; - ConnectionStatus status; - Error error; - size_t bytes_read = - connection_a.Read(buffer, sizeof buffer, k_reasonable_timeout_us, read_full_buffer, status, &error); - ASSERT_TRUE(error.Success()) << error.AsCString(); - ASSERT_EQ(eConnectionStatusTimedOut, status); - ASSERT_EQ(0u, bytes_read); - - // Write some data, and make sure it arrives. - const char data[] = {1, 2, 3, 4}; - size_t bytes_written = sizeof data; - error = socket_b_up->Write(data, bytes_written); - ASSERT_TRUE(error.Success()) << error.AsCString(); - ASSERT_EQ(sizeof data, bytes_written); - bytes_read = connection_a.Read(buffer, sizeof data, k_reasonable_timeout_us, read_full_buffer, status, &error); - ASSERT_TRUE(error.Success()) << error.AsCString(); - ASSERT_EQ(eConnectionStatusSuccess, status); - ASSERT_EQ(sizeof data, bytes_read); - ASSERT_EQ(0, memcmp(buffer, data, sizeof data)); - memset(buffer, 0, sizeof buffer); - - // Write the data in two chunks. Make sure we read all of it. - std::future<Error> future_error = std::async(std::launch::async, [&socket_b_up, data]() { - size_t bytes_written = sizeof(data) / 2; - Error error = socket_b_up->Write(data, bytes_written); - if (error.Fail()) - return error; - std::this_thread::sleep_for(std::chrono::microseconds(k_reasonable_timeout_us / 10)); - bytes_written = sizeof(data) / 2; - return socket_b_up->Write(data + bytes_written, bytes_written); - }); - bytes_read = connection_a.Read(buffer, sizeof data, k_reasonable_timeout_us, read_full_buffer, status, &error); - ASSERT_TRUE(error.Success()) << error.AsCString(); - ASSERT_EQ(eConnectionStatusSuccess, status); - ASSERT_EQ(sizeof data, bytes_read); - ASSERT_TRUE(future_error.get().Success()) << future_error.get().AsCString(); - ASSERT_EQ(0, memcmp(buffer, data, sizeof data)); - - // Close the remote end, make sure Read result is reasonable. - socket_b_up.reset(); - bytes_read = connection_a.Read(buffer, sizeof buffer, k_reasonable_timeout_us, read_full_buffer, status, &error); - ASSERT_TRUE(error.Success()) << error.AsCString(); - ASSERT_EQ(eConnectionStatusEndOfFile, status); - ASSERT_EQ(0u, bytes_read); -} - -TEST_F(ConnectionFileDescriptorPosixTest, Read) -{ - const bool read_full_buffer = false; - - std::unique_ptr<TCPSocket> socket_a_up; - std::unique_ptr<TCPSocket> socket_b_up; - std::tie(socket_a_up, socket_b_up) = CreateConnectedTCPSockets(); - - ConnectionFileDescriptor connection_a(socket_a_up.release()); - - const uint32_t k_very_large_timeout_us = 10 * 1000 * 1000; - char buffer[100]; - ConnectionStatus status; - Error error; - - // Write some data (but not a full buffer). Make sure it arrives, and we do not wait too long. - const char data[] = {1, 2, 3, 4}; - size_t bytes_written = sizeof data; - error = socket_b_up->Write(data, bytes_written); - ASSERT_TRUE(error.Success()) << error.AsCString(); - ASSERT_EQ(sizeof data, bytes_written); - - const auto start = std::chrono::steady_clock::now(); - size_t bytes_read = - connection_a.Read(buffer, sizeof buffer, k_very_large_timeout_us, read_full_buffer, status, &error); - ASSERT_TRUE(error.Success()) << error.AsCString(); - ASSERT_EQ(eConnectionStatusSuccess, status); - ASSERT_EQ(sizeof data, bytes_read); - ASSERT_EQ(0, memcmp(buffer, data, sizeof data)); - ASSERT_LT(std::chrono::steady_clock::now(), start + std::chrono::microseconds(k_very_large_timeout_us / 10)); -} |