summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/src/tests/unit/read_until.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/src/tests/unit/read_until.cpp')
-rw-r--r--3rdparty/asio/src/tests/unit/read_until.cpp811
1 files changed, 791 insertions, 20 deletions
diff --git a/3rdparty/asio/src/tests/unit/read_until.cpp b/3rdparty/asio/src/tests/unit/read_until.cpp
index 782ac2f4b6b..0b9979ed629 100644
--- a/3rdparty/asio/src/tests/unit/read_until.cpp
+++ b/3rdparty/asio/src/tests/unit/read_until.cpp
@@ -2,7 +2,7 @@
// read_until.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)
@@ -24,7 +24,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)
@@ -104,10 +104,100 @@ private:
static const char read_data[]
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-void test_char_read_until()
+void test_dynamic_string_read_until_char()
{
asio::io_context ioc;
test_stream s(ioc);
+ std::string data1, data2;
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb1 = asio::dynamic_buffer(data1);
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb2 = asio::dynamic_buffer(data2, 25);
+ asio::error_code ec;
+
+ s.reset(read_data, sizeof(read_data));
+ sb1.consume(sb1.size());
+ std::size_t length = asio::read_until(s, sb1, 'Z');
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, 'Z');
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, 'Z');
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, 'Z', ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, 'Z', ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, 'Z', ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, 'Z', ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, 'Z', ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, 'Z', ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, 'Y', ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, 'Y', ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, 'Y', ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+}
+
+void test_streambuf_read_until_char()
+{
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ asio::io_context ioc;
+ test_stream s(ioc);
asio::streambuf sb1;
asio::streambuf sb2(25);
asio::error_code ec;
@@ -188,10 +278,101 @@ void test_char_read_until()
length = asio::read_until(s, sb2, 'Y', ec);
ASIO_CHECK(!ec);
ASIO_CHECK(length == 25);
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+}
+
+void test_dynamic_string_read_until_string()
+{
+ asio::io_context ioc;
+ test_stream s(ioc);
+ std::string data1, data2;
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb1 = asio::dynamic_buffer(data1);
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb2 = asio::dynamic_buffer(data2, 25);
+ asio::error_code ec;
+
+ s.reset(read_data, sizeof(read_data));
+ sb1.consume(sb1.size());
+ std::size_t length = asio::read_until(s, sb1, "XYZ");
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, "XYZ");
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, "XYZ");
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, "XYZ", ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, "XYZ", ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, "XYZ", ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, "XYZ", ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, "XYZ", ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, "XYZ", ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, "WXY", ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, "WXY", ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, "WXY", ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
}
-void test_string_read_until()
+void test_streambuf_read_until_string()
{
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
asio::io_context ioc;
test_stream s(ioc);
asio::streambuf sb1;
@@ -274,6 +455,7 @@ void test_string_read_until()
length = asio::read_until(s, sb2, "WXY", ec);
ASIO_CHECK(!ec);
ASIO_CHECK(length == 25);
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
}
class match_char
@@ -303,8 +485,98 @@ namespace asio {
};
} // namespace asio
-void test_match_condition_read_until()
+void test_dynamic_string_read_until_match_condition()
+{
+ asio::io_context ioc;
+ test_stream s(ioc);
+ std::string data1, data2;
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb1 = asio::dynamic_buffer(data1);
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb2 = asio::dynamic_buffer(data2, 25);
+ asio::error_code ec;
+
+ s.reset(read_data, sizeof(read_data));
+ sb1.consume(sb1.size());
+ std::size_t length = asio::read_until(s, sb1, match_char('Z'));
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, match_char('Z'));
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, match_char('Z'));
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, match_char('Z'), ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, match_char('Z'), ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb1.consume(sb1.size());
+ length = asio::read_until(s, sb1, match_char('Z'), ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, match_char('Z'), ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, match_char('Z'), ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, match_char('Z'), ec);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, match_char('Y'), ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, match_char('Y'), ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ sb2.consume(sb2.size());
+ length = asio::read_until(s, sb2, match_char('Y'), ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+}
+
+void test_streambuf_read_until_match_condition()
{
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
asio::io_context ioc;
test_stream s(ioc);
asio::streambuf sb1;
@@ -387,6 +659,7 @@ void test_match_condition_read_until()
length = asio::read_until(s, sb2, match_char('Y'), ec);
ASIO_CHECK(!ec);
ASIO_CHECK(length == 25);
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
}
void async_read_handler(
@@ -398,15 +671,178 @@ void async_read_handler(
*called = true;
}
-void test_char_async_read_until()
+void test_dynamic_string_async_read_until_char()
{
#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);
+ std::string data1, data2;
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb1 = asio::dynamic_buffer(data1);
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb2 = asio::dynamic_buffer(data2, 25);
+ asio::error_code ec;
+ std::size_t length;
+ bool called;
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, 'Z',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, 'Z',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, 'Z',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, 'Z',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, 'Z',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, 'Z',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, 'Y',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, 'Y',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, 'Y',
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ int i = asio::async_read_until(s, sb2, 'Y',
+ archetypes::lazy_handler());
+ ASIO_CHECK(i == 42);
+ ioc.restart();
+ ioc.run();
+}
+
+void test_streambuf_async_read_until_char()
+{
+#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;
+#endif // defined(ASIO_HAS_BOOST_BIND)
+ using bindns::placeholders::_1;
+ using bindns::placeholders::_2;
asio::io_context ioc;
test_stream s(ioc);
@@ -555,17 +991,181 @@ void test_char_async_read_until()
ASIO_CHECK(i == 42);
ioc.restart();
ioc.run();
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
}
-void test_string_async_read_until()
+void test_dynamic_string_async_read_until_string()
{
#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);
+ std::string data1, data2;
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb1 = asio::dynamic_buffer(data1);
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb2 = asio::dynamic_buffer(data2, 25);
+ asio::error_code ec;
+ std::size_t length;
+ bool called;
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, "XYZ",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, "XYZ",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, "XYZ",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, "XYZ",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, "XYZ",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, "XYZ",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, "WXY",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, "WXY",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, "WXY",
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ int i = asio::async_read_until(s, sb2, "WXY",
+ archetypes::lazy_handler());
+ ASIO_CHECK(i == 42);
+ ioc.restart();
+ ioc.run();
+}
+
+void test_streambuf_async_read_until_string()
+{
+#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;
+#endif // defined(ASIO_HAS_BOOST_BIND)
+ using bindns::placeholders::_1;
+ using bindns::placeholders::_2;
asio::io_context ioc;
test_stream s(ioc);
@@ -714,17 +1314,181 @@ void test_string_async_read_until()
ASIO_CHECK(i == 42);
ioc.restart();
ioc.run();
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+}
+
+void test_dynamic_string_async_read_until_match_condition()
+{
+#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 data1, data2;
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb1 = asio::dynamic_buffer(data1);
+ asio::dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> sb2 = asio::dynamic_buffer(data2, 25);
+ asio::error_code ec;
+ std::size_t length;
+ bool called;
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, match_char('Z'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, match_char('Z'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb1.consume(sb1.size());
+ asio::async_read_until(s, sb1, match_char('Z'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 26);
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, match_char('Z'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, match_char('Z'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, match_char('Z'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == asio::error::not_found);
+ ASIO_CHECK(length == 0);
+
+ s.reset(read_data, sizeof(read_data));
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, match_char('Y'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(1);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, match_char('Y'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ s.next_read_length(10);
+ ec = asio::error_code();
+ length = 0;
+ called = false;
+ sb2.consume(sb2.size());
+ asio::async_read_until(s, sb2, match_char('Y'),
+ bindns::bind(async_read_handler, _1, &ec,
+ _2, &length, &called));
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(called);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(length == 25);
+
+ s.reset(read_data, sizeof(read_data));
+ sb2.consume(sb2.size());
+ int i = asio::async_read_until(s, sb2, match_char('Y'),
+ archetypes::lazy_handler());
+ ASIO_CHECK(i == 42);
+ ioc.restart();
+ ioc.run();
}
-void test_match_condition_async_read_until()
+void test_streambuf_async_read_until_match_condition()
{
+#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);
@@ -873,15 +1637,22 @@ void test_match_condition_async_read_until()
ASIO_CHECK(i == 42);
ioc.restart();
ioc.run();
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
}
ASIO_TEST_SUITE
(
"read_until",
- ASIO_TEST_CASE(test_char_read_until)
- ASIO_TEST_CASE(test_string_read_until)
- ASIO_TEST_CASE(test_match_condition_read_until)
- ASIO_TEST_CASE(test_char_async_read_until)
- ASIO_TEST_CASE(test_string_async_read_until)
- ASIO_TEST_CASE(test_match_condition_async_read_until)
+ ASIO_TEST_CASE(test_dynamic_string_read_until_char)
+ ASIO_TEST_CASE(test_streambuf_read_until_char)
+ ASIO_TEST_CASE(test_dynamic_string_read_until_string)
+ ASIO_TEST_CASE(test_streambuf_read_until_string)
+ ASIO_TEST_CASE(test_dynamic_string_read_until_match_condition)
+ ASIO_TEST_CASE(test_streambuf_read_until_match_condition)
+ ASIO_TEST_CASE(test_dynamic_string_async_read_until_char)
+ ASIO_TEST_CASE(test_streambuf_async_read_until_char)
+ ASIO_TEST_CASE(test_dynamic_string_async_read_until_string)
+ ASIO_TEST_CASE(test_streambuf_async_read_until_string)
+ ASIO_TEST_CASE(test_dynamic_string_async_read_until_match_condition)
+ ASIO_TEST_CASE(test_streambuf_async_read_until_match_condition)
)