2
0
mirror of https://github.com/boostorg/asio.git synced 2026-01-28 06:42:08 +00:00

Merge from trunk...

Fix compile error in regex overload of async_read_until.hpp. Fixes #5688

Explicitly specify the signal() function from the global namespace. Fixes #5722

Don't read the clock unless the heap is non-empty.

Change the SSL buffers sizes so that they're large enough to hold a complete TLS record. Fixes #5854

Make sure the synchronous null_buffers operations obey the user's non_blocking setting. Fixes #5756

Set size of select fd_set at runtime when using Windows.

Disable warning due to const qualifier being applied to function type.

Fix crash due to gcc_x86_fenced_block that shows up when using the Intel C++ compiler. Fixes #5763

Specialise operations for buffer sequences that are arrays of exactly two buffers.

Initialise all OpenSSL algorithms.

Fix error mapping when session is gracefully shut down.

Various performance improvements:

* Split the task_io_service's run and poll code.

* Use thread-local operation queues in single-threaded use cases (i.e. concurrency_hint is 1) to eliminate a lock/unlock pair.

* Only fence block exit when a handler is being run directly out of the io_service.

* Prefer x86 mfence-based fenced block when available.

* Use a plain ol' long for the atomic_count when all thread support is disabled.

* Allow some epoll_reactor speculative operations to be performed without holding the lock.

* Improve locality of reference by performing an epoll_reactor's I/O operation immediately before the corresponding handler is called. This also improves scalability across CPUs when multiple threads are running the io_service.

* Pass same error_code variable through to each operation's complete() function.

* Optimise creation of and access to the io_service implementation.

Remove unused state in HTTP server examples.

Add latency test programs.


[SVN r74863]
This commit is contained in:
Christopher Kohlhoff
2011-10-09 21:59:57 +00:00
parent 18a48222ed
commit 77dec8e703
105 changed files with 7800 additions and 504 deletions

View File

