diff options
Diffstat (limited to '3rdparty/asio/src/tests/unit/connect_pipe.cpp')
-rw-r--r-- | 3rdparty/asio/src/tests/unit/connect_pipe.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/3rdparty/asio/src/tests/unit/connect_pipe.cpp b/3rdparty/asio/src/tests/unit/connect_pipe.cpp new file mode 100644 index 00000000000..8c71a5d093c --- /dev/null +++ b/3rdparty/asio/src/tests/unit/connect_pipe.cpp @@ -0,0 +1,154 @@ +// +// connect_pipe.cpp +// ~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +// Disable autolinking for unit tests. +#if !defined(BOOST_ALL_NO_LIB) +#define BOOST_ALL_NO_LIB 1 +#endif // !defined(BOOST_ALL_NO_LIB) + +// Test that header file is self-contained. +#include "asio/connect_pipe.hpp" + +#include <functional> +#include <string> +#include "asio/io_context.hpp" +#include "asio/read.hpp" +#include "asio/readable_pipe.hpp" +#include "asio/writable_pipe.hpp" +#include "asio/write.hpp" +#include "unit_test.hpp" + +//------------------------------------------------------------------------------ + +// connect_pipe_compile test +// ~~~~~~~~~~~~~~~~~~~~~~~~~ +// The following test checks that all connect_pipe functions compile and link +// correctly. Runtime failures are ignored. + +namespace connect_pipe_compile { + +void test() +{ +#if defined(ASIO_HAS_PIPE) + using namespace asio; + + try + { + asio::io_context io_context; + asio::error_code ec1; + + readable_pipe p1(io_context); + writable_pipe p2(io_context); + connect_pipe(p1, p2); + + readable_pipe p3(io_context); + writable_pipe p4(io_context); + connect_pipe(p3, p4, ec1); + } + catch (std::exception&) + { + } +#endif // defined(ASIO_HAS_PIPE) +} + +} // namespace connect_pipe_compile + +//------------------------------------------------------------------------------ + +// connect_pipe_runtime test +// ~~~~~~~~~~~~~~~~~~~~~~~~~ +// The following test checks that connect_pipe operates correctly at runtime. + +namespace connect_pipe_runtime { + +static const char write_data[] + = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +void handle_read(const asio::error_code& err, + size_t bytes_transferred, bool* called) +{ + *called = true; + ASIO_CHECK(!err); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); +} + +void handle_write(const asio::error_code& err, + size_t bytes_transferred, bool* called) +{ + *called = true; + ASIO_CHECK(!err); + ASIO_CHECK(bytes_transferred == sizeof(write_data)); +} + +void test() +{ +#if defined(ASIO_HAS_PIPE) + using namespace std; // For memcmp. + using namespace asio; + + namespace bindns = std; + using bindns::placeholders::_1; + using bindns::placeholders::_2; + + try + { + asio::io_context io_context; + asio::error_code ec1; + asio::error_code ec2; + + readable_pipe p1(io_context); + writable_pipe p2(io_context); + connect_pipe(p1, p2); + + std::string data1 = write_data; + asio::write(p2, asio::buffer(data1)); + + std::string data2; + data2.resize(data1.size()); + asio::read(p1, asio::buffer(data2)); + + ASIO_CHECK(data1 == data2); + + char read_buffer[sizeof(write_data)]; + bool read_completed = false; + asio::async_read(p1, + asio::buffer(read_buffer), + bindns::bind(handle_read, + _1, _2, &read_completed)); + + bool write_completed = false; + asio::async_write(p2, + asio::buffer(write_data), + bindns::bind(handle_write, + _1, _2, &write_completed)); + + io_context.run(); + + ASIO_CHECK(read_completed); + ASIO_CHECK(write_completed); + ASIO_CHECK(memcmp(read_buffer, write_data, sizeof(write_data)) == 0); + } + catch (std::exception&) + { + ASIO_CHECK(false); + } +#endif // defined(ASIO_HAS_PIPE) +} + +} // namespace connect_pipe_compile + +//------------------------------------------------------------------------------ + +ASIO_TEST_SUITE +( + "connect_pipe", + ASIO_COMPILE_TEST_CASE(connect_pipe_compile::test) + ASIO_TEST_CASE(connect_pipe_runtime::test) +) |