diff options
author | cppdap Upstream <kwrobot@kitware.com> | 2023-05-25 23:20:21 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-05-26 13:33:55 (GMT) |
commit | 1daeefc37856c209718b406dcb86d44519393dd1 (patch) | |
tree | fad61ae09ad74d5f21fedaeb80308ff494af1751 /src/socket_test.cpp | |
download | CMake-1daeefc37856c209718b406dcb86d44519393dd1.zip CMake-1daeefc37856c209718b406dcb86d44519393dd1.tar.gz CMake-1daeefc37856c209718b406dcb86d44519393dd1.tar.bz2 |
cppdap 2023-05-26 (03cc1867)
Code extracted from:
https://github.com/google/cppdap.git
at commit 03cc18678ed2ed8b2424ec99dee7e4655d876db5 (03cc18678ed2ed8b2424ec99dee7e4655d876db5).
Diffstat (limited to 'src/socket_test.cpp')
-rw-r--r-- | src/socket_test.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/socket_test.cpp b/src/socket_test.cpp new file mode 100644 index 0000000..186fd9a --- /dev/null +++ b/src/socket_test.cpp @@ -0,0 +1,104 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "socket.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include <chrono> +#include <thread> +#include <vector> + +// Basic socket send & receive test +TEST(Socket, SendRecv) { + const char* port = "19021"; + + auto server = dap::Socket("localhost", port); + + auto client = dap::Socket::connect("localhost", port, 0); + ASSERT_TRUE(client != nullptr); + + const std::string expect = "Hello World!"; + std::string read; + + auto thread = std::thread([&] { + auto conn = server.accept(); + ASSERT_TRUE(conn != nullptr); + char c; + while (conn->read(&c, 1) != 0) { + read += c; + } + }); + + ASSERT_TRUE(client->write(expect.data(), expect.size())); + + client->close(); + thread.join(); + + ASSERT_EQ(read, expect); +} + +// See https://github.com/google/cppdap/issues/37 +TEST(Socket, CloseOnDifferentThread) { + const char* port = "19021"; + + auto server = dap::Socket("localhost", port); + + auto client = dap::Socket::connect("localhost", port, 0); + ASSERT_TRUE(client != nullptr); + + auto conn = server.accept(); + + auto thread = std::thread([&] { + // Closing client on different thread should unblock client->read(). + client->close(); + }); + + char c; + while (client->read(&c, 1) != 0) { + } + + thread.join(); +} + +TEST(Socket, ConnectTimeout) { + const char* port = "19021"; + const int timeoutMillis = 200; + const int maxAttempts = 1024; + + using namespace std::chrono; + + auto server = dap::Socket("localhost", port); + + std::vector<std::shared_ptr<dap::ReaderWriter>> connections; + + for (int i = 0; i < maxAttempts; i++) { + auto start = system_clock::now(); + auto connection = dap::Socket::connect("localhost", port, timeoutMillis); + auto end = system_clock::now(); + + if (!connection) { + auto timeTakenMillis = duration_cast<milliseconds>(end - start).count(); + ASSERT_GE(timeTakenMillis + 20, // +20ms for a bit of timing wiggle room + timeoutMillis); + return; + } + + // Keep hold of the connections to saturate any incoming socket buffers. + connections.emplace_back(std::move(connection)); + } + + FAIL() << "Failed to test timeout after " << maxAttempts << " attempts"; +} |