@@ -16,6 +16,9 @@
// Test that header file is self-contained.
#include <boost/asio/write.hpp>
#if defined(BOOST_ASIO_HAS_STD_ARRAY)
# include <array>
#endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/noncopyable.hpp>
@@ -184,13 +187,13 @@ void test_2_arg_mutable_buffers_1_write()
BOOST_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
}
void test_2_arg_multi_buffers_write()
void test_2_arg_vector_buffers_write()
{
boost::asio::io_service ios;
test_stream s(ios);
boost::array<boost::asio::const_buffer, 2> buffers = { {
boost::asio::buffer(write_data, 32),
boost::asio::buffer(write_data) + 32 } };
std::vector<boost::asio::const_buffer> buffers;
buffers.push_back(boost::asio::buffer(write_data, 32));
buffers.push_back(boost::asio::buffer(write_data) + 32);
s.reset();
size_t bytes_transferred = boost::asio::write(s, buffers);
@@ -280,13 +283,13 @@ void test_3_arg_nothrow_mutable_buffers_1_write()
BOOST_CHECK(!error);
}
void test_3_arg_nothrow_multi_buffers_write()
void test_3_arg_nothrow_vector_buffers_write()
{
boost::asio::io_service ios;
test_stream s(ios);
boost::array<boost::asio::const_buffer, 2> buffers = { {
boost::asio::buffer(write_data, 32),
boost::asio::buffer(write_data) + 32 } };
std::vector<boost::asio::const_buffer> buffers;
buffers.push_back(boost::asio::buffer(write_data, 32));
buffers.push_back(boost::asio::buffer(write_data) + 32);
s.reset();
boost::system::error_code error;
@@ -686,13 +689,13 @@ void test_3_arg_mutable_buffers_1_write()
BOOST_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
}
void test_3_arg_multi_buffers_write()
void test_3_arg_vector_buffers_write()
{
boost::asio::io_service ios;
test_stream s(ios);
boost::array<boost::asio::const_buffer, 2> buffers = { {
boost::asio::buffer(write_data, 32),
boost::asio::buffer(write_data) + 32 } };
std::vector<boost::asio::const_buffer> buffers;
buffers.push_back(boost::asio::buffer(write_data, 32));
buffers.push_back(boost::asio::buffer(write_data) + 32);
s.reset();
size_t bytes_transferred = boost::asio::write(s, buffers,
@@ -1343,13 +1346,13 @@ void test_4_arg_mutable_buffers_1_write()
BOOST_CHECK(!error);
}
void test_4_arg_multi_buffers_write()
void test_4_arg_vector_buffers_write()
{
boost::asio::io_service ios;
test_stream s(ios);
boost::array<boost::asio::const_buffer, 2> buffers = { {
boost::asio::buffer(write_data, 32),
boost::asio::buffer(write_data) + 32 } };
std::vector<boost::asio::const_buffer> buffers;
buffers.push_back(boost::asio::buffer(write_data, 32));
buffers.push_back(boost::asio::buffer(write_data) + 32);
s.reset();
boost::system::error_code error;
@@ -1681,7 +1684,7 @@ void test_3_arg_mutable_buffers_1_async_write()
BOOST_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
}
void test_3_arg_multi_buffers_async_write()
void test_3_arg_boost_array_buffers_async_write()
{
boost::asio::io_service ios;
test_stream s(ios);
@@ -1728,6 +1731,102 @@ void test_3_arg_multi_buffers_async_write()
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
}
void test_3_arg_std_array_buffers_async_write()
{
#if defined(BOOST_ASIO_HAS_STD_ARRAY)
boost::asio::io_service ios;
test_stream s(ios);
std::array<boost::asio::const_buffer, 2> buffers = { {
boost::asio::buffer(write_data, 32),
boost::asio::buffer(write_data) + 32 } };
s.reset();
bool called = false;
boost::asio::async_write(s, buffers,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
#endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
}
void test_3_arg_vector_buffers_async_write()
{
boost::asio::io_service ios;
test_stream s(ios);
std::vector<boost::asio::const_buffer> buffers;
buffers.push_back(boost::asio::buffer(write_data, 32));
buffers.push_back(boost::asio::buffer(write_data) + 32);
s.reset();
bool called = false;
boost::asio::async_write(s, buffers,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
}
void test_4_arg_const_buffers_1_async_write()
{
boost::asio::io_service ios;
@@ -2428,7 +2527,7 @@ void test_4_arg_mutable_buffers_1_async_write()
BOOST_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
}
void test_4_arg_multi_buffers_async_write()
void test_4_arg_boost_array_buffers_async_write()
{
boost::asio::io_service ios;
test_stream s(ios);
@@ -2779,28 +2878,736 @@ void test_4_arg_multi_buffers_async_write()
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
}
void test_4_arg_std_array_buffers_async_write()
{
#if defined(BOOST_ASIO_HAS_STD_ARRAY)
boost::asio::io_service ios;
test_stream s(ios);
std::array<boost::asio::const_buffer, 2> buffers = { {
boost::asio::buffer(write_data, 32),
boost::asio::buffer(write_data) + 32 } };
s.reset();
bool called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_all(),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_all(),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_all(),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
1, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 1));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
42, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 42));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
50, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 50));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
1, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 1));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
1, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 1));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
1, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 1));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
42, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 42));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
42, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 42));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
42, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 42));
s.reset();
called = false;
boost::asio::async_write(s, buffers, old_style_transfer_all,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, old_style_transfer_all,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, old_style_transfer_all,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
called = false;
boost::asio::async_write(s, buffers, short_transfer,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, short_transfer,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, short_transfer,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
#endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
}
void test_4_arg_vector_buffers_async_write()
{
boost::asio::io_service ios;
test_stream s(ios);
std::vector<boost::asio::const_buffer> buffers;
buffers.push_back(boost::asio::buffer(write_data, 32));
buffers.push_back(boost::asio::buffer(write_data) + 32);
s.reset();
bool called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_all(),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_all(),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_all(),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
1, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 1));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
42, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 42));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_at_least(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
50, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 50));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
1, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 1));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
1, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 1));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(1),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
1, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 1));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(10),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
10, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 10));
s.reset();
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
42, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 42));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
42, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 42));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, boost::asio::transfer_exactly(42),
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
42, &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, 42));
s.reset();
called = false;
boost::asio::async_write(s, buffers, old_style_transfer_all,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, old_style_transfer_all,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, old_style_transfer_all,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
called = false;
boost::asio::async_write(s, buffers, short_transfer,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(1);
called = false;
boost::asio::async_write(s, buffers, short_transfer,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
s.reset();
s.next_write_length(10);
called = false;
boost::asio::async_write(s, buffers, short_transfer,
boost::bind(async_write_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sizeof(write_data), &called));
ios.reset();
ios.run();
BOOST_CHECK(called);
BOOST_CHECK(s.check_buffers(buffers, sizeof(write_data)));
}
test_suite* init_unit_test_suite(int, char*[])
{
test_suite* test = BOOST_TEST_SUITE("write");
test->add(BOOST_TEST_CASE(&test_2_arg_zero_buffers_write));
test->add(BOOST_TEST_CASE(&test_2_arg_const_buffers_1_write));
test->add(BOOST_TEST_CASE(&test_2_arg_mutable_buffers_1_write));
test->add(BOOST_TEST_CASE(&test_2_arg_multi_buffers_write));
test->add(BOOST_TEST_CASE(&test_2_arg_vector_buffers_write));
test->add(BOOST_TEST_CASE(&test_3_arg_nothrow_zero_buffers_write));
test->add(BOOST_TEST_CASE(&test_3_arg_nothrow_const_buffers_1_write));
test->add(BOOST_TEST_CASE(&test_3_arg_nothrow_mutable_buffers_1_write));
test->add(BOOST_TEST_CASE(&test_3_arg_nothrow_multi_buffers_write));
test->add(BOOST_TEST_CASE(&test_3_arg_nothrow_vector_buffers_write));
test->add(BOOST_TEST_CASE(&test_3_arg_const_buffers_1_write));
test->add(BOOST_TEST_CASE(&test_3_arg_mutable_buffers_1_write));
test->add(BOOST_TEST_CASE(&test_3_arg_multi_buffers_write));
test->add(BOOST_TEST_CASE(&test_3_arg_vector_buffers_write));
test->add(BOOST_TEST_CASE(&test_4_arg_const_buffers_1_write));
test->add(BOOST_TEST_CASE(&test_4_arg_mutable_buffers_1_write));
test->add(BOOST_TEST_CASE(&test_4_arg_multi_buffers_write));
test->add(BOOST_TEST_CASE(&test_4_arg_vector_buffers_write));
test->add(BOOST_TEST_CASE(&test_3_arg_const_buffers_1_async_write));
test->add(BOOST_TEST_CASE(&test_3_arg_mutable_buffers_1_async_write));
test->add(BOOST_TEST_CASE(&test_3_arg_multi_buffers_async_write));
test->add(BOOST_TEST_CASE(&test_3_arg_boost_array_buffers_async_write));
test->add(BOOST_TEST_CASE(&test_3_arg_std_array_buffers_async_write));
test->add(BOOST_TEST_CASE(&test_3_arg_vector_buffers_async_write));
test->add(BOOST_TEST_CASE(&test_4_arg_const_buffers_1_async_write));
test->add(BOOST_TEST_CASE(&test_4_arg_mutable_buffers_1_async_write));
test->add(BOOST_TEST_CASE(&test_4_arg_multi_buffers_async_write));
test->add(BOOST_TEST_CASE(&test_4_arg_boost_array_buffers_async_write));
test->add(BOOST_TEST_CASE(&test_4_arg_std_array_buffers_async_write));
test->add(BOOST_TEST_CASE(&test_4_arg_vector_buffers_async_write));
return test;
}