diff options
Diffstat (limited to '3rdparty/asio/src/tests/unit/read.cpp')
-rw-r--r-- | 3rdparty/asio/src/tests/unit/read.cpp | 1212 |
1 files changed, 1141 insertions, 71 deletions
diff --git a/3rdparty/asio/src/tests/unit/read.cpp b/3rdparty/asio/src/tests/unit/read.cpp index 077c9223667..bd0e9592ca9 100644 --- a/3rdparty/asio/src/tests/unit/read.cpp +++ b/3rdparty/asio/src/tests/unit/read.cpp @@ -2,7 +2,7 @@ // read.cpp // ~~~~~~~~ // -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2021 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) @@ -25,7 +25,7 @@ #include "unit_test.hpp" #if defined(ASIO_HAS_BOOST_BIND) -# include <boost/bind.hpp> +# include <boost/bind/bind.hpp> #else // defined(ASIO_HAS_BOOST_BIND) # include <functional> #endif // defined(ASIO_HAS_BOOST_BIND) @@ -120,7 +120,8 @@ public: } template <typename Mutable_Buffers, typename Handler> - void async_read_some(const Mutable_Buffers& buffers, Handler handler) + void async_read_some(const Mutable_Buffers& buffers, + ASIO_MOVE_ARG(Handler) handler) { size_t bytes_transferred = read_some(buffers); asio::post(get_executor(), @@ -187,7 +188,8 @@ void test_2_arg_vector_buffers_read() char read_buf[sizeof(read_data)]; std::vector<asio::mutable_buffer> buffers; buffers.push_back(asio::buffer(read_buf, 32)); - buffers.push_back(asio::buffer(read_buf) + 32); + buffers.push_back(asio::buffer(read_buf, 39) + 32); + buffers.push_back(asio::buffer(read_buf) + 39); s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); @@ -210,8 +212,42 @@ void test_2_arg_vector_buffers_read() ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); } +void test_2_arg_dynamic_string_read() +{ + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(read_data)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + size_t bytes_transferred = asio::read(s, sb); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); +} + void test_2_arg_streambuf_read() { +#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1) asio::io_context ioc; test_stream s(ioc); asio::streambuf sb(sizeof(read_data)); @@ -238,6 +274,7 @@ void test_2_arg_streambuf_read() ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); +#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1) } void test_3_arg_nothrow_zero_buffers_read() @@ -292,7 +329,8 @@ void test_3_arg_nothrow_vector_buffers_read() char read_buf[sizeof(read_data)]; std::vector<asio::mutable_buffer> buffers; buffers.push_back(asio::buffer(read_buf, 32)); - buffers.push_back(asio::buffer(read_buf) + 32); + buffers.push_back(asio::buffer(read_buf, 39) + 32); + buffers.push_back(asio::buffer(read_buf) + 39); s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); @@ -319,8 +357,46 @@ void test_3_arg_nothrow_vector_buffers_read() ASIO_CHECK(!error); } +void test_3_arg_nothrow_dynamic_string_read() +{ + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(read_data)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + asio::error_code error; + size_t bytes_transferred = asio::read(s, sb, error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); +} + void test_3_arg_nothrow_streambuf_read() { +#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1) asio::io_context ioc; test_stream s(ioc); asio::streambuf sb(sizeof(read_data)); @@ -351,6 +427,7 @@ void test_3_arg_nothrow_streambuf_read() ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); ASIO_CHECK(!error); +#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1) } bool old_style_transfer_all(const asio::error_code& ec, @@ -359,11 +436,20 @@ bool old_style_transfer_all(const asio::error_code& ec, return !!ec; } -size_t short_transfer(const asio::error_code& ec, - size_t /*bytes_transferred*/) +struct short_transfer { - return !!ec ? 0 : 3; -} + short_transfer() {} +#if defined(ASIO_HAS_MOVE) + short_transfer(short_transfer&&) {} +#else // defined(ASIO_HAS_MOVE) + short_transfer(const short_transfer&) {} +#endif // defined(ASIO_HAS_MOVE) + size_t operator()(const asio::error_code& ec, + size_t /*bytes_transferred*/) + { + return !!ec ? 0 : 3; + } +}; void test_3_arg_mutable_buffer_read() { @@ -556,21 +642,21 @@ void test_3_arg_mutable_buffer_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); - bytes_transferred = asio::read(s, buffers, short_transfer); + bytes_transferred = asio::read(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); s.reset(read_data, sizeof(read_data)); s.next_read_length(1); memset(read_buf, 0, sizeof(read_buf)); - bytes_transferred = asio::read(s, buffers, short_transfer); + bytes_transferred = asio::read(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); s.reset(read_data, sizeof(read_data)); s.next_read_length(10); memset(read_buf, 0, sizeof(read_buf)); - bytes_transferred = asio::read(s, buffers, short_transfer); + bytes_transferred = asio::read(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); } @@ -582,7 +668,8 @@ void test_3_arg_vector_buffers_read() char read_buf[sizeof(read_data)]; std::vector<asio::mutable_buffer> buffers; buffers.push_back(asio::buffer(read_buf, 32)); - buffers.push_back(asio::buffer(read_buf) + 32); + buffers.push_back(asio::buffer(read_buf, 39) + 32); + buffers.push_back(asio::buffer(read_buf) + 39); s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); @@ -767,27 +854,266 @@ void test_3_arg_vector_buffers_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); - bytes_transferred = asio::read(s, buffers, short_transfer); + bytes_transferred = asio::read(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); s.reset(read_data, sizeof(read_data)); s.next_read_length(1); memset(read_buf, 0, sizeof(read_buf)); - bytes_transferred = asio::read(s, buffers, short_transfer); + bytes_transferred = asio::read(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); s.reset(read_data, sizeof(read_data)); s.next_read_length(10); memset(read_buf, 0, sizeof(read_buf)); - bytes_transferred = asio::read(s, buffers, short_transfer); + bytes_transferred = asio::read(s, buffers, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); } +void test_3_arg_dynamic_string_read() +{ + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(read_data)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + size_t bytes_transferred = asio::read(s, sb, + asio::transfer_all()); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_all()); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_all()); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(1)); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(1)); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(1)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(10)); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(42)); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(42)); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(42)); + ASIO_CHECK(bytes_transferred == 50); + ASIO_CHECK(sb.size() == 50); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 50)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(1)); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(1)); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(1)); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(10)); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(42)); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(42)); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(42)); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, old_style_transfer_all); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, old_style_transfer_all); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, old_style_transfer_all); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, short_transfer()); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, short_transfer()); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, short_transfer()); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); +} + void test_3_arg_streambuf_read() { +#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1) asio::io_context ioc; test_stream s(ioc); asio::streambuf sb(sizeof(read_data)); @@ -999,7 +1325,7 @@ void test_3_arg_streambuf_read() s.reset(read_data, sizeof(read_data)); sb.consume(sb.size()); - bytes_transferred = asio::read(s, sb, short_transfer); + bytes_transferred = asio::read(s, sb, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); @@ -1007,7 +1333,7 @@ void test_3_arg_streambuf_read() s.reset(read_data, sizeof(read_data)); s.next_read_length(1); sb.consume(sb.size()); - bytes_transferred = asio::read(s, sb, short_transfer); + bytes_transferred = asio::read(s, sb, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); @@ -1015,10 +1341,11 @@ void test_3_arg_streambuf_read() s.reset(read_data, sizeof(read_data)); s.next_read_length(10); sb.consume(sb.size()); - bytes_transferred = asio::read(s, sb, short_transfer); + bytes_transferred = asio::read(s, sb, short_transfer()); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); +#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1) } void test_4_arg_mutable_buffer_read() @@ -1262,7 +1589,7 @@ void test_4_arg_mutable_buffer_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); - bytes_transferred = asio::read(s, buffers, short_transfer, error); + bytes_transferred = asio::read(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); ASIO_CHECK(!error); @@ -1271,7 +1598,7 @@ void test_4_arg_mutable_buffer_read() s.next_read_length(1); memset(read_buf, 0, sizeof(read_buf)); error = asio::error_code(); - bytes_transferred = asio::read(s, buffers, short_transfer, error); + bytes_transferred = asio::read(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); ASIO_CHECK(!error); @@ -1280,7 +1607,7 @@ void test_4_arg_mutable_buffer_read() s.next_read_length(10); memset(read_buf, 0, sizeof(read_buf)); error = asio::error_code(); - bytes_transferred = asio::read(s, buffers, short_transfer, error); + bytes_transferred = asio::read(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); ASIO_CHECK(!error); @@ -1293,7 +1620,8 @@ void test_4_arg_vector_buffers_read() char read_buf[sizeof(read_data)]; std::vector<asio::mutable_buffer> buffers; buffers.push_back(asio::buffer(read_buf, 32)); - buffers.push_back(asio::buffer(read_buf) + 32); + buffers.push_back(asio::buffer(read_buf, 39) + 32); + buffers.push_back(asio::buffer(read_buf) + 39); s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); @@ -1528,7 +1856,7 @@ void test_4_arg_vector_buffers_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); - bytes_transferred = asio::read(s, buffers, short_transfer, error); + bytes_transferred = asio::read(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); ASIO_CHECK(!error); @@ -1537,7 +1865,7 @@ void test_4_arg_vector_buffers_read() s.next_read_length(1); memset(read_buf, 0, sizeof(read_buf)); error = asio::error_code(); - bytes_transferred = asio::read(s, buffers, short_transfer, error); + bytes_transferred = asio::read(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); ASIO_CHECK(!error); @@ -1546,14 +1874,308 @@ void test_4_arg_vector_buffers_read() s.next_read_length(10); memset(read_buf, 0, sizeof(read_buf)); error = asio::error_code(); - bytes_transferred = asio::read(s, buffers, short_transfer, error); + bytes_transferred = asio::read(s, buffers, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); ASIO_CHECK(!error); } +void test_4_arg_dynamic_string_read() +{ + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(read_data)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + asio::error_code error; + size_t bytes_transferred = asio::read(s, sb, + asio::transfer_all(), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_all(), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_all(), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(1), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(1), error); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(1), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(10), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(42), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(42), error); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_at_least(42), error); + ASIO_CHECK(bytes_transferred == 50); + ASIO_CHECK(sb.size() == 50); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 50)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(1), error); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(1), error); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(1), error); + ASIO_CHECK(bytes_transferred == 1); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(10), error); + ASIO_CHECK(bytes_transferred == 10); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(42), error); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(42), error); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + asio::transfer_exactly(42), error); + ASIO_CHECK(bytes_transferred == 42); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, + old_style_transfer_all, error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + old_style_transfer_all, error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, + old_style_transfer_all, error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bytes_transferred = asio::read(s, sb, short_transfer(), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, short_transfer(), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + error = asio::error_code(); + bytes_transferred = asio::read(s, sb, short_transfer(), error); + ASIO_CHECK(bytes_transferred == sizeof(read_data)); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + ASIO_CHECK(!error); +} + void test_4_arg_streambuf_read() { +#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1) asio::io_context ioc; test_stream s(ioc); asio::streambuf sb(sizeof(read_data)); @@ -1815,7 +2437,7 @@ void test_4_arg_streambuf_read() s.reset(read_data, sizeof(read_data)); sb.consume(sb.size()); - bytes_transferred = asio::read(s, sb, short_transfer, error); + bytes_transferred = asio::read(s, sb, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); @@ -1825,7 +2447,7 @@ void test_4_arg_streambuf_read() s.next_read_length(1); sb.consume(sb.size()); error = asio::error_code(); - bytes_transferred = asio::read(s, sb, short_transfer, error); + bytes_transferred = asio::read(s, sb, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); @@ -1835,11 +2457,12 @@ void test_4_arg_streambuf_read() s.next_read_length(10); sb.consume(sb.size()); error = asio::error_code(); - bytes_transferred = asio::read(s, sb, short_transfer, error); + bytes_transferred = asio::read(s, sb, short_transfer(), error); ASIO_CHECK(bytes_transferred == sizeof(read_data)); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); ASIO_CHECK(!error); +#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1) } void async_read_handler(const asio::error_code& e, @@ -1856,9 +2479,9 @@ void test_3_arg_mutable_buffer_async_read() namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -1916,9 +2539,9 @@ void test_3_arg_boost_array_buffers_async_read() namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; #if defined(ASIO_HAS_BOOST_ARRAY) asio::io_context ioc; @@ -1979,9 +2602,9 @@ void test_3_arg_std_array_buffers_async_read() namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; #if defined(ASIO_HAS_STD_ARRAY) asio::io_context ioc; @@ -2042,16 +2665,17 @@ void test_3_arg_vector_buffers_async_read() namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); char read_buf[sizeof(read_data)]; std::vector<asio::mutable_buffer> buffers; buffers.push_back(asio::buffer(read_buf, 32)); - buffers.push_back(asio::buffer(read_buf) + 32); + buffers.push_back(asio::buffer(read_buf, 39) + 32); + buffers.push_back(asio::buffer(read_buf) + 39); s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); @@ -2097,15 +2721,81 @@ void test_3_arg_vector_buffers_async_read() ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); } +void test_3_arg_dynamic_string_async_read() +{ +#if defined(ASIO_HAS_BOOST_BIND) + namespace bindns = boost; +#else // defined(ASIO_HAS_BOOST_BIND) + namespace bindns = std; +#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; + + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(read_data)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bool called = false; + asio::async_read(s, sb, + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + int i = asio::async_read(s, sb, archetypes::lazy_handler()); + ASIO_CHECK(i == 42); + ioc.restart(); + ioc.run(); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); +} + void test_3_arg_streambuf_async_read() { +#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1) #if defined(ASIO_HAS_BOOST_BIND) namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -2157,6 +2847,7 @@ void test_3_arg_streambuf_async_read() ioc.run(); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); +#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1) } void test_4_arg_mutable_buffer_async_read() @@ -2165,9 +2856,9 @@ void test_4_arg_mutable_buffer_async_read() namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -2458,7 +3149,7 @@ void test_4_arg_mutable_buffer_async_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -2470,7 +3161,7 @@ void test_4_arg_mutable_buffer_async_read() s.next_read_length(1); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -2482,7 +3173,7 @@ void test_4_arg_mutable_buffer_async_read() s.next_read_length(10); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -2493,7 +3184,7 @@ void test_4_arg_mutable_buffer_async_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); int i = asio::async_read(s, buffers, - short_transfer, archetypes::lazy_handler()); + short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); ioc.run(); @@ -2506,9 +3197,9 @@ void test_4_arg_boost_array_buffers_async_read() namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; #if defined(ASIO_HAS_BOOST_ARRAY) asio::io_context ioc; @@ -2801,7 +3492,7 @@ void test_4_arg_boost_array_buffers_async_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -2813,7 +3504,7 @@ void test_4_arg_boost_array_buffers_async_read() s.next_read_length(1); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -2825,7 +3516,7 @@ void test_4_arg_boost_array_buffers_async_read() s.next_read_length(10); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -2836,7 +3527,7 @@ void test_4_arg_boost_array_buffers_async_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); int i = asio::async_read(s, buffers, - short_transfer, archetypes::lazy_handler()); + short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); ioc.run(); @@ -2850,9 +3541,9 @@ void test_4_arg_std_array_buffers_async_read() namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; #if defined(ASIO_HAS_STD_ARRAY) asio::io_context ioc; @@ -3145,7 +3836,7 @@ void test_4_arg_std_array_buffers_async_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3157,7 +3848,7 @@ void test_4_arg_std_array_buffers_async_read() s.next_read_length(1); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3169,7 +3860,7 @@ void test_4_arg_std_array_buffers_async_read() s.next_read_length(10); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3180,7 +3871,7 @@ void test_4_arg_std_array_buffers_async_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); int i = asio::async_read(s, buffers, - short_transfer, archetypes::lazy_handler()); + short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); ioc.run(); @@ -3194,16 +3885,17 @@ void test_4_arg_vector_buffers_async_read() namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); char read_buf[sizeof(read_data)]; std::vector<asio::mutable_buffer> buffers; buffers.push_back(asio::buffer(read_buf, 32)); - buffers.push_back(asio::buffer(read_buf) + 32); + buffers.push_back(asio::buffer(read_buf, 39) + 32); + buffers.push_back(asio::buffer(read_buf) + 39); s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); @@ -3488,7 +4180,7 @@ void test_4_arg_vector_buffers_async_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3500,7 +4192,7 @@ void test_4_arg_vector_buffers_async_read() s.next_read_length(1); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3512,7 +4204,7 @@ void test_4_arg_vector_buffers_async_read() s.next_read_length(10); memset(read_buf, 0, sizeof(read_buf)); called = false; - asio::async_read(s, buffers, short_transfer, + asio::async_read(s, buffers, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3523,22 +4215,393 @@ void test_4_arg_vector_buffers_async_read() s.reset(read_data, sizeof(read_data)); memset(read_buf, 0, sizeof(read_buf)); int i = asio::async_read(s, buffers, - short_transfer, archetypes::lazy_handler()); + short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); ioc.run(); ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data))); } +void test_4_arg_dynamic_string_async_read() +{ +#if defined(ASIO_HAS_BOOST_BIND) + namespace bindns = boost; +#else // defined(ASIO_HAS_BOOST_BIND) + namespace bindns = std; +#endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; + + asio::io_context ioc; + test_stream s(ioc); + std::string data; + asio::dynamic_string_buffer<char, std::string::traits_type, + std::string::allocator_type> sb + = asio::dynamic_buffer(data, sizeof(read_data)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + bool called = false; + asio::async_read(s, sb, asio::transfer_all(), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_all(), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_all(), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(1), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(1), + bindns::bind(async_read_handler, + _1, _2, 1, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(1), + bindns::bind(async_read_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(10), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(10), + bindns::bind(async_read_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(10), + bindns::bind(async_read_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(42), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(42), + bindns::bind(async_read_handler, + _1, _2, 42, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_at_least(42), + bindns::bind(async_read_handler, + _1, _2, 50, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 50); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 50)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(1), + bindns::bind(async_read_handler, + _1, _2, 1, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(1), + bindns::bind(async_read_handler, + _1, _2, 1, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(1), + bindns::bind(async_read_handler, + _1, _2, 1, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 1); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 1)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(10), + bindns::bind(async_read_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(10), + bindns::bind(async_read_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(10), + bindns::bind(async_read_handler, + _1, _2, 10, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 10); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 10)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(42), + bindns::bind(async_read_handler, + _1, _2, 42, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(42), + bindns::bind(async_read_handler, + _1, _2, 42, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, asio::transfer_exactly(42), + bindns::bind(async_read_handler, + _1, _2, 42, &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == 42); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), 42)); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, old_style_transfer_all, + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, old_style_transfer_all, + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, old_style_transfer_all, + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, short_transfer(), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(1); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, short_transfer(), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + s.next_read_length(10); + sb.consume(sb.size()); + called = false; + asio::async_read(s, sb, short_transfer(), + bindns::bind(async_read_handler, + _1, _2, sizeof(read_data), &called)); + ioc.restart(); + ioc.run(); + ASIO_CHECK(called); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); + + s.reset(read_data, sizeof(read_data)); + sb.consume(sb.size()); + int i = asio::async_read(s, sb, + short_transfer(), archetypes::lazy_handler()); + ASIO_CHECK(i == 42); + ioc.restart(); + ioc.run(); + ASIO_CHECK(sb.size() == sizeof(read_data)); + ASIO_CHECK(s.check_buffers(sb.data(0, sb.size()), sizeof(read_data))); +} + void test_4_arg_streambuf_async_read() { +#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1) #if defined(ASIO_HAS_BOOST_BIND) namespace bindns = boost; #else // defined(ASIO_HAS_BOOST_BIND) namespace bindns = std; - using std::placeholders::_1; - using std::placeholders::_2; #endif // defined(ASIO_HAS_BOOST_BIND) + using bindns::placeholders::_1; + using bindns::placeholders::_2; asio::io_context ioc; test_stream s(ioc); @@ -3851,7 +4914,7 @@ void test_4_arg_streambuf_async_read() s.reset(read_data, sizeof(read_data)); sb.consume(sb.size()); called = false; - asio::async_read(s, sb, short_transfer, + asio::async_read(s, sb, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3864,7 +4927,7 @@ void test_4_arg_streambuf_async_read() s.next_read_length(1); sb.consume(sb.size()); called = false; - asio::async_read(s, sb, short_transfer, + asio::async_read(s, sb, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3877,7 +4940,7 @@ void test_4_arg_streambuf_async_read() s.next_read_length(10); sb.consume(sb.size()); called = false; - asio::async_read(s, sb, short_transfer, + asio::async_read(s, sb, short_transfer(), bindns::bind(async_read_handler, _1, _2, sizeof(read_data), &called)); ioc.restart(); @@ -3889,12 +4952,13 @@ void test_4_arg_streambuf_async_read() s.reset(read_data, sizeof(read_data)); sb.consume(sb.size()); int i = asio::async_read(s, sb, - short_transfer, archetypes::lazy_handler()); + short_transfer(), archetypes::lazy_handler()); ASIO_CHECK(i == 42); ioc.restart(); ioc.run(); ASIO_CHECK(sb.size() == sizeof(read_data)); ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data))); +#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1) } ASIO_TEST_SUITE @@ -3903,25 +4967,31 @@ ASIO_TEST_SUITE ASIO_TEST_CASE(test_2_arg_zero_buffers_read) ASIO_TEST_CASE(test_2_arg_mutable_buffer_read) ASIO_TEST_CASE(test_2_arg_vector_buffers_read) + ASIO_TEST_CASE(test_2_arg_dynamic_string_read) ASIO_TEST_CASE(test_2_arg_streambuf_read) ASIO_TEST_CASE(test_3_arg_nothrow_zero_buffers_read) ASIO_TEST_CASE(test_3_arg_nothrow_mutable_buffer_read) ASIO_TEST_CASE(test_3_arg_nothrow_vector_buffers_read) + ASIO_TEST_CASE(test_3_arg_nothrow_dynamic_string_read) ASIO_TEST_CASE(test_3_arg_nothrow_streambuf_read) ASIO_TEST_CASE(test_3_arg_mutable_buffer_read) ASIO_TEST_CASE(test_3_arg_vector_buffers_read) + ASIO_TEST_CASE(test_3_arg_dynamic_string_read) ASIO_TEST_CASE(test_3_arg_streambuf_read) ASIO_TEST_CASE(test_4_arg_mutable_buffer_read) ASIO_TEST_CASE(test_4_arg_vector_buffers_read) + ASIO_TEST_CASE(test_4_arg_dynamic_string_read) ASIO_TEST_CASE(test_4_arg_streambuf_read) ASIO_TEST_CASE(test_3_arg_mutable_buffer_async_read) ASIO_TEST_CASE(test_3_arg_boost_array_buffers_async_read) ASIO_TEST_CASE(test_3_arg_std_array_buffers_async_read) ASIO_TEST_CASE(test_3_arg_vector_buffers_async_read) + ASIO_TEST_CASE(test_3_arg_dynamic_string_async_read) ASIO_TEST_CASE(test_3_arg_streambuf_async_read) ASIO_TEST_CASE(test_4_arg_mutable_buffer_async_read) ASIO_TEST_CASE(test_4_arg_vector_buffers_async_read) ASIO_TEST_CASE(test_4_arg_boost_array_buffers_async_read) ASIO_TEST_CASE(test_4_arg_std_array_buffers_async_read) + ASIO_TEST_CASE(test_4_arg_dynamic_string_async_read) ASIO_TEST_CASE(test_4_arg_streambuf_async_read) ) |