PageRenderTime 80ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 1ms

/test/read.cpp

https://bitbucket.org/boostorg/asio
C++ | 3919 lines | 3507 code | 401 blank | 11 comment | 293 complexity | f6f82d28bf338561bb9fcbc3145edb58 MD5 | raw file
  1. //
  2. // read.cpp
  3. // ~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Disable autolinking for unit tests.
  11. #if !defined(BOOST_ALL_NO_LIB)
  12. #define BOOST_ALL_NO_LIB 1
  13. #endif // !defined(BOOST_ALL_NO_LIB)
  14. // Test that header file is self-contained.
  15. #include <boost/asio/read.hpp>
  16. #include <cstring>
  17. #include <vector>
  18. #include "archetypes/async_result.hpp"
  19. #include <boost/asio/io_service.hpp>
  20. #include <boost/asio/streambuf.hpp>
  21. #include "unit_test.hpp"
  22. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  23. # include <boost/bind.hpp>
  24. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  25. # include <functional>
  26. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  27. #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  28. #include <boost/array.hpp>
  29. #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  30. #if defined(BOOST_ASIO_HAS_STD_ARRAY)
  31. # include <array>
  32. #endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
  33. using namespace std; // For memcmp, memcpy and memset.
  34. class test_stream
  35. {
  36. public:
  37. typedef boost::asio::io_service io_service_type;
  38. test_stream(boost::asio::io_service& io_service)
  39. : io_service_(io_service),
  40. length_(0),
  41. position_(0),
  42. next_read_length_(0)
  43. {
  44. }
  45. io_service_type& get_io_service()
  46. {
  47. return io_service_;
  48. }
  49. void reset(const void* data, size_t length)
  50. {
  51. BOOST_ASIO_CHECK(length <= max_length);
  52. memcpy(data_, data, length);
  53. length_ = length;
  54. position_ = 0;
  55. next_read_length_ = length;
  56. }
  57. void next_read_length(size_t length)
  58. {
  59. next_read_length_ = length;
  60. }
  61. template <typename Const_Buffers>
  62. bool check_buffers(const Const_Buffers& buffers, size_t length)
  63. {
  64. if (length != position_)
  65. return false;
  66. typename Const_Buffers::const_iterator iter = buffers.begin();
  67. typename Const_Buffers::const_iterator end = buffers.end();
  68. size_t checked_length = 0;
  69. for (; iter != end && checked_length < length; ++iter)
  70. {
  71. size_t buffer_length = boost::asio::buffer_size(*iter);
  72. if (buffer_length > length - checked_length)
  73. buffer_length = length - checked_length;
  74. if (memcmp(data_ + checked_length,
  75. boost::asio::buffer_cast<const void*>(*iter), buffer_length) != 0)
  76. return false;
  77. checked_length += buffer_length;
  78. }
  79. return true;
  80. }
  81. template <typename Mutable_Buffers>
  82. size_t read_some(const Mutable_Buffers& buffers)
  83. {
  84. size_t n = boost::asio::buffer_copy(buffers,
  85. boost::asio::buffer(data_, length_) + position_,
  86. next_read_length_);
  87. position_ += n;
  88. return n;
  89. }
  90. template <typename Mutable_Buffers>
  91. size_t read_some(const Mutable_Buffers& buffers,
  92. boost::system::error_code& ec)
  93. {
  94. ec = boost::system::error_code();
  95. return read_some(buffers);
  96. }
  97. template <typename Mutable_Buffers, typename Handler>
  98. void async_read_some(const Mutable_Buffers& buffers, Handler handler)
  99. {
  100. size_t bytes_transferred = read_some(buffers);
  101. io_service_.post(boost::asio::detail::bind_handler(
  102. handler, boost::system::error_code(), bytes_transferred));
  103. }
  104. private:
  105. io_service_type& io_service_;
  106. enum { max_length = 8192 };
  107. char data_[max_length];
  108. size_t length_;
  109. size_t position_;
  110. size_t next_read_length_;
  111. };
  112. static const char read_data[]
  113. = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  114. void test_2_arg_zero_buffers_read()
  115. {
  116. boost::asio::io_service ios;
  117. test_stream s(ios);
  118. std::vector<boost::asio::mutable_buffer> buffers;
  119. size_t bytes_transferred = boost::asio::read(s, buffers);
  120. BOOST_ASIO_CHECK(bytes_transferred == 0);
  121. }
  122. void test_2_arg_mutable_buffers_1_read()
  123. {
  124. boost::asio::io_service ios;
  125. test_stream s(ios);
  126. char read_buf[sizeof(read_data)];
  127. boost::asio::mutable_buffers_1 buffers
  128. = boost::asio::buffer(read_buf, sizeof(read_buf));
  129. s.reset(read_data, sizeof(read_data));
  130. memset(read_buf, 0, sizeof(read_buf));
  131. size_t bytes_transferred = boost::asio::read(s, buffers);
  132. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  133. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  134. s.reset(read_data, sizeof(read_data));
  135. s.next_read_length(1);
  136. memset(read_buf, 0, sizeof(read_buf));
  137. bytes_transferred = boost::asio::read(s, buffers);
  138. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  139. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  140. s.reset(read_data, sizeof(read_data));
  141. s.next_read_length(10);
  142. memset(read_buf, 0, sizeof(read_buf));
  143. bytes_transferred = boost::asio::read(s, buffers);
  144. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  145. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  146. }
  147. void test_2_arg_vector_buffers_read()
  148. {
  149. boost::asio::io_service ios;
  150. test_stream s(ios);
  151. char read_buf[sizeof(read_data)];
  152. std::vector<boost::asio::mutable_buffer> buffers;
  153. buffers.push_back(boost::asio::buffer(read_buf, 32));
  154. buffers.push_back(boost::asio::buffer(read_buf) + 32);
  155. s.reset(read_data, sizeof(read_data));
  156. memset(read_buf, 0, sizeof(read_buf));
  157. size_t bytes_transferred = boost::asio::read(s, buffers);
  158. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  159. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  160. s.reset(read_data, sizeof(read_data));
  161. s.next_read_length(1);
  162. memset(read_buf, 0, sizeof(read_buf));
  163. bytes_transferred = boost::asio::read(s, buffers);
  164. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  165. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  166. s.reset(read_data, sizeof(read_data));
  167. s.next_read_length(10);
  168. memset(read_buf, 0, sizeof(read_buf));
  169. bytes_transferred = boost::asio::read(s, buffers);
  170. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  171. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  172. }
  173. void test_2_arg_streambuf_read()
  174. {
  175. boost::asio::io_service ios;
  176. test_stream s(ios);
  177. boost::asio::streambuf sb(sizeof(read_data));
  178. s.reset(read_data, sizeof(read_data));
  179. sb.consume(sb.size());
  180. size_t bytes_transferred = boost::asio::read(s, sb);
  181. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  182. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  183. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  184. s.reset(read_data, sizeof(read_data));
  185. s.next_read_length(1);
  186. sb.consume(sb.size());
  187. bytes_transferred = boost::asio::read(s, sb);
  188. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  189. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  190. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  191. s.reset(read_data, sizeof(read_data));
  192. s.next_read_length(10);
  193. sb.consume(sb.size());
  194. bytes_transferred = boost::asio::read(s, sb);
  195. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  196. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  197. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  198. }
  199. void test_3_arg_nothrow_zero_buffers_read()
  200. {
  201. boost::asio::io_service ios;
  202. test_stream s(ios);
  203. std::vector<boost::asio::mutable_buffer> buffers;
  204. boost::system::error_code error;
  205. size_t bytes_transferred = boost::asio::read(s, buffers, error);
  206. BOOST_ASIO_CHECK(bytes_transferred == 0);
  207. BOOST_ASIO_CHECK(!error);
  208. }
  209. void test_3_arg_nothrow_mutable_buffers_1_read()
  210. {
  211. boost::asio::io_service ios;
  212. test_stream s(ios);
  213. char read_buf[sizeof(read_data)];
  214. boost::asio::mutable_buffers_1 buffers
  215. = boost::asio::buffer(read_buf, sizeof(read_buf));
  216. s.reset(read_data, sizeof(read_data));
  217. memset(read_buf, 0, sizeof(read_buf));
  218. boost::system::error_code error;
  219. size_t bytes_transferred = boost::asio::read(s, buffers, error);
  220. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  221. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  222. BOOST_ASIO_CHECK(!error);
  223. s.reset(read_data, sizeof(read_data));
  224. s.next_read_length(1);
  225. memset(read_buf, 0, sizeof(read_buf));
  226. bytes_transferred = boost::asio::read(s, buffers, error);
  227. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  228. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  229. BOOST_ASIO_CHECK(!error);
  230. s.reset(read_data, sizeof(read_data));
  231. s.next_read_length(10);
  232. memset(read_buf, 0, sizeof(read_buf));
  233. bytes_transferred = boost::asio::read(s, buffers, error);
  234. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  235. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  236. BOOST_ASIO_CHECK(!error);
  237. }
  238. void test_3_arg_nothrow_vector_buffers_read()
  239. {
  240. boost::asio::io_service ios;
  241. test_stream s(ios);
  242. char read_buf[sizeof(read_data)];
  243. std::vector<boost::asio::mutable_buffer> buffers;
  244. buffers.push_back(boost::asio::buffer(read_buf, 32));
  245. buffers.push_back(boost::asio::buffer(read_buf) + 32);
  246. s.reset(read_data, sizeof(read_data));
  247. memset(read_buf, 0, sizeof(read_buf));
  248. boost::system::error_code error;
  249. size_t bytes_transferred = boost::asio::read(s, buffers, error);
  250. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  251. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  252. BOOST_ASIO_CHECK(!error);
  253. s.reset(read_data, sizeof(read_data));
  254. s.next_read_length(1);
  255. memset(read_buf, 0, sizeof(read_buf));
  256. bytes_transferred = boost::asio::read(s, buffers, error);
  257. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  258. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  259. BOOST_ASIO_CHECK(!error);
  260. s.reset(read_data, sizeof(read_data));
  261. s.next_read_length(10);
  262. memset(read_buf, 0, sizeof(read_buf));
  263. bytes_transferred = boost::asio::read(s, buffers, error);
  264. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  265. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  266. BOOST_ASIO_CHECK(!error);
  267. }
  268. void test_3_arg_nothrow_streambuf_read()
  269. {
  270. boost::asio::io_service ios;
  271. test_stream s(ios);
  272. boost::asio::streambuf sb(sizeof(read_data));
  273. s.reset(read_data, sizeof(read_data));
  274. sb.consume(sb.size());
  275. boost::system::error_code error;
  276. size_t bytes_transferred = boost::asio::read(s, sb, error);
  277. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  278. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  279. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  280. BOOST_ASIO_CHECK(!error);
  281. s.reset(read_data, sizeof(read_data));
  282. s.next_read_length(1);
  283. sb.consume(sb.size());
  284. bytes_transferred = boost::asio::read(s, sb, error);
  285. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  286. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  287. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  288. BOOST_ASIO_CHECK(!error);
  289. s.reset(read_data, sizeof(read_data));
  290. s.next_read_length(10);
  291. sb.consume(sb.size());
  292. bytes_transferred = boost::asio::read(s, sb, error);
  293. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  294. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  295. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  296. BOOST_ASIO_CHECK(!error);
  297. }
  298. bool old_style_transfer_all(const boost::system::error_code& ec,
  299. size_t /*bytes_transferred*/)
  300. {
  301. return !!ec;
  302. }
  303. size_t short_transfer(const boost::system::error_code& ec,
  304. size_t /*bytes_transferred*/)
  305. {
  306. return !!ec ? 0 : 3;
  307. }
  308. void test_3_arg_mutable_buffers_1_read()
  309. {
  310. boost::asio::io_service ios;
  311. test_stream s(ios);
  312. char read_buf[sizeof(read_data)];
  313. boost::asio::mutable_buffers_1 buffers
  314. = boost::asio::buffer(read_buf, sizeof(read_buf));
  315. s.reset(read_data, sizeof(read_data));
  316. memset(read_buf, 0, sizeof(read_buf));
  317. size_t bytes_transferred = boost::asio::read(s, buffers,
  318. boost::asio::transfer_all());
  319. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  320. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  321. s.reset(read_data, sizeof(read_data));
  322. s.next_read_length(1);
  323. memset(read_buf, 0, sizeof(read_buf));
  324. bytes_transferred = boost::asio::read(s, buffers,
  325. boost::asio::transfer_all());
  326. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  327. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  328. s.reset(read_data, sizeof(read_data));
  329. s.next_read_length(10);
  330. memset(read_buf, 0, sizeof(read_buf));
  331. bytes_transferred = boost::asio::read(s, buffers,
  332. boost::asio::transfer_all());
  333. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  334. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  335. s.reset(read_data, sizeof(read_data));
  336. memset(read_buf, 0, sizeof(read_buf));
  337. bytes_transferred = boost::asio::read(s, buffers,
  338. boost::asio::transfer_at_least(1));
  339. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  340. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  341. s.reset(read_data, sizeof(read_data));
  342. s.next_read_length(1);
  343. memset(read_buf, 0, sizeof(read_buf));
  344. bytes_transferred = boost::asio::read(s, buffers,
  345. boost::asio::transfer_at_least(1));
  346. BOOST_ASIO_CHECK(bytes_transferred == 1);
  347. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  348. s.reset(read_data, sizeof(read_data));
  349. s.next_read_length(10);
  350. memset(read_buf, 0, sizeof(read_buf));
  351. bytes_transferred = boost::asio::read(s, buffers,
  352. boost::asio::transfer_at_least(1));
  353. BOOST_ASIO_CHECK(bytes_transferred == 10);
  354. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  355. s.reset(read_data, sizeof(read_data));
  356. memset(read_buf, 0, sizeof(read_buf));
  357. bytes_transferred = boost::asio::read(s, buffers,
  358. boost::asio::transfer_at_least(10));
  359. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  360. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  361. s.reset(read_data, sizeof(read_data));
  362. s.next_read_length(1);
  363. memset(read_buf, 0, sizeof(read_buf));
  364. bytes_transferred = boost::asio::read(s, buffers,
  365. boost::asio::transfer_at_least(10));
  366. BOOST_ASIO_CHECK(bytes_transferred == 10);
  367. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  368. s.reset(read_data, sizeof(read_data));
  369. s.next_read_length(10);
  370. memset(read_buf, 0, sizeof(read_buf));
  371. bytes_transferred = boost::asio::read(s, buffers,
  372. boost::asio::transfer_at_least(10));
  373. BOOST_ASIO_CHECK(bytes_transferred == 10);
  374. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  375. s.reset(read_data, sizeof(read_data));
  376. memset(read_buf, 0, sizeof(read_buf));
  377. bytes_transferred = boost::asio::read(s, buffers,
  378. boost::asio::transfer_at_least(42));
  379. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  380. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  381. s.reset(read_data, sizeof(read_data));
  382. s.next_read_length(1);
  383. memset(read_buf, 0, sizeof(read_buf));
  384. bytes_transferred = boost::asio::read(s, buffers,
  385. boost::asio::transfer_at_least(42));
  386. BOOST_ASIO_CHECK(bytes_transferred == 42);
  387. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  388. s.reset(read_data, sizeof(read_data));
  389. s.next_read_length(10);
  390. memset(read_buf, 0, sizeof(read_buf));
  391. bytes_transferred = boost::asio::read(s, buffers,
  392. boost::asio::transfer_at_least(42));
  393. BOOST_ASIO_CHECK(bytes_transferred == 50);
  394. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  395. s.reset(read_data, sizeof(read_data));
  396. memset(read_buf, 0, sizeof(read_buf));
  397. bytes_transferred = boost::asio::read(s, buffers,
  398. boost::asio::transfer_exactly(1));
  399. BOOST_ASIO_CHECK(bytes_transferred == 1);
  400. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  401. s.reset(read_data, sizeof(read_data));
  402. s.next_read_length(1);
  403. memset(read_buf, 0, sizeof(read_buf));
  404. bytes_transferred = boost::asio::read(s, buffers,
  405. boost::asio::transfer_exactly(1));
  406. BOOST_ASIO_CHECK(bytes_transferred == 1);
  407. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  408. s.reset(read_data, sizeof(read_data));
  409. s.next_read_length(10);
  410. memset(read_buf, 0, sizeof(read_buf));
  411. bytes_transferred = boost::asio::read(s, buffers,
  412. boost::asio::transfer_exactly(1));
  413. BOOST_ASIO_CHECK(bytes_transferred == 1);
  414. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  415. s.reset(read_data, sizeof(read_data));
  416. memset(read_buf, 0, sizeof(read_buf));
  417. bytes_transferred = boost::asio::read(s, buffers,
  418. boost::asio::transfer_exactly(10));
  419. BOOST_ASIO_CHECK(bytes_transferred == 10);
  420. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  421. s.reset(read_data, sizeof(read_data));
  422. s.next_read_length(1);
  423. memset(read_buf, 0, sizeof(read_buf));
  424. bytes_transferred = boost::asio::read(s, buffers,
  425. boost::asio::transfer_exactly(10));
  426. BOOST_ASIO_CHECK(bytes_transferred == 10);
  427. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  428. s.reset(read_data, sizeof(read_data));
  429. s.next_read_length(10);
  430. memset(read_buf, 0, sizeof(read_buf));
  431. bytes_transferred = boost::asio::read(s, buffers,
  432. boost::asio::transfer_exactly(10));
  433. BOOST_ASIO_CHECK(bytes_transferred == 10);
  434. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  435. s.reset(read_data, sizeof(read_data));
  436. memset(read_buf, 0, sizeof(read_buf));
  437. bytes_transferred = boost::asio::read(s, buffers,
  438. boost::asio::transfer_exactly(42));
  439. BOOST_ASIO_CHECK(bytes_transferred == 42);
  440. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  441. s.reset(read_data, sizeof(read_data));
  442. s.next_read_length(1);
  443. memset(read_buf, 0, sizeof(read_buf));
  444. bytes_transferred = boost::asio::read(s, buffers,
  445. boost::asio::transfer_exactly(42));
  446. BOOST_ASIO_CHECK(bytes_transferred == 42);
  447. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  448. s.reset(read_data, sizeof(read_data));
  449. s.next_read_length(10);
  450. memset(read_buf, 0, sizeof(read_buf));
  451. bytes_transferred = boost::asio::read(s, buffers,
  452. boost::asio::transfer_exactly(42));
  453. BOOST_ASIO_CHECK(bytes_transferred == 42);
  454. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  455. s.reset(read_data, sizeof(read_data));
  456. memset(read_buf, 0, sizeof(read_buf));
  457. bytes_transferred = boost::asio::read(s, buffers, old_style_transfer_all);
  458. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  459. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  460. s.reset(read_data, sizeof(read_data));
  461. s.next_read_length(1);
  462. memset(read_buf, 0, sizeof(read_buf));
  463. bytes_transferred = boost::asio::read(s, buffers, old_style_transfer_all);
  464. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  465. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  466. s.reset(read_data, sizeof(read_data));
  467. s.next_read_length(10);
  468. memset(read_buf, 0, sizeof(read_buf));
  469. bytes_transferred = boost::asio::read(s, buffers, old_style_transfer_all);
  470. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  471. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  472. s.reset(read_data, sizeof(read_data));
  473. memset(read_buf, 0, sizeof(read_buf));
  474. bytes_transferred = boost::asio::read(s, buffers, short_transfer);
  475. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  476. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  477. s.reset(read_data, sizeof(read_data));
  478. s.next_read_length(1);
  479. memset(read_buf, 0, sizeof(read_buf));
  480. bytes_transferred = boost::asio::read(s, buffers, short_transfer);
  481. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  482. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  483. s.reset(read_data, sizeof(read_data));
  484. s.next_read_length(10);
  485. memset(read_buf, 0, sizeof(read_buf));
  486. bytes_transferred = boost::asio::read(s, buffers, short_transfer);
  487. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  488. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  489. }
  490. void test_3_arg_vector_buffers_read()
  491. {
  492. boost::asio::io_service ios;
  493. test_stream s(ios);
  494. char read_buf[sizeof(read_data)];
  495. std::vector<boost::asio::mutable_buffer> buffers;
  496. buffers.push_back(boost::asio::buffer(read_buf, 32));
  497. buffers.push_back(boost::asio::buffer(read_buf) + 32);
  498. s.reset(read_data, sizeof(read_data));
  499. memset(read_buf, 0, sizeof(read_buf));
  500. size_t bytes_transferred = boost::asio::read(s, buffers,
  501. boost::asio::transfer_all());
  502. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  503. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  504. s.reset(read_data, sizeof(read_data));
  505. s.next_read_length(1);
  506. memset(read_buf, 0, sizeof(read_buf));
  507. bytes_transferred = boost::asio::read(s, buffers,
  508. boost::asio::transfer_all());
  509. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  510. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  511. s.reset(read_data, sizeof(read_data));
  512. s.next_read_length(10);
  513. memset(read_buf, 0, sizeof(read_buf));
  514. bytes_transferred = boost::asio::read(s, buffers,
  515. boost::asio::transfer_all());
  516. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  517. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  518. s.reset(read_data, sizeof(read_data));
  519. memset(read_buf, 0, sizeof(read_buf));
  520. bytes_transferred = boost::asio::read(s, buffers,
  521. boost::asio::transfer_at_least(1));
  522. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  523. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  524. s.reset(read_data, sizeof(read_data));
  525. s.next_read_length(1);
  526. memset(read_buf, 0, sizeof(read_buf));
  527. bytes_transferred = boost::asio::read(s, buffers,
  528. boost::asio::transfer_at_least(1));
  529. BOOST_ASIO_CHECK(bytes_transferred == 1);
  530. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  531. s.reset(read_data, sizeof(read_data));
  532. s.next_read_length(10);
  533. memset(read_buf, 0, sizeof(read_buf));
  534. bytes_transferred = boost::asio::read(s, buffers,
  535. boost::asio::transfer_at_least(1));
  536. BOOST_ASIO_CHECK(bytes_transferred == 10);
  537. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  538. s.reset(read_data, sizeof(read_data));
  539. memset(read_buf, 0, sizeof(read_buf));
  540. bytes_transferred = boost::asio::read(s, buffers,
  541. boost::asio::transfer_at_least(10));
  542. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  543. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  544. s.reset(read_data, sizeof(read_data));
  545. s.next_read_length(1);
  546. memset(read_buf, 0, sizeof(read_buf));
  547. bytes_transferred = boost::asio::read(s, buffers,
  548. boost::asio::transfer_at_least(10));
  549. BOOST_ASIO_CHECK(bytes_transferred == 10);
  550. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  551. s.reset(read_data, sizeof(read_data));
  552. s.next_read_length(10);
  553. memset(read_buf, 0, sizeof(read_buf));
  554. bytes_transferred = boost::asio::read(s, buffers,
  555. boost::asio::transfer_at_least(10));
  556. BOOST_ASIO_CHECK(bytes_transferred == 10);
  557. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  558. s.reset(read_data, sizeof(read_data));
  559. memset(read_buf, 0, sizeof(read_buf));
  560. bytes_transferred = boost::asio::read(s, buffers,
  561. boost::asio::transfer_at_least(42));
  562. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  563. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  564. s.reset(read_data, sizeof(read_data));
  565. s.next_read_length(1);
  566. memset(read_buf, 0, sizeof(read_buf));
  567. bytes_transferred = boost::asio::read(s, buffers,
  568. boost::asio::transfer_at_least(42));
  569. BOOST_ASIO_CHECK(bytes_transferred == 42);
  570. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  571. s.reset(read_data, sizeof(read_data));
  572. s.next_read_length(10);
  573. memset(read_buf, 0, sizeof(read_buf));
  574. bytes_transferred = boost::asio::read(s, buffers,
  575. boost::asio::transfer_at_least(42));
  576. BOOST_ASIO_CHECK(bytes_transferred == 50);
  577. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  578. s.reset(read_data, sizeof(read_data));
  579. memset(read_buf, 0, sizeof(read_buf));
  580. bytes_transferred = boost::asio::read(s, buffers,
  581. boost::asio::transfer_exactly(1));
  582. BOOST_ASIO_CHECK(bytes_transferred == 1);
  583. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  584. s.reset(read_data, sizeof(read_data));
  585. s.next_read_length(1);
  586. memset(read_buf, 0, sizeof(read_buf));
  587. bytes_transferred = boost::asio::read(s, buffers,
  588. boost::asio::transfer_exactly(1));
  589. BOOST_ASIO_CHECK(bytes_transferred == 1);
  590. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  591. s.reset(read_data, sizeof(read_data));
  592. s.next_read_length(10);
  593. memset(read_buf, 0, sizeof(read_buf));
  594. bytes_transferred = boost::asio::read(s, buffers,
  595. boost::asio::transfer_exactly(1));
  596. BOOST_ASIO_CHECK(bytes_transferred == 1);
  597. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  598. s.reset(read_data, sizeof(read_data));
  599. memset(read_buf, 0, sizeof(read_buf));
  600. bytes_transferred = boost::asio::read(s, buffers,
  601. boost::asio::transfer_exactly(10));
  602. BOOST_ASIO_CHECK(bytes_transferred == 10);
  603. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  604. s.reset(read_data, sizeof(read_data));
  605. s.next_read_length(1);
  606. memset(read_buf, 0, sizeof(read_buf));
  607. bytes_transferred = boost::asio::read(s, buffers,
  608. boost::asio::transfer_exactly(10));
  609. BOOST_ASIO_CHECK(bytes_transferred == 10);
  610. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  611. s.reset(read_data, sizeof(read_data));
  612. s.next_read_length(10);
  613. memset(read_buf, 0, sizeof(read_buf));
  614. bytes_transferred = boost::asio::read(s, buffers,
  615. boost::asio::transfer_exactly(10));
  616. BOOST_ASIO_CHECK(bytes_transferred == 10);
  617. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  618. s.reset(read_data, sizeof(read_data));
  619. memset(read_buf, 0, sizeof(read_buf));
  620. bytes_transferred = boost::asio::read(s, buffers,
  621. boost::asio::transfer_exactly(42));
  622. BOOST_ASIO_CHECK(bytes_transferred == 42);
  623. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  624. s.reset(read_data, sizeof(read_data));
  625. s.next_read_length(1);
  626. memset(read_buf, 0, sizeof(read_buf));
  627. bytes_transferred = boost::asio::read(s, buffers,
  628. boost::asio::transfer_exactly(42));
  629. BOOST_ASIO_CHECK(bytes_transferred == 42);
  630. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  631. s.reset(read_data, sizeof(read_data));
  632. s.next_read_length(10);
  633. memset(read_buf, 0, sizeof(read_buf));
  634. bytes_transferred = boost::asio::read(s, buffers,
  635. boost::asio::transfer_exactly(42));
  636. BOOST_ASIO_CHECK(bytes_transferred == 42);
  637. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  638. s.reset(read_data, sizeof(read_data));
  639. memset(read_buf, 0, sizeof(read_buf));
  640. bytes_transferred = boost::asio::read(s, buffers, old_style_transfer_all);
  641. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  642. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  643. s.reset(read_data, sizeof(read_data));
  644. s.next_read_length(1);
  645. memset(read_buf, 0, sizeof(read_buf));
  646. bytes_transferred = boost::asio::read(s, buffers, old_style_transfer_all);
  647. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  648. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  649. s.reset(read_data, sizeof(read_data));
  650. s.next_read_length(10);
  651. memset(read_buf, 0, sizeof(read_buf));
  652. bytes_transferred = boost::asio::read(s, buffers, old_style_transfer_all);
  653. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  654. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  655. s.reset(read_data, sizeof(read_data));
  656. memset(read_buf, 0, sizeof(read_buf));
  657. bytes_transferred = boost::asio::read(s, buffers, short_transfer);
  658. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  659. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  660. s.reset(read_data, sizeof(read_data));
  661. s.next_read_length(1);
  662. memset(read_buf, 0, sizeof(read_buf));
  663. bytes_transferred = boost::asio::read(s, buffers, short_transfer);
  664. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  665. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  666. s.reset(read_data, sizeof(read_data));
  667. s.next_read_length(10);
  668. memset(read_buf, 0, sizeof(read_buf));
  669. bytes_transferred = boost::asio::read(s, buffers, short_transfer);
  670. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  671. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  672. }
  673. void test_3_arg_streambuf_read()
  674. {
  675. boost::asio::io_service ios;
  676. test_stream s(ios);
  677. boost::asio::streambuf sb(sizeof(read_data));
  678. s.reset(read_data, sizeof(read_data));
  679. sb.consume(sb.size());
  680. size_t bytes_transferred = boost::asio::read(s, sb,
  681. boost::asio::transfer_all());
  682. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  683. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  684. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  685. s.reset(read_data, sizeof(read_data));
  686. s.next_read_length(1);
  687. sb.consume(sb.size());
  688. bytes_transferred = boost::asio::read(s, sb,
  689. boost::asio::transfer_all());
  690. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  691. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  692. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  693. s.reset(read_data, sizeof(read_data));
  694. s.next_read_length(10);
  695. sb.consume(sb.size());
  696. bytes_transferred = boost::asio::read(s, sb,
  697. boost::asio::transfer_all());
  698. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  699. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  700. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  701. s.reset(read_data, sizeof(read_data));
  702. sb.consume(sb.size());
  703. bytes_transferred = boost::asio::read(s, sb,
  704. boost::asio::transfer_at_least(1));
  705. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  706. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  707. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  708. s.reset(read_data, sizeof(read_data));
  709. s.next_read_length(1);
  710. sb.consume(sb.size());
  711. bytes_transferred = boost::asio::read(s, sb,
  712. boost::asio::transfer_at_least(1));
  713. BOOST_ASIO_CHECK(bytes_transferred == 1);
  714. BOOST_ASIO_CHECK(sb.size() == 1);
  715. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  716. s.reset(read_data, sizeof(read_data));
  717. s.next_read_length(10);
  718. sb.consume(sb.size());
  719. bytes_transferred = boost::asio::read(s, sb,
  720. boost::asio::transfer_at_least(1));
  721. BOOST_ASIO_CHECK(bytes_transferred == 10);
  722. BOOST_ASIO_CHECK(sb.size() == 10);
  723. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  724. s.reset(read_data, sizeof(read_data));
  725. sb.consume(sb.size());
  726. bytes_transferred = boost::asio::read(s, sb,
  727. boost::asio::transfer_at_least(10));
  728. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  729. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  730. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  731. s.reset(read_data, sizeof(read_data));
  732. s.next_read_length(1);
  733. sb.consume(sb.size());
  734. bytes_transferred = boost::asio::read(s, sb,
  735. boost::asio::transfer_at_least(10));
  736. BOOST_ASIO_CHECK(bytes_transferred == 10);
  737. BOOST_ASIO_CHECK(sb.size() == 10);
  738. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  739. s.reset(read_data, sizeof(read_data));
  740. s.next_read_length(10);
  741. sb.consume(sb.size());
  742. bytes_transferred = boost::asio::read(s, sb,
  743. boost::asio::transfer_at_least(10));
  744. BOOST_ASIO_CHECK(bytes_transferred == 10);
  745. BOOST_ASIO_CHECK(sb.size() == 10);
  746. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  747. s.reset(read_data, sizeof(read_data));
  748. sb.consume(sb.size());
  749. bytes_transferred = boost::asio::read(s, sb,
  750. boost::asio::transfer_at_least(42));
  751. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  752. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  753. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  754. s.reset(read_data, sizeof(read_data));
  755. s.next_read_length(1);
  756. sb.consume(sb.size());
  757. bytes_transferred = boost::asio::read(s, sb,
  758. boost::asio::transfer_at_least(42));
  759. BOOST_ASIO_CHECK(bytes_transferred == 42);
  760. BOOST_ASIO_CHECK(sb.size() == 42);
  761. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  762. s.reset(read_data, sizeof(read_data));
  763. s.next_read_length(10);
  764. sb.consume(sb.size());
  765. bytes_transferred = boost::asio::read(s, sb,
  766. boost::asio::transfer_at_least(42));
  767. BOOST_ASIO_CHECK(bytes_transferred == 50);
  768. BOOST_ASIO_CHECK(sb.size() == 50);
  769. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 50));
  770. s.reset(read_data, sizeof(read_data));
  771. sb.consume(sb.size());
  772. bytes_transferred = boost::asio::read(s, sb,
  773. boost::asio::transfer_exactly(1));
  774. BOOST_ASIO_CHECK(bytes_transferred == 1);
  775. BOOST_ASIO_CHECK(sb.size() == 1);
  776. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  777. s.reset(read_data, sizeof(read_data));
  778. s.next_read_length(1);
  779. sb.consume(sb.size());
  780. bytes_transferred = boost::asio::read(s, sb,
  781. boost::asio::transfer_exactly(1));
  782. BOOST_ASIO_CHECK(bytes_transferred == 1);
  783. BOOST_ASIO_CHECK(sb.size() == 1);
  784. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  785. s.reset(read_data, sizeof(read_data));
  786. s.next_read_length(10);
  787. sb.consume(sb.size());
  788. bytes_transferred = boost::asio::read(s, sb,
  789. boost::asio::transfer_exactly(1));
  790. BOOST_ASIO_CHECK(bytes_transferred == 1);
  791. BOOST_ASIO_CHECK(sb.size() == 1);
  792. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  793. s.reset(read_data, sizeof(read_data));
  794. sb.consume(sb.size());
  795. bytes_transferred = boost::asio::read(s, sb,
  796. boost::asio::transfer_exactly(10));
  797. BOOST_ASIO_CHECK(bytes_transferred == 10);
  798. BOOST_ASIO_CHECK(sb.size() == 10);
  799. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  800. s.reset(read_data, sizeof(read_data));
  801. s.next_read_length(1);
  802. sb.consume(sb.size());
  803. bytes_transferred = boost::asio::read(s, sb,
  804. boost::asio::transfer_exactly(10));
  805. BOOST_ASIO_CHECK(bytes_transferred == 10);
  806. BOOST_ASIO_CHECK(sb.size() == 10);
  807. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  808. s.reset(read_data, sizeof(read_data));
  809. s.next_read_length(10);
  810. sb.consume(sb.size());
  811. bytes_transferred = boost::asio::read(s, sb,
  812. boost::asio::transfer_exactly(10));
  813. BOOST_ASIO_CHECK(bytes_transferred == 10);
  814. BOOST_ASIO_CHECK(sb.size() == 10);
  815. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  816. s.reset(read_data, sizeof(read_data));
  817. sb.consume(sb.size());
  818. bytes_transferred = boost::asio::read(s, sb,
  819. boost::asio::transfer_exactly(42));
  820. BOOST_ASIO_CHECK(bytes_transferred == 42);
  821. BOOST_ASIO_CHECK(sb.size() == 42);
  822. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  823. s.reset(read_data, sizeof(read_data));
  824. s.next_read_length(1);
  825. sb.consume(sb.size());
  826. bytes_transferred = boost::asio::read(s, sb,
  827. boost::asio::transfer_exactly(42));
  828. BOOST_ASIO_CHECK(bytes_transferred == 42);
  829. BOOST_ASIO_CHECK(sb.size() == 42);
  830. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  831. s.reset(read_data, sizeof(read_data));
  832. s.next_read_length(10);
  833. sb.consume(sb.size());
  834. bytes_transferred = boost::asio::read(s, sb,
  835. boost::asio::transfer_exactly(42));
  836. BOOST_ASIO_CHECK(bytes_transferred == 42);
  837. BOOST_ASIO_CHECK(sb.size() == 42);
  838. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  839. s.reset(read_data, sizeof(read_data));
  840. sb.consume(sb.size());
  841. bytes_transferred = boost::asio::read(s, sb, old_style_transfer_all);
  842. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  843. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  844. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  845. s.reset(read_data, sizeof(read_data));
  846. s.next_read_length(1);
  847. sb.consume(sb.size());
  848. bytes_transferred = boost::asio::read(s, sb, old_style_transfer_all);
  849. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  850. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  851. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  852. s.reset(read_data, sizeof(read_data));
  853. s.next_read_length(10);
  854. sb.consume(sb.size());
  855. bytes_transferred = boost::asio::read(s, sb, old_style_transfer_all);
  856. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  857. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  858. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  859. s.reset(read_data, sizeof(read_data));
  860. sb.consume(sb.size());
  861. bytes_transferred = boost::asio::read(s, sb, short_transfer);
  862. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  863. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  864. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  865. s.reset(read_data, sizeof(read_data));
  866. s.next_read_length(1);
  867. sb.consume(sb.size());
  868. bytes_transferred = boost::asio::read(s, sb, short_transfer);
  869. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  870. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  871. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  872. s.reset(read_data, sizeof(read_data));
  873. s.next_read_length(10);
  874. sb.consume(sb.size());
  875. bytes_transferred = boost::asio::read(s, sb, short_transfer);
  876. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  877. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  878. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  879. }
  880. void test_4_arg_mutable_buffers_1_read()
  881. {
  882. boost::asio::io_service ios;
  883. test_stream s(ios);
  884. char read_buf[sizeof(read_data)];
  885. boost::asio::mutable_buffers_1 buffers
  886. = boost::asio::buffer(read_buf, sizeof(read_buf));
  887. s.reset(read_data, sizeof(read_data));
  888. memset(read_buf, 0, sizeof(read_buf));
  889. boost::system::error_code error;
  890. size_t bytes_transferred = boost::asio::read(s, buffers,
  891. boost::asio::transfer_all(), error);
  892. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  893. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  894. BOOST_ASIO_CHECK(!error);
  895. s.reset(read_data, sizeof(read_data));
  896. s.next_read_length(1);
  897. memset(read_buf, 0, sizeof(read_buf));
  898. error = boost::system::error_code();
  899. bytes_transferred = boost::asio::read(s, buffers,
  900. boost::asio::transfer_all(), error);
  901. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  902. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  903. BOOST_ASIO_CHECK(!error);
  904. s.reset(read_data, sizeof(read_data));
  905. s.next_read_length(10);
  906. memset(read_buf, 0, sizeof(read_buf));
  907. error = boost::system::error_code();
  908. bytes_transferred = boost::asio::read(s, buffers,
  909. boost::asio::transfer_all(), error);
  910. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  911. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  912. BOOST_ASIO_CHECK(!error);
  913. s.reset(read_data, sizeof(read_data));
  914. memset(read_buf, 0, sizeof(read_buf));
  915. error = boost::system::error_code();
  916. bytes_transferred = boost::asio::read(s, buffers,
  917. boost::asio::transfer_at_least(1), error);
  918. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  919. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  920. BOOST_ASIO_CHECK(!error);
  921. s.reset(read_data, sizeof(read_data));
  922. s.next_read_length(1);
  923. memset(read_buf, 0, sizeof(read_buf));
  924. error = boost::system::error_code();
  925. bytes_transferred = boost::asio::read(s, buffers,
  926. boost::asio::transfer_at_least(1), error);
  927. BOOST_ASIO_CHECK(bytes_transferred == 1);
  928. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  929. BOOST_ASIO_CHECK(!error);
  930. s.reset(read_data, sizeof(read_data));
  931. s.next_read_length(10);
  932. memset(read_buf, 0, sizeof(read_buf));
  933. error = boost::system::error_code();
  934. bytes_transferred = boost::asio::read(s, buffers,
  935. boost::asio::transfer_at_least(1), error);
  936. BOOST_ASIO_CHECK(bytes_transferred == 10);
  937. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  938. BOOST_ASIO_CHECK(!error);
  939. s.reset(read_data, sizeof(read_data));
  940. memset(read_buf, 0, sizeof(read_buf));
  941. error = boost::system::error_code();
  942. bytes_transferred = boost::asio::read(s, buffers,
  943. boost::asio::transfer_at_least(10), error);
  944. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  945. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  946. BOOST_ASIO_CHECK(!error);
  947. s.reset(read_data, sizeof(read_data));
  948. s.next_read_length(1);
  949. memset(read_buf, 0, sizeof(read_buf));
  950. error = boost::system::error_code();
  951. bytes_transferred = boost::asio::read(s, buffers,
  952. boost::asio::transfer_at_least(10), error);
  953. BOOST_ASIO_CHECK(bytes_transferred == 10);
  954. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  955. BOOST_ASIO_CHECK(!error);
  956. s.reset(read_data, sizeof(read_data));
  957. s.next_read_length(10);
  958. memset(read_buf, 0, sizeof(read_buf));
  959. error = boost::system::error_code();
  960. bytes_transferred = boost::asio::read(s, buffers,
  961. boost::asio::transfer_at_least(10), error);
  962. BOOST_ASIO_CHECK(bytes_transferred == 10);
  963. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  964. BOOST_ASIO_CHECK(!error);
  965. s.reset(read_data, sizeof(read_data));
  966. memset(read_buf, 0, sizeof(read_buf));
  967. error = boost::system::error_code();
  968. bytes_transferred = boost::asio::read(s, buffers,
  969. boost::asio::transfer_at_least(42), error);
  970. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  971. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  972. BOOST_ASIO_CHECK(!error);
  973. s.reset(read_data, sizeof(read_data));
  974. s.next_read_length(1);
  975. memset(read_buf, 0, sizeof(read_buf));
  976. error = boost::system::error_code();
  977. bytes_transferred = boost::asio::read(s, buffers,
  978. boost::asio::transfer_at_least(42), error);
  979. BOOST_ASIO_CHECK(bytes_transferred == 42);
  980. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  981. BOOST_ASIO_CHECK(!error);
  982. s.reset(read_data, sizeof(read_data));
  983. s.next_read_length(10);
  984. memset(read_buf, 0, sizeof(read_buf));
  985. error = boost::system::error_code();
  986. bytes_transferred = boost::asio::read(s, buffers,
  987. boost::asio::transfer_at_least(42), error);
  988. BOOST_ASIO_CHECK(bytes_transferred == 50);
  989. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  990. BOOST_ASIO_CHECK(!error);
  991. s.reset(read_data, sizeof(read_data));
  992. memset(read_buf, 0, sizeof(read_buf));
  993. error = boost::system::error_code();
  994. bytes_transferred = boost::asio::read(s, buffers,
  995. boost::asio::transfer_exactly(1), error);
  996. BOOST_ASIO_CHECK(bytes_transferred == 1);
  997. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  998. BOOST_ASIO_CHECK(!error);
  999. s.reset(read_data, sizeof(read_data));
  1000. s.next_read_length(1);
  1001. memset(read_buf, 0, sizeof(read_buf));
  1002. error = boost::system::error_code();
  1003. bytes_transferred = boost::asio::read(s, buffers,
  1004. boost::asio::transfer_exactly(1), error);
  1005. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1006. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1007. BOOST_ASIO_CHECK(!error);
  1008. s.reset(read_data, sizeof(read_data));
  1009. s.next_read_length(10);
  1010. memset(read_buf, 0, sizeof(read_buf));
  1011. error = boost::system::error_code();
  1012. bytes_transferred = boost::asio::read(s, buffers,
  1013. boost::asio::transfer_exactly(1), error);
  1014. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1015. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1016. BOOST_ASIO_CHECK(!error);
  1017. s.reset(read_data, sizeof(read_data));
  1018. memset(read_buf, 0, sizeof(read_buf));
  1019. error = boost::system::error_code();
  1020. bytes_transferred = boost::asio::read(s, buffers,
  1021. boost::asio::transfer_exactly(10), error);
  1022. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1023. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1024. BOOST_ASIO_CHECK(!error);
  1025. s.reset(read_data, sizeof(read_data));
  1026. s.next_read_length(1);
  1027. memset(read_buf, 0, sizeof(read_buf));
  1028. error = boost::system::error_code();
  1029. bytes_transferred = boost::asio::read(s, buffers,
  1030. boost::asio::transfer_exactly(10), error);
  1031. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1032. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1033. BOOST_ASIO_CHECK(!error);
  1034. s.reset(read_data, sizeof(read_data));
  1035. s.next_read_length(10);
  1036. memset(read_buf, 0, sizeof(read_buf));
  1037. error = boost::system::error_code();
  1038. bytes_transferred = boost::asio::read(s, buffers,
  1039. boost::asio::transfer_exactly(10), error);
  1040. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1041. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1042. BOOST_ASIO_CHECK(!error);
  1043. s.reset(read_data, sizeof(read_data));
  1044. memset(read_buf, 0, sizeof(read_buf));
  1045. error = boost::system::error_code();
  1046. bytes_transferred = boost::asio::read(s, buffers,
  1047. boost::asio::transfer_exactly(42), error);
  1048. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1049. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1050. BOOST_ASIO_CHECK(!error);
  1051. s.reset(read_data, sizeof(read_data));
  1052. s.next_read_length(1);
  1053. memset(read_buf, 0, sizeof(read_buf));
  1054. error = boost::system::error_code();
  1055. bytes_transferred = boost::asio::read(s, buffers,
  1056. boost::asio::transfer_exactly(42), error);
  1057. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1058. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1059. BOOST_ASIO_CHECK(!error);
  1060. s.reset(read_data, sizeof(read_data));
  1061. s.next_read_length(10);
  1062. memset(read_buf, 0, sizeof(read_buf));
  1063. error = boost::system::error_code();
  1064. bytes_transferred = boost::asio::read(s, buffers,
  1065. boost::asio::transfer_exactly(42), error);
  1066. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1067. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1068. BOOST_ASIO_CHECK(!error);
  1069. s.reset(read_data, sizeof(read_data));
  1070. memset(read_buf, 0, sizeof(read_buf));
  1071. bytes_transferred = boost::asio::read(s, buffers,
  1072. old_style_transfer_all, error);
  1073. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1074. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1075. BOOST_ASIO_CHECK(!error);
  1076. s.reset(read_data, sizeof(read_data));
  1077. s.next_read_length(1);
  1078. memset(read_buf, 0, sizeof(read_buf));
  1079. error = boost::system::error_code();
  1080. bytes_transferred = boost::asio::read(s, buffers,
  1081. old_style_transfer_all, error);
  1082. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1083. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1084. BOOST_ASIO_CHECK(!error);
  1085. s.reset(read_data, sizeof(read_data));
  1086. s.next_read_length(10);
  1087. memset(read_buf, 0, sizeof(read_buf));
  1088. error = boost::system::error_code();
  1089. bytes_transferred = boost::asio::read(s, buffers,
  1090. old_style_transfer_all, error);
  1091. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1092. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1093. BOOST_ASIO_CHECK(!error);
  1094. s.reset(read_data, sizeof(read_data));
  1095. memset(read_buf, 0, sizeof(read_buf));
  1096. bytes_transferred = boost::asio::read(s, buffers, short_transfer, error);
  1097. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1098. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1099. BOOST_ASIO_CHECK(!error);
  1100. s.reset(read_data, sizeof(read_data));
  1101. s.next_read_length(1);
  1102. memset(read_buf, 0, sizeof(read_buf));
  1103. error = boost::system::error_code();
  1104. bytes_transferred = boost::asio::read(s, buffers, short_transfer, error);
  1105. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1106. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1107. BOOST_ASIO_CHECK(!error);
  1108. s.reset(read_data, sizeof(read_data));
  1109. s.next_read_length(10);
  1110. memset(read_buf, 0, sizeof(read_buf));
  1111. error = boost::system::error_code();
  1112. bytes_transferred = boost::asio::read(s, buffers, short_transfer, error);
  1113. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1114. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1115. BOOST_ASIO_CHECK(!error);
  1116. }
  1117. void test_4_arg_vector_buffers_read()
  1118. {
  1119. boost::asio::io_service ios;
  1120. test_stream s(ios);
  1121. char read_buf[sizeof(read_data)];
  1122. std::vector<boost::asio::mutable_buffer> buffers;
  1123. buffers.push_back(boost::asio::buffer(read_buf, 32));
  1124. buffers.push_back(boost::asio::buffer(read_buf) + 32);
  1125. s.reset(read_data, sizeof(read_data));
  1126. memset(read_buf, 0, sizeof(read_buf));
  1127. boost::system::error_code error;
  1128. size_t bytes_transferred = boost::asio::read(s, buffers,
  1129. boost::asio::transfer_all(), error);
  1130. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1131. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1132. BOOST_ASIO_CHECK(!error);
  1133. s.reset(read_data, sizeof(read_data));
  1134. s.next_read_length(1);
  1135. memset(read_buf, 0, sizeof(read_buf));
  1136. error = boost::system::error_code();
  1137. bytes_transferred = boost::asio::read(s, buffers,
  1138. boost::asio::transfer_all(), error);
  1139. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1140. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1141. BOOST_ASIO_CHECK(!error);
  1142. s.reset(read_data, sizeof(read_data));
  1143. s.next_read_length(10);
  1144. memset(read_buf, 0, sizeof(read_buf));
  1145. error = boost::system::error_code();
  1146. bytes_transferred = boost::asio::read(s, buffers,
  1147. boost::asio::transfer_all(), error);
  1148. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1149. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1150. BOOST_ASIO_CHECK(!error);
  1151. s.reset(read_data, sizeof(read_data));
  1152. memset(read_buf, 0, sizeof(read_buf));
  1153. error = boost::system::error_code();
  1154. bytes_transferred = boost::asio::read(s, buffers,
  1155. boost::asio::transfer_at_least(1), error);
  1156. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1157. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1158. BOOST_ASIO_CHECK(!error);
  1159. s.reset(read_data, sizeof(read_data));
  1160. s.next_read_length(1);
  1161. memset(read_buf, 0, sizeof(read_buf));
  1162. error = boost::system::error_code();
  1163. bytes_transferred = boost::asio::read(s, buffers,
  1164. boost::asio::transfer_at_least(1), error);
  1165. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1166. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1167. BOOST_ASIO_CHECK(!error);
  1168. s.reset(read_data, sizeof(read_data));
  1169. s.next_read_length(10);
  1170. memset(read_buf, 0, sizeof(read_buf));
  1171. error = boost::system::error_code();
  1172. bytes_transferred = boost::asio::read(s, buffers,
  1173. boost::asio::transfer_at_least(1), error);
  1174. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1175. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1176. BOOST_ASIO_CHECK(!error);
  1177. s.reset(read_data, sizeof(read_data));
  1178. memset(read_buf, 0, sizeof(read_buf));
  1179. error = boost::system::error_code();
  1180. bytes_transferred = boost::asio::read(s, buffers,
  1181. boost::asio::transfer_at_least(10), error);
  1182. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1183. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1184. BOOST_ASIO_CHECK(!error);
  1185. s.reset(read_data, sizeof(read_data));
  1186. s.next_read_length(1);
  1187. memset(read_buf, 0, sizeof(read_buf));
  1188. error = boost::system::error_code();
  1189. bytes_transferred = boost::asio::read(s, buffers,
  1190. boost::asio::transfer_at_least(10), error);
  1191. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1192. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1193. BOOST_ASIO_CHECK(!error);
  1194. s.reset(read_data, sizeof(read_data));
  1195. s.next_read_length(10);
  1196. memset(read_buf, 0, sizeof(read_buf));
  1197. error = boost::system::error_code();
  1198. bytes_transferred = boost::asio::read(s, buffers,
  1199. boost::asio::transfer_at_least(10), error);
  1200. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1201. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1202. BOOST_ASIO_CHECK(!error);
  1203. s.reset(read_data, sizeof(read_data));
  1204. memset(read_buf, 0, sizeof(read_buf));
  1205. error = boost::system::error_code();
  1206. bytes_transferred = boost::asio::read(s, buffers,
  1207. boost::asio::transfer_at_least(42), error);
  1208. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1209. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1210. BOOST_ASIO_CHECK(!error);
  1211. s.reset(read_data, sizeof(read_data));
  1212. s.next_read_length(1);
  1213. memset(read_buf, 0, sizeof(read_buf));
  1214. error = boost::system::error_code();
  1215. bytes_transferred = boost::asio::read(s, buffers,
  1216. boost::asio::transfer_at_least(42), error);
  1217. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1218. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1219. BOOST_ASIO_CHECK(!error);
  1220. s.reset(read_data, sizeof(read_data));
  1221. s.next_read_length(10);
  1222. memset(read_buf, 0, sizeof(read_buf));
  1223. error = boost::system::error_code();
  1224. bytes_transferred = boost::asio::read(s, buffers,
  1225. boost::asio::transfer_at_least(42), error);
  1226. BOOST_ASIO_CHECK(bytes_transferred == 50);
  1227. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  1228. BOOST_ASIO_CHECK(!error);
  1229. s.reset(read_data, sizeof(read_data));
  1230. memset(read_buf, 0, sizeof(read_buf));
  1231. error = boost::system::error_code();
  1232. bytes_transferred = boost::asio::read(s, buffers,
  1233. boost::asio::transfer_exactly(1), error);
  1234. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1235. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1236. BOOST_ASIO_CHECK(!error);
  1237. s.reset(read_data, sizeof(read_data));
  1238. s.next_read_length(1);
  1239. memset(read_buf, 0, sizeof(read_buf));
  1240. error = boost::system::error_code();
  1241. bytes_transferred = boost::asio::read(s, buffers,
  1242. boost::asio::transfer_exactly(1), error);
  1243. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1244. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1245. BOOST_ASIO_CHECK(!error);
  1246. s.reset(read_data, sizeof(read_data));
  1247. s.next_read_length(10);
  1248. memset(read_buf, 0, sizeof(read_buf));
  1249. error = boost::system::error_code();
  1250. bytes_transferred = boost::asio::read(s, buffers,
  1251. boost::asio::transfer_exactly(1), error);
  1252. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1253. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1254. BOOST_ASIO_CHECK(!error);
  1255. s.reset(read_data, sizeof(read_data));
  1256. memset(read_buf, 0, sizeof(read_buf));
  1257. error = boost::system::error_code();
  1258. bytes_transferred = boost::asio::read(s, buffers,
  1259. boost::asio::transfer_exactly(10), error);
  1260. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1261. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1262. BOOST_ASIO_CHECK(!error);
  1263. s.reset(read_data, sizeof(read_data));
  1264. s.next_read_length(1);
  1265. memset(read_buf, 0, sizeof(read_buf));
  1266. error = boost::system::error_code();
  1267. bytes_transferred = boost::asio::read(s, buffers,
  1268. boost::asio::transfer_exactly(10), error);
  1269. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1270. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1271. BOOST_ASIO_CHECK(!error);
  1272. s.reset(read_data, sizeof(read_data));
  1273. s.next_read_length(10);
  1274. memset(read_buf, 0, sizeof(read_buf));
  1275. error = boost::system::error_code();
  1276. bytes_transferred = boost::asio::read(s, buffers,
  1277. boost::asio::transfer_exactly(10), error);
  1278. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1279. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1280. BOOST_ASIO_CHECK(!error);
  1281. s.reset(read_data, sizeof(read_data));
  1282. memset(read_buf, 0, sizeof(read_buf));
  1283. error = boost::system::error_code();
  1284. bytes_transferred = boost::asio::read(s, buffers,
  1285. boost::asio::transfer_exactly(42), error);
  1286. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1287. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1288. BOOST_ASIO_CHECK(!error);
  1289. s.reset(read_data, sizeof(read_data));
  1290. s.next_read_length(1);
  1291. memset(read_buf, 0, sizeof(read_buf));
  1292. error = boost::system::error_code();
  1293. bytes_transferred = boost::asio::read(s, buffers,
  1294. boost::asio::transfer_exactly(42), error);
  1295. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1296. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1297. BOOST_ASIO_CHECK(!error);
  1298. s.reset(read_data, sizeof(read_data));
  1299. s.next_read_length(10);
  1300. memset(read_buf, 0, sizeof(read_buf));
  1301. error = boost::system::error_code();
  1302. bytes_transferred = boost::asio::read(s, buffers,
  1303. boost::asio::transfer_exactly(42), error);
  1304. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1305. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1306. BOOST_ASIO_CHECK(!error);
  1307. s.reset(read_data, sizeof(read_data));
  1308. memset(read_buf, 0, sizeof(read_buf));
  1309. bytes_transferred = boost::asio::read(s, buffers,
  1310. old_style_transfer_all, error);
  1311. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1312. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1313. BOOST_ASIO_CHECK(!error);
  1314. s.reset(read_data, sizeof(read_data));
  1315. s.next_read_length(1);
  1316. memset(read_buf, 0, sizeof(read_buf));
  1317. error = boost::system::error_code();
  1318. bytes_transferred = boost::asio::read(s, buffers,
  1319. old_style_transfer_all, error);
  1320. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1321. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1322. BOOST_ASIO_CHECK(!error);
  1323. s.reset(read_data, sizeof(read_data));
  1324. s.next_read_length(10);
  1325. memset(read_buf, 0, sizeof(read_buf));
  1326. error = boost::system::error_code();
  1327. bytes_transferred = boost::asio::read(s, buffers,
  1328. old_style_transfer_all, error);
  1329. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1330. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1331. BOOST_ASIO_CHECK(!error);
  1332. s.reset(read_data, sizeof(read_data));
  1333. memset(read_buf, 0, sizeof(read_buf));
  1334. bytes_transferred = boost::asio::read(s, buffers, short_transfer, error);
  1335. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1336. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1337. BOOST_ASIO_CHECK(!error);
  1338. s.reset(read_data, sizeof(read_data));
  1339. s.next_read_length(1);
  1340. memset(read_buf, 0, sizeof(read_buf));
  1341. error = boost::system::error_code();
  1342. bytes_transferred = boost::asio::read(s, buffers, short_transfer, error);
  1343. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1344. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1345. BOOST_ASIO_CHECK(!error);
  1346. s.reset(read_data, sizeof(read_data));
  1347. s.next_read_length(10);
  1348. memset(read_buf, 0, sizeof(read_buf));
  1349. error = boost::system::error_code();
  1350. bytes_transferred = boost::asio::read(s, buffers, short_transfer, error);
  1351. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1352. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1353. BOOST_ASIO_CHECK(!error);
  1354. }
  1355. void test_4_arg_streambuf_read()
  1356. {
  1357. boost::asio::io_service ios;
  1358. test_stream s(ios);
  1359. boost::asio::streambuf sb(sizeof(read_data));
  1360. s.reset(read_data, sizeof(read_data));
  1361. sb.consume(sb.size());
  1362. boost::system::error_code error;
  1363. size_t bytes_transferred = boost::asio::read(s, sb,
  1364. boost::asio::transfer_all(), error);
  1365. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1366. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1367. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1368. BOOST_ASIO_CHECK(!error);
  1369. s.reset(read_data, sizeof(read_data));
  1370. s.next_read_length(1);
  1371. sb.consume(sb.size());
  1372. error = boost::system::error_code();
  1373. bytes_transferred = boost::asio::read(s, sb,
  1374. boost::asio::transfer_all(), error);
  1375. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1376. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1377. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1378. BOOST_ASIO_CHECK(!error);
  1379. s.reset(read_data, sizeof(read_data));
  1380. s.next_read_length(10);
  1381. sb.consume(sb.size());
  1382. error = boost::system::error_code();
  1383. bytes_transferred = boost::asio::read(s, sb,
  1384. boost::asio::transfer_all(), error);
  1385. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1386. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1387. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1388. BOOST_ASIO_CHECK(!error);
  1389. s.reset(read_data, sizeof(read_data));
  1390. sb.consume(sb.size());
  1391. error = boost::system::error_code();
  1392. bytes_transferred = boost::asio::read(s, sb,
  1393. boost::asio::transfer_at_least(1), error);
  1394. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1395. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1396. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1397. BOOST_ASIO_CHECK(!error);
  1398. s.reset(read_data, sizeof(read_data));
  1399. s.next_read_length(1);
  1400. sb.consume(sb.size());
  1401. error = boost::system::error_code();
  1402. bytes_transferred = boost::asio::read(s, sb,
  1403. boost::asio::transfer_at_least(1), error);
  1404. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1405. BOOST_ASIO_CHECK(sb.size() == 1);
  1406. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  1407. BOOST_ASIO_CHECK(!error);
  1408. s.reset(read_data, sizeof(read_data));
  1409. s.next_read_length(10);
  1410. sb.consume(sb.size());
  1411. error = boost::system::error_code();
  1412. bytes_transferred = boost::asio::read(s, sb,
  1413. boost::asio::transfer_at_least(1), error);
  1414. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1415. BOOST_ASIO_CHECK(sb.size() == 10);
  1416. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  1417. BOOST_ASIO_CHECK(!error);
  1418. s.reset(read_data, sizeof(read_data));
  1419. sb.consume(sb.size());
  1420. error = boost::system::error_code();
  1421. bytes_transferred = boost::asio::read(s, sb,
  1422. boost::asio::transfer_at_least(10), error);
  1423. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1424. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1425. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1426. BOOST_ASIO_CHECK(!error);
  1427. s.reset(read_data, sizeof(read_data));
  1428. s.next_read_length(1);
  1429. sb.consume(sb.size());
  1430. error = boost::system::error_code();
  1431. bytes_transferred = boost::asio::read(s, sb,
  1432. boost::asio::transfer_at_least(10), error);
  1433. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1434. BOOST_ASIO_CHECK(sb.size() == 10);
  1435. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  1436. BOOST_ASIO_CHECK(!error);
  1437. s.reset(read_data, sizeof(read_data));
  1438. s.next_read_length(10);
  1439. sb.consume(sb.size());
  1440. error = boost::system::error_code();
  1441. bytes_transferred = boost::asio::read(s, sb,
  1442. boost::asio::transfer_at_least(10), error);
  1443. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1444. BOOST_ASIO_CHECK(sb.size() == 10);
  1445. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  1446. BOOST_ASIO_CHECK(!error);
  1447. s.reset(read_data, sizeof(read_data));
  1448. sb.consume(sb.size());
  1449. error = boost::system::error_code();
  1450. bytes_transferred = boost::asio::read(s, sb,
  1451. boost::asio::transfer_at_least(42), error);
  1452. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1453. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1454. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1455. BOOST_ASIO_CHECK(!error);
  1456. s.reset(read_data, sizeof(read_data));
  1457. s.next_read_length(1);
  1458. sb.consume(sb.size());
  1459. error = boost::system::error_code();
  1460. bytes_transferred = boost::asio::read(s, sb,
  1461. boost::asio::transfer_at_least(42), error);
  1462. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1463. BOOST_ASIO_CHECK(sb.size() == 42);
  1464. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  1465. BOOST_ASIO_CHECK(!error);
  1466. s.reset(read_data, sizeof(read_data));
  1467. s.next_read_length(10);
  1468. sb.consume(sb.size());
  1469. error = boost::system::error_code();
  1470. bytes_transferred = boost::asio::read(s, sb,
  1471. boost::asio::transfer_at_least(42), error);
  1472. BOOST_ASIO_CHECK(bytes_transferred == 50);
  1473. BOOST_ASIO_CHECK(sb.size() == 50);
  1474. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 50));
  1475. BOOST_ASIO_CHECK(!error);
  1476. s.reset(read_data, sizeof(read_data));
  1477. sb.consume(sb.size());
  1478. error = boost::system::error_code();
  1479. bytes_transferred = boost::asio::read(s, sb,
  1480. boost::asio::transfer_exactly(1), error);
  1481. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1482. BOOST_ASIO_CHECK(sb.size() == 1);
  1483. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  1484. BOOST_ASIO_CHECK(!error);
  1485. s.reset(read_data, sizeof(read_data));
  1486. s.next_read_length(1);
  1487. sb.consume(sb.size());
  1488. error = boost::system::error_code();
  1489. bytes_transferred = boost::asio::read(s, sb,
  1490. boost::asio::transfer_exactly(1), error);
  1491. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1492. BOOST_ASIO_CHECK(sb.size() == 1);
  1493. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  1494. BOOST_ASIO_CHECK(!error);
  1495. s.reset(read_data, sizeof(read_data));
  1496. s.next_read_length(10);
  1497. sb.consume(sb.size());
  1498. error = boost::system::error_code();
  1499. bytes_transferred = boost::asio::read(s, sb,
  1500. boost::asio::transfer_exactly(1), error);
  1501. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1502. BOOST_ASIO_CHECK(sb.size() == 1);
  1503. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  1504. BOOST_ASIO_CHECK(!error);
  1505. s.reset(read_data, sizeof(read_data));
  1506. sb.consume(sb.size());
  1507. error = boost::system::error_code();
  1508. bytes_transferred = boost::asio::read(s, sb,
  1509. boost::asio::transfer_exactly(10), error);
  1510. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1511. BOOST_ASIO_CHECK(sb.size() == 10);
  1512. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  1513. BOOST_ASIO_CHECK(!error);
  1514. s.reset(read_data, sizeof(read_data));
  1515. s.next_read_length(1);
  1516. sb.consume(sb.size());
  1517. error = boost::system::error_code();
  1518. bytes_transferred = boost::asio::read(s, sb,
  1519. boost::asio::transfer_exactly(10), error);
  1520. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1521. BOOST_ASIO_CHECK(sb.size() == 10);
  1522. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  1523. BOOST_ASIO_CHECK(!error);
  1524. s.reset(read_data, sizeof(read_data));
  1525. s.next_read_length(10);
  1526. sb.consume(sb.size());
  1527. error = boost::system::error_code();
  1528. bytes_transferred = boost::asio::read(s, sb,
  1529. boost::asio::transfer_exactly(10), error);
  1530. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1531. BOOST_ASIO_CHECK(sb.size() == 10);
  1532. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  1533. BOOST_ASIO_CHECK(!error);
  1534. s.reset(read_data, sizeof(read_data));
  1535. sb.consume(sb.size());
  1536. error = boost::system::error_code();
  1537. bytes_transferred = boost::asio::read(s, sb,
  1538. boost::asio::transfer_exactly(42), error);
  1539. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1540. BOOST_ASIO_CHECK(sb.size() == 42);
  1541. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  1542. BOOST_ASIO_CHECK(!error);
  1543. s.reset(read_data, sizeof(read_data));
  1544. s.next_read_length(1);
  1545. sb.consume(sb.size());
  1546. error = boost::system::error_code();
  1547. bytes_transferred = boost::asio::read(s, sb,
  1548. boost::asio::transfer_exactly(42), error);
  1549. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1550. BOOST_ASIO_CHECK(sb.size() == 42);
  1551. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  1552. BOOST_ASIO_CHECK(!error);
  1553. s.reset(read_data, sizeof(read_data));
  1554. s.next_read_length(10);
  1555. sb.consume(sb.size());
  1556. error = boost::system::error_code();
  1557. bytes_transferred = boost::asio::read(s, sb,
  1558. boost::asio::transfer_exactly(42), error);
  1559. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1560. BOOST_ASIO_CHECK(sb.size() == 42);
  1561. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  1562. BOOST_ASIO_CHECK(!error);
  1563. s.reset(read_data, sizeof(read_data));
  1564. sb.consume(sb.size());
  1565. bytes_transferred = boost::asio::read(s, sb,
  1566. old_style_transfer_all, error);
  1567. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1568. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1569. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1570. BOOST_ASIO_CHECK(!error);
  1571. s.reset(read_data, sizeof(read_data));
  1572. s.next_read_length(1);
  1573. sb.consume(sb.size());
  1574. error = boost::system::error_code();
  1575. bytes_transferred = boost::asio::read(s, sb,
  1576. old_style_transfer_all, error);
  1577. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1578. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1579. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1580. BOOST_ASIO_CHECK(!error);
  1581. s.reset(read_data, sizeof(read_data));
  1582. s.next_read_length(10);
  1583. sb.consume(sb.size());
  1584. error = boost::system::error_code();
  1585. bytes_transferred = boost::asio::read(s, sb,
  1586. old_style_transfer_all, error);
  1587. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1588. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1589. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1590. BOOST_ASIO_CHECK(!error);
  1591. s.reset(read_data, sizeof(read_data));
  1592. sb.consume(sb.size());
  1593. bytes_transferred = boost::asio::read(s, sb, short_transfer, error);
  1594. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1595. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1596. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1597. BOOST_ASIO_CHECK(!error);
  1598. s.reset(read_data, sizeof(read_data));
  1599. s.next_read_length(1);
  1600. sb.consume(sb.size());
  1601. error = boost::system::error_code();
  1602. bytes_transferred = boost::asio::read(s, sb, short_transfer, error);
  1603. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1604. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1605. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1606. BOOST_ASIO_CHECK(!error);
  1607. s.reset(read_data, sizeof(read_data));
  1608. s.next_read_length(10);
  1609. sb.consume(sb.size());
  1610. error = boost::system::error_code();
  1611. bytes_transferred = boost::asio::read(s, sb, short_transfer, error);
  1612. BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
  1613. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1614. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1615. BOOST_ASIO_CHECK(!error);
  1616. }
  1617. void async_read_handler(const boost::system::error_code& e,
  1618. size_t bytes_transferred, size_t expected_bytes_transferred, bool* called)
  1619. {
  1620. *called = true;
  1621. BOOST_ASIO_CHECK(!e);
  1622. BOOST_ASIO_CHECK(bytes_transferred == expected_bytes_transferred);
  1623. }
  1624. void test_3_arg_mutable_buffers_1_async_read()
  1625. {
  1626. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  1627. namespace bindns = boost;
  1628. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1629. namespace bindns = std;
  1630. using std::placeholders::_1;
  1631. using std::placeholders::_2;
  1632. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1633. boost::asio::io_service ios;
  1634. test_stream s(ios);
  1635. char read_buf[sizeof(read_data)];
  1636. boost::asio::mutable_buffers_1 buffers
  1637. = boost::asio::buffer(read_buf, sizeof(read_buf));
  1638. s.reset(read_data, sizeof(read_data));
  1639. memset(read_buf, 0, sizeof(read_buf));
  1640. bool called = false;
  1641. boost::asio::async_read(s, buffers,
  1642. bindns::bind(async_read_handler,
  1643. _1, _2, sizeof(read_data), &called));
  1644. ios.reset();
  1645. ios.run();
  1646. BOOST_ASIO_CHECK(called);
  1647. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1648. s.reset(read_data, sizeof(read_data));
  1649. s.next_read_length(1);
  1650. memset(read_buf, 0, sizeof(read_buf));
  1651. called = false;
  1652. boost::asio::async_read(s, buffers,
  1653. bindns::bind(async_read_handler,
  1654. _1, _2, sizeof(read_data), &called));
  1655. ios.reset();
  1656. ios.run();
  1657. BOOST_ASIO_CHECK(called);
  1658. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1659. s.reset(read_data, sizeof(read_data));
  1660. s.next_read_length(10);
  1661. memset(read_buf, 0, sizeof(read_buf));
  1662. called = false;
  1663. boost::asio::async_read(s, buffers,
  1664. bindns::bind(async_read_handler,
  1665. _1, _2, sizeof(read_data), &called));
  1666. ios.reset();
  1667. ios.run();
  1668. BOOST_ASIO_CHECK(called);
  1669. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1670. s.reset(read_data, sizeof(read_data));
  1671. memset(read_buf, 0, sizeof(read_buf));
  1672. int i = boost::asio::async_read(s, buffers, archetypes::lazy_handler());
  1673. BOOST_ASIO_CHECK(i == 42);
  1674. ios.reset();
  1675. ios.run();
  1676. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1677. }
  1678. void test_3_arg_boost_array_buffers_async_read()
  1679. {
  1680. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  1681. namespace bindns = boost;
  1682. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1683. namespace bindns = std;
  1684. using std::placeholders::_1;
  1685. using std::placeholders::_2;
  1686. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1687. #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  1688. boost::asio::io_service ios;
  1689. test_stream s(ios);
  1690. char read_buf[sizeof(read_data)];
  1691. boost::array<boost::asio::mutable_buffer, 2> buffers = { {
  1692. boost::asio::buffer(read_buf, 32),
  1693. boost::asio::buffer(read_buf) + 32 } };
  1694. s.reset(read_data, sizeof(read_data));
  1695. memset(read_buf, 0, sizeof(read_buf));
  1696. bool called = false;
  1697. boost::asio::async_read(s, buffers,
  1698. bindns::bind(async_read_handler,
  1699. _1, _2, sizeof(read_data), &called));
  1700. ios.reset();
  1701. ios.run();
  1702. BOOST_ASIO_CHECK(called);
  1703. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1704. s.reset(read_data, sizeof(read_data));
  1705. s.next_read_length(1);
  1706. memset(read_buf, 0, sizeof(read_buf));
  1707. called = false;
  1708. boost::asio::async_read(s, buffers,
  1709. bindns::bind(async_read_handler,
  1710. _1, _2, sizeof(read_data), &called));
  1711. ios.reset();
  1712. ios.run();
  1713. BOOST_ASIO_CHECK(called);
  1714. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1715. s.reset(read_data, sizeof(read_data));
  1716. s.next_read_length(10);
  1717. memset(read_buf, 0, sizeof(read_buf));
  1718. called = false;
  1719. boost::asio::async_read(s, buffers,
  1720. bindns::bind(async_read_handler,
  1721. _1, _2, sizeof(read_data), &called));
  1722. ios.reset();
  1723. ios.run();
  1724. BOOST_ASIO_CHECK(called);
  1725. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1726. s.reset(read_data, sizeof(read_data));
  1727. memset(read_buf, 0, sizeof(read_buf));
  1728. int i = boost::asio::async_read(s, buffers, archetypes::lazy_handler());
  1729. BOOST_ASIO_CHECK(i == 42);
  1730. ios.reset();
  1731. ios.run();
  1732. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1733. #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  1734. }
  1735. void test_3_arg_std_array_buffers_async_read()
  1736. {
  1737. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  1738. namespace bindns = boost;
  1739. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1740. namespace bindns = std;
  1741. using std::placeholders::_1;
  1742. using std::placeholders::_2;
  1743. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1744. #if defined(BOOST_ASIO_HAS_STD_ARRAY)
  1745. boost::asio::io_service ios;
  1746. test_stream s(ios);
  1747. char read_buf[sizeof(read_data)];
  1748. std::array<boost::asio::mutable_buffer, 2> buffers = { {
  1749. boost::asio::buffer(read_buf, 32),
  1750. boost::asio::buffer(read_buf) + 32 } };
  1751. s.reset(read_data, sizeof(read_data));
  1752. memset(read_buf, 0, sizeof(read_buf));
  1753. bool called = false;
  1754. boost::asio::async_read(s, buffers,
  1755. bindns::bind(async_read_handler,
  1756. _1, _2, sizeof(read_data), &called));
  1757. ios.reset();
  1758. ios.run();
  1759. BOOST_ASIO_CHECK(called);
  1760. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1761. s.reset(read_data, sizeof(read_data));
  1762. s.next_read_length(1);
  1763. memset(read_buf, 0, sizeof(read_buf));
  1764. called = false;
  1765. boost::asio::async_read(s, buffers,
  1766. bindns::bind(async_read_handler,
  1767. _1, _2, sizeof(read_data), &called));
  1768. ios.reset();
  1769. ios.run();
  1770. BOOST_ASIO_CHECK(called);
  1771. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1772. s.reset(read_data, sizeof(read_data));
  1773. s.next_read_length(10);
  1774. memset(read_buf, 0, sizeof(read_buf));
  1775. called = false;
  1776. boost::asio::async_read(s, buffers,
  1777. bindns::bind(async_read_handler,
  1778. _1, _2, sizeof(read_data), &called));
  1779. ios.reset();
  1780. ios.run();
  1781. BOOST_ASIO_CHECK(called);
  1782. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1783. s.reset(read_data, sizeof(read_data));
  1784. memset(read_buf, 0, sizeof(read_buf));
  1785. int i = boost::asio::async_read(s, buffers, archetypes::lazy_handler());
  1786. BOOST_ASIO_CHECK(i == 42);
  1787. ios.reset();
  1788. ios.run();
  1789. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1790. #endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
  1791. }
  1792. void test_3_arg_vector_buffers_async_read()
  1793. {
  1794. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  1795. namespace bindns = boost;
  1796. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1797. namespace bindns = std;
  1798. using std::placeholders::_1;
  1799. using std::placeholders::_2;
  1800. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1801. boost::asio::io_service ios;
  1802. test_stream s(ios);
  1803. char read_buf[sizeof(read_data)];
  1804. std::vector<boost::asio::mutable_buffer> buffers;
  1805. buffers.push_back(boost::asio::buffer(read_buf, 32));
  1806. buffers.push_back(boost::asio::buffer(read_buf) + 32);
  1807. s.reset(read_data, sizeof(read_data));
  1808. memset(read_buf, 0, sizeof(read_buf));
  1809. bool called = false;
  1810. boost::asio::async_read(s, buffers,
  1811. bindns::bind(async_read_handler,
  1812. _1, _2, sizeof(read_data), &called));
  1813. ios.reset();
  1814. ios.run();
  1815. BOOST_ASIO_CHECK(called);
  1816. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1817. s.reset(read_data, sizeof(read_data));
  1818. s.next_read_length(1);
  1819. memset(read_buf, 0, sizeof(read_buf));
  1820. called = false;
  1821. boost::asio::async_read(s, buffers,
  1822. bindns::bind(async_read_handler,
  1823. _1, _2, sizeof(read_data), &called));
  1824. ios.reset();
  1825. ios.run();
  1826. BOOST_ASIO_CHECK(called);
  1827. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1828. s.reset(read_data, sizeof(read_data));
  1829. s.next_read_length(10);
  1830. memset(read_buf, 0, sizeof(read_buf));
  1831. called = false;
  1832. boost::asio::async_read(s, buffers,
  1833. bindns::bind(async_read_handler,
  1834. _1, _2, sizeof(read_data), &called));
  1835. ios.reset();
  1836. ios.run();
  1837. BOOST_ASIO_CHECK(called);
  1838. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1839. s.reset(read_data, sizeof(read_data));
  1840. memset(read_buf, 0, sizeof(read_buf));
  1841. int i = boost::asio::async_read(s, buffers, archetypes::lazy_handler());
  1842. BOOST_ASIO_CHECK(i == 42);
  1843. ios.reset();
  1844. ios.run();
  1845. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1846. }
  1847. void test_3_arg_streambuf_async_read()
  1848. {
  1849. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  1850. namespace bindns = boost;
  1851. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1852. namespace bindns = std;
  1853. using std::placeholders::_1;
  1854. using std::placeholders::_2;
  1855. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1856. boost::asio::io_service ios;
  1857. test_stream s(ios);
  1858. boost::asio::streambuf sb(sizeof(read_data));
  1859. s.reset(read_data, sizeof(read_data));
  1860. sb.consume(sb.size());
  1861. bool called = false;
  1862. boost::asio::async_read(s, sb,
  1863. bindns::bind(async_read_handler,
  1864. _1, _2, sizeof(read_data), &called));
  1865. ios.reset();
  1866. ios.run();
  1867. BOOST_ASIO_CHECK(called);
  1868. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1869. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1870. s.reset(read_data, sizeof(read_data));
  1871. s.next_read_length(1);
  1872. sb.consume(sb.size());
  1873. called = false;
  1874. boost::asio::async_read(s, sb,
  1875. bindns::bind(async_read_handler,
  1876. _1, _2, sizeof(read_data), &called));
  1877. ios.reset();
  1878. ios.run();
  1879. BOOST_ASIO_CHECK(called);
  1880. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1881. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1882. s.reset(read_data, sizeof(read_data));
  1883. s.next_read_length(10);
  1884. sb.consume(sb.size());
  1885. called = false;
  1886. boost::asio::async_read(s, sb,
  1887. bindns::bind(async_read_handler,
  1888. _1, _2, sizeof(read_data), &called));
  1889. ios.reset();
  1890. ios.run();
  1891. BOOST_ASIO_CHECK(called);
  1892. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1893. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1894. s.reset(read_data, sizeof(read_data));
  1895. sb.consume(sb.size());
  1896. int i = boost::asio::async_read(s, sb, archetypes::lazy_handler());
  1897. BOOST_ASIO_CHECK(i == 42);
  1898. ios.reset();
  1899. ios.run();
  1900. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  1901. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  1902. }
  1903. void test_4_arg_mutable_buffers_1_async_read()
  1904. {
  1905. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  1906. namespace bindns = boost;
  1907. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1908. namespace bindns = std;
  1909. using std::placeholders::_1;
  1910. using std::placeholders::_2;
  1911. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  1912. boost::asio::io_service ios;
  1913. test_stream s(ios);
  1914. char read_buf[sizeof(read_data)];
  1915. boost::asio::mutable_buffers_1 buffers
  1916. = boost::asio::buffer(read_buf, sizeof(read_buf));
  1917. s.reset(read_data, sizeof(read_data));
  1918. memset(read_buf, 0, sizeof(read_buf));
  1919. bool called = false;
  1920. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  1921. bindns::bind(async_read_handler,
  1922. _1, _2, sizeof(read_data), &called));
  1923. ios.reset();
  1924. ios.run();
  1925. BOOST_ASIO_CHECK(called);
  1926. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1927. s.reset(read_data, sizeof(read_data));
  1928. s.next_read_length(1);
  1929. memset(read_buf, 0, sizeof(read_buf));
  1930. called = false;
  1931. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  1932. bindns::bind(async_read_handler,
  1933. _1, _2, sizeof(read_data), &called));
  1934. ios.reset();
  1935. ios.run();
  1936. BOOST_ASIO_CHECK(called);
  1937. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1938. s.reset(read_data, sizeof(read_data));
  1939. s.next_read_length(10);
  1940. memset(read_buf, 0, sizeof(read_buf));
  1941. called = false;
  1942. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  1943. bindns::bind(async_read_handler,
  1944. _1, _2, sizeof(read_data), &called));
  1945. ios.reset();
  1946. ios.run();
  1947. BOOST_ASIO_CHECK(called);
  1948. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1949. s.reset(read_data, sizeof(read_data));
  1950. memset(read_buf, 0, sizeof(read_buf));
  1951. called = false;
  1952. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  1953. bindns::bind(async_read_handler,
  1954. _1, _2, sizeof(read_data), &called));
  1955. ios.reset();
  1956. ios.run();
  1957. BOOST_ASIO_CHECK(called);
  1958. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1959. s.reset(read_data, sizeof(read_data));
  1960. s.next_read_length(1);
  1961. memset(read_buf, 0, sizeof(read_buf));
  1962. called = false;
  1963. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  1964. bindns::bind(async_read_handler,
  1965. _1, _2, 1, &called));
  1966. ios.reset();
  1967. ios.run();
  1968. BOOST_ASIO_CHECK(called);
  1969. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1970. s.reset(read_data, sizeof(read_data));
  1971. s.next_read_length(10);
  1972. memset(read_buf, 0, sizeof(read_buf));
  1973. called = false;
  1974. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  1975. bindns::bind(async_read_handler,
  1976. _1, _2, 10, &called));
  1977. ios.reset();
  1978. ios.run();
  1979. BOOST_ASIO_CHECK(called);
  1980. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1981. s.reset(read_data, sizeof(read_data));
  1982. memset(read_buf, 0, sizeof(read_buf));
  1983. called = false;
  1984. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  1985. bindns::bind(async_read_handler,
  1986. _1, _2, sizeof(read_data), &called));
  1987. ios.reset();
  1988. ios.run();
  1989. BOOST_ASIO_CHECK(called);
  1990. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  1991. s.reset(read_data, sizeof(read_data));
  1992. s.next_read_length(1);
  1993. memset(read_buf, 0, sizeof(read_buf));
  1994. called = false;
  1995. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  1996. bindns::bind(async_read_handler,
  1997. _1, _2, 10, &called));
  1998. ios.reset();
  1999. ios.run();
  2000. BOOST_ASIO_CHECK(called);
  2001. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2002. s.reset(read_data, sizeof(read_data));
  2003. s.next_read_length(10);
  2004. memset(read_buf, 0, sizeof(read_buf));
  2005. called = false;
  2006. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2007. bindns::bind(async_read_handler,
  2008. _1, _2, 10, &called));
  2009. ios.reset();
  2010. ios.run();
  2011. BOOST_ASIO_CHECK(called);
  2012. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2013. s.reset(read_data, sizeof(read_data));
  2014. memset(read_buf, 0, sizeof(read_buf));
  2015. called = false;
  2016. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2017. bindns::bind(async_read_handler,
  2018. _1, _2, sizeof(read_data), &called));
  2019. ios.reset();
  2020. ios.run();
  2021. BOOST_ASIO_CHECK(called);
  2022. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2023. s.reset(read_data, sizeof(read_data));
  2024. s.next_read_length(1);
  2025. memset(read_buf, 0, sizeof(read_buf));
  2026. called = false;
  2027. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2028. bindns::bind(async_read_handler,
  2029. _1, _2, 42, &called));
  2030. ios.reset();
  2031. ios.run();
  2032. BOOST_ASIO_CHECK(called);
  2033. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2034. s.reset(read_data, sizeof(read_data));
  2035. s.next_read_length(10);
  2036. memset(read_buf, 0, sizeof(read_buf));
  2037. called = false;
  2038. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2039. bindns::bind(async_read_handler,
  2040. _1, _2, 50, &called));
  2041. ios.reset();
  2042. ios.run();
  2043. BOOST_ASIO_CHECK(called);
  2044. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  2045. s.reset(read_data, sizeof(read_data));
  2046. memset(read_buf, 0, sizeof(read_buf));
  2047. called = false;
  2048. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2049. bindns::bind(async_read_handler,
  2050. _1, _2, 1, &called));
  2051. ios.reset();
  2052. ios.run();
  2053. BOOST_ASIO_CHECK(called);
  2054. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2055. s.reset(read_data, sizeof(read_data));
  2056. s.next_read_length(1);
  2057. memset(read_buf, 0, sizeof(read_buf));
  2058. called = false;
  2059. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2060. bindns::bind(async_read_handler,
  2061. _1, _2, 1, &called));
  2062. ios.reset();
  2063. ios.run();
  2064. BOOST_ASIO_CHECK(called);
  2065. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2066. s.reset(read_data, sizeof(read_data));
  2067. s.next_read_length(10);
  2068. memset(read_buf, 0, sizeof(read_buf));
  2069. called = false;
  2070. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2071. bindns::bind(async_read_handler,
  2072. _1, _2, 1, &called));
  2073. ios.reset();
  2074. ios.run();
  2075. BOOST_ASIO_CHECK(called);
  2076. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2077. s.reset(read_data, sizeof(read_data));
  2078. memset(read_buf, 0, sizeof(read_buf));
  2079. called = false;
  2080. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2081. bindns::bind(async_read_handler,
  2082. _1, _2, 10, &called));
  2083. ios.reset();
  2084. ios.run();
  2085. BOOST_ASIO_CHECK(called);
  2086. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2087. s.reset(read_data, sizeof(read_data));
  2088. s.next_read_length(1);
  2089. memset(read_buf, 0, sizeof(read_buf));
  2090. called = false;
  2091. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2092. bindns::bind(async_read_handler,
  2093. _1, _2, 10, &called));
  2094. ios.reset();
  2095. ios.run();
  2096. BOOST_ASIO_CHECK(called);
  2097. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2098. s.reset(read_data, sizeof(read_data));
  2099. s.next_read_length(10);
  2100. memset(read_buf, 0, sizeof(read_buf));
  2101. called = false;
  2102. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2103. bindns::bind(async_read_handler,
  2104. _1, _2, 10, &called));
  2105. ios.reset();
  2106. ios.run();
  2107. BOOST_ASIO_CHECK(called);
  2108. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2109. s.reset(read_data, sizeof(read_data));
  2110. memset(read_buf, 0, sizeof(read_buf));
  2111. called = false;
  2112. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2113. bindns::bind(async_read_handler,
  2114. _1, _2, 42, &called));
  2115. ios.reset();
  2116. ios.run();
  2117. BOOST_ASIO_CHECK(called);
  2118. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2119. s.reset(read_data, sizeof(read_data));
  2120. s.next_read_length(1);
  2121. memset(read_buf, 0, sizeof(read_buf));
  2122. called = false;
  2123. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2124. bindns::bind(async_read_handler,
  2125. _1, _2, 42, &called));
  2126. ios.reset();
  2127. ios.run();
  2128. BOOST_ASIO_CHECK(called);
  2129. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2130. s.reset(read_data, sizeof(read_data));
  2131. s.next_read_length(10);
  2132. memset(read_buf, 0, sizeof(read_buf));
  2133. called = false;
  2134. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2135. bindns::bind(async_read_handler,
  2136. _1, _2, 42, &called));
  2137. ios.reset();
  2138. ios.run();
  2139. BOOST_ASIO_CHECK(called);
  2140. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2141. s.reset(read_data, sizeof(read_data));
  2142. memset(read_buf, 0, sizeof(read_buf));
  2143. called = false;
  2144. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2145. bindns::bind(async_read_handler,
  2146. _1, _2, sizeof(read_data), &called));
  2147. ios.reset();
  2148. ios.run();
  2149. BOOST_ASIO_CHECK(called);
  2150. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2151. s.reset(read_data, sizeof(read_data));
  2152. s.next_read_length(1);
  2153. memset(read_buf, 0, sizeof(read_buf));
  2154. called = false;
  2155. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2156. bindns::bind(async_read_handler,
  2157. _1, _2, sizeof(read_data), &called));
  2158. ios.reset();
  2159. ios.run();
  2160. BOOST_ASIO_CHECK(called);
  2161. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2162. s.reset(read_data, sizeof(read_data));
  2163. s.next_read_length(10);
  2164. memset(read_buf, 0, sizeof(read_buf));
  2165. called = false;
  2166. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2167. bindns::bind(async_read_handler,
  2168. _1, _2, sizeof(read_data), &called));
  2169. ios.reset();
  2170. ios.run();
  2171. BOOST_ASIO_CHECK(called);
  2172. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2173. s.reset(read_data, sizeof(read_data));
  2174. memset(read_buf, 0, sizeof(read_buf));
  2175. called = false;
  2176. boost::asio::async_read(s, buffers, short_transfer,
  2177. bindns::bind(async_read_handler,
  2178. _1, _2, sizeof(read_data), &called));
  2179. ios.reset();
  2180. ios.run();
  2181. BOOST_ASIO_CHECK(called);
  2182. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2183. s.reset(read_data, sizeof(read_data));
  2184. s.next_read_length(1);
  2185. memset(read_buf, 0, sizeof(read_buf));
  2186. called = false;
  2187. boost::asio::async_read(s, buffers, short_transfer,
  2188. bindns::bind(async_read_handler,
  2189. _1, _2, sizeof(read_data), &called));
  2190. ios.reset();
  2191. ios.run();
  2192. BOOST_ASIO_CHECK(called);
  2193. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2194. s.reset(read_data, sizeof(read_data));
  2195. s.next_read_length(10);
  2196. memset(read_buf, 0, sizeof(read_buf));
  2197. called = false;
  2198. boost::asio::async_read(s, buffers, short_transfer,
  2199. bindns::bind(async_read_handler,
  2200. _1, _2, sizeof(read_data), &called));
  2201. ios.reset();
  2202. ios.run();
  2203. BOOST_ASIO_CHECK(called);
  2204. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2205. s.reset(read_data, sizeof(read_data));
  2206. memset(read_buf, 0, sizeof(read_buf));
  2207. int i = boost::asio::async_read(s, buffers,
  2208. short_transfer, archetypes::lazy_handler());
  2209. BOOST_ASIO_CHECK(i == 42);
  2210. ios.reset();
  2211. ios.run();
  2212. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2213. }
  2214. void test_4_arg_boost_array_buffers_async_read()
  2215. {
  2216. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  2217. namespace bindns = boost;
  2218. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  2219. namespace bindns = std;
  2220. using std::placeholders::_1;
  2221. using std::placeholders::_2;
  2222. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  2223. #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  2224. boost::asio::io_service ios;
  2225. test_stream s(ios);
  2226. char read_buf[sizeof(read_data)];
  2227. boost::array<boost::asio::mutable_buffer, 2> buffers = { {
  2228. boost::asio::buffer(read_buf, 32),
  2229. boost::asio::buffer(read_buf) + 32 } };
  2230. s.reset(read_data, sizeof(read_data));
  2231. memset(read_buf, 0, sizeof(read_buf));
  2232. bool called = false;
  2233. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2234. bindns::bind(async_read_handler,
  2235. _1, _2, sizeof(read_data), &called));
  2236. ios.reset();
  2237. ios.run();
  2238. BOOST_ASIO_CHECK(called);
  2239. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2240. s.reset(read_data, sizeof(read_data));
  2241. s.next_read_length(1);
  2242. memset(read_buf, 0, sizeof(read_buf));
  2243. called = false;
  2244. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2245. bindns::bind(async_read_handler,
  2246. _1, _2, sizeof(read_data), &called));
  2247. ios.reset();
  2248. ios.run();
  2249. BOOST_ASIO_CHECK(called);
  2250. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2251. s.reset(read_data, sizeof(read_data));
  2252. s.next_read_length(10);
  2253. memset(read_buf, 0, sizeof(read_buf));
  2254. called = false;
  2255. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2256. bindns::bind(async_read_handler,
  2257. _1, _2, sizeof(read_data), &called));
  2258. ios.reset();
  2259. ios.run();
  2260. BOOST_ASIO_CHECK(called);
  2261. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2262. s.reset(read_data, sizeof(read_data));
  2263. memset(read_buf, 0, sizeof(read_buf));
  2264. called = false;
  2265. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2266. bindns::bind(async_read_handler,
  2267. _1, _2, sizeof(read_data), &called));
  2268. ios.reset();
  2269. ios.run();
  2270. BOOST_ASIO_CHECK(called);
  2271. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2272. s.reset(read_data, sizeof(read_data));
  2273. s.next_read_length(1);
  2274. memset(read_buf, 0, sizeof(read_buf));
  2275. called = false;
  2276. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2277. bindns::bind(async_read_handler,
  2278. _1, _2, 1, &called));
  2279. ios.reset();
  2280. ios.run();
  2281. BOOST_ASIO_CHECK(called);
  2282. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2283. s.reset(read_data, sizeof(read_data));
  2284. s.next_read_length(10);
  2285. memset(read_buf, 0, sizeof(read_buf));
  2286. called = false;
  2287. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2288. bindns::bind(async_read_handler,
  2289. _1, _2, 10, &called));
  2290. ios.reset();
  2291. ios.run();
  2292. BOOST_ASIO_CHECK(called);
  2293. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2294. s.reset(read_data, sizeof(read_data));
  2295. memset(read_buf, 0, sizeof(read_buf));
  2296. called = false;
  2297. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2298. bindns::bind(async_read_handler,
  2299. _1, _2, sizeof(read_data), &called));
  2300. ios.reset();
  2301. ios.run();
  2302. BOOST_ASIO_CHECK(called);
  2303. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2304. s.reset(read_data, sizeof(read_data));
  2305. s.next_read_length(1);
  2306. memset(read_buf, 0, sizeof(read_buf));
  2307. called = false;
  2308. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2309. bindns::bind(async_read_handler,
  2310. _1, _2, 10, &called));
  2311. ios.reset();
  2312. ios.run();
  2313. BOOST_ASIO_CHECK(called);
  2314. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2315. s.reset(read_data, sizeof(read_data));
  2316. s.next_read_length(10);
  2317. memset(read_buf, 0, sizeof(read_buf));
  2318. called = false;
  2319. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2320. bindns::bind(async_read_handler,
  2321. _1, _2, 10, &called));
  2322. ios.reset();
  2323. ios.run();
  2324. BOOST_ASIO_CHECK(called);
  2325. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2326. s.reset(read_data, sizeof(read_data));
  2327. memset(read_buf, 0, sizeof(read_buf));
  2328. called = false;
  2329. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2330. bindns::bind(async_read_handler,
  2331. _1, _2, sizeof(read_data), &called));
  2332. ios.reset();
  2333. ios.run();
  2334. BOOST_ASIO_CHECK(called);
  2335. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2336. s.reset(read_data, sizeof(read_data));
  2337. s.next_read_length(1);
  2338. memset(read_buf, 0, sizeof(read_buf));
  2339. called = false;
  2340. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2341. bindns::bind(async_read_handler,
  2342. _1, _2, 42, &called));
  2343. ios.reset();
  2344. ios.run();
  2345. BOOST_ASIO_CHECK(called);
  2346. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2347. s.reset(read_data, sizeof(read_data));
  2348. s.next_read_length(10);
  2349. memset(read_buf, 0, sizeof(read_buf));
  2350. called = false;
  2351. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2352. bindns::bind(async_read_handler,
  2353. _1, _2, 50, &called));
  2354. ios.reset();
  2355. ios.run();
  2356. BOOST_ASIO_CHECK(called);
  2357. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  2358. s.reset(read_data, sizeof(read_data));
  2359. memset(read_buf, 0, sizeof(read_buf));
  2360. called = false;
  2361. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2362. bindns::bind(async_read_handler,
  2363. _1, _2, 1, &called));
  2364. ios.reset();
  2365. ios.run();
  2366. BOOST_ASIO_CHECK(called);
  2367. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2368. s.reset(read_data, sizeof(read_data));
  2369. s.next_read_length(1);
  2370. memset(read_buf, 0, sizeof(read_buf));
  2371. called = false;
  2372. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2373. bindns::bind(async_read_handler,
  2374. _1, _2, 1, &called));
  2375. ios.reset();
  2376. ios.run();
  2377. BOOST_ASIO_CHECK(called);
  2378. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2379. s.reset(read_data, sizeof(read_data));
  2380. s.next_read_length(10);
  2381. memset(read_buf, 0, sizeof(read_buf));
  2382. called = false;
  2383. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2384. bindns::bind(async_read_handler,
  2385. _1, _2, 1, &called));
  2386. ios.reset();
  2387. ios.run();
  2388. BOOST_ASIO_CHECK(called);
  2389. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2390. s.reset(read_data, sizeof(read_data));
  2391. memset(read_buf, 0, sizeof(read_buf));
  2392. called = false;
  2393. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2394. bindns::bind(async_read_handler,
  2395. _1, _2, 10, &called));
  2396. ios.reset();
  2397. ios.run();
  2398. BOOST_ASIO_CHECK(called);
  2399. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2400. s.reset(read_data, sizeof(read_data));
  2401. s.next_read_length(1);
  2402. memset(read_buf, 0, sizeof(read_buf));
  2403. called = false;
  2404. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2405. bindns::bind(async_read_handler,
  2406. _1, _2, 10, &called));
  2407. ios.reset();
  2408. ios.run();
  2409. BOOST_ASIO_CHECK(called);
  2410. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2411. s.reset(read_data, sizeof(read_data));
  2412. s.next_read_length(10);
  2413. memset(read_buf, 0, sizeof(read_buf));
  2414. called = false;
  2415. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2416. bindns::bind(async_read_handler,
  2417. _1, _2, 10, &called));
  2418. ios.reset();
  2419. ios.run();
  2420. BOOST_ASIO_CHECK(called);
  2421. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2422. s.reset(read_data, sizeof(read_data));
  2423. memset(read_buf, 0, sizeof(read_buf));
  2424. called = false;
  2425. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2426. bindns::bind(async_read_handler,
  2427. _1, _2, 42, &called));
  2428. ios.reset();
  2429. ios.run();
  2430. BOOST_ASIO_CHECK(called);
  2431. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2432. s.reset(read_data, sizeof(read_data));
  2433. s.next_read_length(1);
  2434. memset(read_buf, 0, sizeof(read_buf));
  2435. called = false;
  2436. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2437. bindns::bind(async_read_handler,
  2438. _1, _2, 42, &called));
  2439. ios.reset();
  2440. ios.run();
  2441. BOOST_ASIO_CHECK(called);
  2442. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2443. s.reset(read_data, sizeof(read_data));
  2444. s.next_read_length(10);
  2445. memset(read_buf, 0, sizeof(read_buf));
  2446. called = false;
  2447. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2448. bindns::bind(async_read_handler,
  2449. _1, _2, 42, &called));
  2450. ios.reset();
  2451. ios.run();
  2452. BOOST_ASIO_CHECK(called);
  2453. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2454. s.reset(read_data, sizeof(read_data));
  2455. memset(read_buf, 0, sizeof(read_buf));
  2456. called = false;
  2457. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2458. bindns::bind(async_read_handler,
  2459. _1, _2, sizeof(read_data), &called));
  2460. ios.reset();
  2461. ios.run();
  2462. BOOST_ASIO_CHECK(called);
  2463. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2464. s.reset(read_data, sizeof(read_data));
  2465. s.next_read_length(1);
  2466. memset(read_buf, 0, sizeof(read_buf));
  2467. called = false;
  2468. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2469. bindns::bind(async_read_handler,
  2470. _1, _2, sizeof(read_data), &called));
  2471. ios.reset();
  2472. ios.run();
  2473. BOOST_ASIO_CHECK(called);
  2474. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2475. s.reset(read_data, sizeof(read_data));
  2476. s.next_read_length(10);
  2477. memset(read_buf, 0, sizeof(read_buf));
  2478. called = false;
  2479. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2480. bindns::bind(async_read_handler,
  2481. _1, _2, sizeof(read_data), &called));
  2482. ios.reset();
  2483. ios.run();
  2484. BOOST_ASIO_CHECK(called);
  2485. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2486. s.reset(read_data, sizeof(read_data));
  2487. memset(read_buf, 0, sizeof(read_buf));
  2488. called = false;
  2489. boost::asio::async_read(s, buffers, short_transfer,
  2490. bindns::bind(async_read_handler,
  2491. _1, _2, sizeof(read_data), &called));
  2492. ios.reset();
  2493. ios.run();
  2494. BOOST_ASIO_CHECK(called);
  2495. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2496. s.reset(read_data, sizeof(read_data));
  2497. s.next_read_length(1);
  2498. memset(read_buf, 0, sizeof(read_buf));
  2499. called = false;
  2500. boost::asio::async_read(s, buffers, short_transfer,
  2501. bindns::bind(async_read_handler,
  2502. _1, _2, sizeof(read_data), &called));
  2503. ios.reset();
  2504. ios.run();
  2505. BOOST_ASIO_CHECK(called);
  2506. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2507. s.reset(read_data, sizeof(read_data));
  2508. s.next_read_length(10);
  2509. memset(read_buf, 0, sizeof(read_buf));
  2510. called = false;
  2511. boost::asio::async_read(s, buffers, short_transfer,
  2512. bindns::bind(async_read_handler,
  2513. _1, _2, sizeof(read_data), &called));
  2514. ios.reset();
  2515. ios.run();
  2516. BOOST_ASIO_CHECK(called);
  2517. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2518. s.reset(read_data, sizeof(read_data));
  2519. memset(read_buf, 0, sizeof(read_buf));
  2520. int i = boost::asio::async_read(s, buffers,
  2521. short_transfer, archetypes::lazy_handler());
  2522. BOOST_ASIO_CHECK(i == 42);
  2523. ios.reset();
  2524. ios.run();
  2525. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2526. #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
  2527. }
  2528. void test_4_arg_std_array_buffers_async_read()
  2529. {
  2530. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  2531. namespace bindns = boost;
  2532. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  2533. namespace bindns = std;
  2534. using std::placeholders::_1;
  2535. using std::placeholders::_2;
  2536. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  2537. #if defined(BOOST_ASIO_HAS_STD_ARRAY)
  2538. boost::asio::io_service ios;
  2539. test_stream s(ios);
  2540. char read_buf[sizeof(read_data)];
  2541. std::array<boost::asio::mutable_buffer, 2> buffers = { {
  2542. boost::asio::buffer(read_buf, 32),
  2543. boost::asio::buffer(read_buf) + 32 } };
  2544. s.reset(read_data, sizeof(read_data));
  2545. memset(read_buf, 0, sizeof(read_buf));
  2546. bool called = false;
  2547. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2548. bindns::bind(async_read_handler,
  2549. _1, _2, sizeof(read_data), &called));
  2550. ios.reset();
  2551. ios.run();
  2552. BOOST_ASIO_CHECK(called);
  2553. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2554. s.reset(read_data, sizeof(read_data));
  2555. s.next_read_length(1);
  2556. memset(read_buf, 0, sizeof(read_buf));
  2557. called = false;
  2558. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2559. bindns::bind(async_read_handler,
  2560. _1, _2, sizeof(read_data), &called));
  2561. ios.reset();
  2562. ios.run();
  2563. BOOST_ASIO_CHECK(called);
  2564. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2565. s.reset(read_data, sizeof(read_data));
  2566. s.next_read_length(10);
  2567. memset(read_buf, 0, sizeof(read_buf));
  2568. called = false;
  2569. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2570. bindns::bind(async_read_handler,
  2571. _1, _2, sizeof(read_data), &called));
  2572. ios.reset();
  2573. ios.run();
  2574. BOOST_ASIO_CHECK(called);
  2575. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2576. s.reset(read_data, sizeof(read_data));
  2577. memset(read_buf, 0, sizeof(read_buf));
  2578. called = false;
  2579. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2580. bindns::bind(async_read_handler,
  2581. _1, _2, sizeof(read_data), &called));
  2582. ios.reset();
  2583. ios.run();
  2584. BOOST_ASIO_CHECK(called);
  2585. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2586. s.reset(read_data, sizeof(read_data));
  2587. s.next_read_length(1);
  2588. memset(read_buf, 0, sizeof(read_buf));
  2589. called = false;
  2590. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2591. bindns::bind(async_read_handler,
  2592. _1, _2, 1, &called));
  2593. ios.reset();
  2594. ios.run();
  2595. BOOST_ASIO_CHECK(called);
  2596. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2597. s.reset(read_data, sizeof(read_data));
  2598. s.next_read_length(10);
  2599. memset(read_buf, 0, sizeof(read_buf));
  2600. called = false;
  2601. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2602. bindns::bind(async_read_handler,
  2603. _1, _2, 10, &called));
  2604. ios.reset();
  2605. ios.run();
  2606. BOOST_ASIO_CHECK(called);
  2607. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2608. s.reset(read_data, sizeof(read_data));
  2609. memset(read_buf, 0, sizeof(read_buf));
  2610. called = false;
  2611. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2612. bindns::bind(async_read_handler,
  2613. _1, _2, sizeof(read_data), &called));
  2614. ios.reset();
  2615. ios.run();
  2616. BOOST_ASIO_CHECK(called);
  2617. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2618. s.reset(read_data, sizeof(read_data));
  2619. s.next_read_length(1);
  2620. memset(read_buf, 0, sizeof(read_buf));
  2621. called = false;
  2622. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2623. bindns::bind(async_read_handler,
  2624. _1, _2, 10, &called));
  2625. ios.reset();
  2626. ios.run();
  2627. BOOST_ASIO_CHECK(called);
  2628. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2629. s.reset(read_data, sizeof(read_data));
  2630. s.next_read_length(10);
  2631. memset(read_buf, 0, sizeof(read_buf));
  2632. called = false;
  2633. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2634. bindns::bind(async_read_handler,
  2635. _1, _2, 10, &called));
  2636. ios.reset();
  2637. ios.run();
  2638. BOOST_ASIO_CHECK(called);
  2639. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2640. s.reset(read_data, sizeof(read_data));
  2641. memset(read_buf, 0, sizeof(read_buf));
  2642. called = false;
  2643. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2644. bindns::bind(async_read_handler,
  2645. _1, _2, sizeof(read_data), &called));
  2646. ios.reset();
  2647. ios.run();
  2648. BOOST_ASIO_CHECK(called);
  2649. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2650. s.reset(read_data, sizeof(read_data));
  2651. s.next_read_length(1);
  2652. memset(read_buf, 0, sizeof(read_buf));
  2653. called = false;
  2654. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2655. bindns::bind(async_read_handler,
  2656. _1, _2, 42, &called));
  2657. ios.reset();
  2658. ios.run();
  2659. BOOST_ASIO_CHECK(called);
  2660. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2661. s.reset(read_data, sizeof(read_data));
  2662. s.next_read_length(10);
  2663. memset(read_buf, 0, sizeof(read_buf));
  2664. called = false;
  2665. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2666. bindns::bind(async_read_handler,
  2667. _1, _2, 50, &called));
  2668. ios.reset();
  2669. ios.run();
  2670. BOOST_ASIO_CHECK(called);
  2671. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  2672. s.reset(read_data, sizeof(read_data));
  2673. memset(read_buf, 0, sizeof(read_buf));
  2674. called = false;
  2675. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2676. bindns::bind(async_read_handler,
  2677. _1, _2, 1, &called));
  2678. ios.reset();
  2679. ios.run();
  2680. BOOST_ASIO_CHECK(called);
  2681. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2682. s.reset(read_data, sizeof(read_data));
  2683. s.next_read_length(1);
  2684. memset(read_buf, 0, sizeof(read_buf));
  2685. called = false;
  2686. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2687. bindns::bind(async_read_handler,
  2688. _1, _2, 1, &called));
  2689. ios.reset();
  2690. ios.run();
  2691. BOOST_ASIO_CHECK(called);
  2692. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2693. s.reset(read_data, sizeof(read_data));
  2694. s.next_read_length(10);
  2695. memset(read_buf, 0, sizeof(read_buf));
  2696. called = false;
  2697. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2698. bindns::bind(async_read_handler,
  2699. _1, _2, 1, &called));
  2700. ios.reset();
  2701. ios.run();
  2702. BOOST_ASIO_CHECK(called);
  2703. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2704. s.reset(read_data, sizeof(read_data));
  2705. memset(read_buf, 0, sizeof(read_buf));
  2706. called = false;
  2707. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2708. bindns::bind(async_read_handler,
  2709. _1, _2, 10, &called));
  2710. ios.reset();
  2711. ios.run();
  2712. BOOST_ASIO_CHECK(called);
  2713. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2714. s.reset(read_data, sizeof(read_data));
  2715. s.next_read_length(1);
  2716. memset(read_buf, 0, sizeof(read_buf));
  2717. called = false;
  2718. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2719. bindns::bind(async_read_handler,
  2720. _1, _2, 10, &called));
  2721. ios.reset();
  2722. ios.run();
  2723. BOOST_ASIO_CHECK(called);
  2724. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2725. s.reset(read_data, sizeof(read_data));
  2726. s.next_read_length(10);
  2727. memset(read_buf, 0, sizeof(read_buf));
  2728. called = false;
  2729. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  2730. bindns::bind(async_read_handler,
  2731. _1, _2, 10, &called));
  2732. ios.reset();
  2733. ios.run();
  2734. BOOST_ASIO_CHECK(called);
  2735. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2736. s.reset(read_data, sizeof(read_data));
  2737. memset(read_buf, 0, sizeof(read_buf));
  2738. called = false;
  2739. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2740. bindns::bind(async_read_handler,
  2741. _1, _2, 42, &called));
  2742. ios.reset();
  2743. ios.run();
  2744. BOOST_ASIO_CHECK(called);
  2745. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2746. s.reset(read_data, sizeof(read_data));
  2747. s.next_read_length(1);
  2748. memset(read_buf, 0, sizeof(read_buf));
  2749. called = false;
  2750. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2751. bindns::bind(async_read_handler,
  2752. _1, _2, 42, &called));
  2753. ios.reset();
  2754. ios.run();
  2755. BOOST_ASIO_CHECK(called);
  2756. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2757. s.reset(read_data, sizeof(read_data));
  2758. s.next_read_length(10);
  2759. memset(read_buf, 0, sizeof(read_buf));
  2760. called = false;
  2761. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  2762. bindns::bind(async_read_handler,
  2763. _1, _2, 42, &called));
  2764. ios.reset();
  2765. ios.run();
  2766. BOOST_ASIO_CHECK(called);
  2767. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2768. s.reset(read_data, sizeof(read_data));
  2769. memset(read_buf, 0, sizeof(read_buf));
  2770. called = false;
  2771. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2772. bindns::bind(async_read_handler,
  2773. _1, _2, sizeof(read_data), &called));
  2774. ios.reset();
  2775. ios.run();
  2776. BOOST_ASIO_CHECK(called);
  2777. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2778. s.reset(read_data, sizeof(read_data));
  2779. s.next_read_length(1);
  2780. memset(read_buf, 0, sizeof(read_buf));
  2781. called = false;
  2782. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2783. bindns::bind(async_read_handler,
  2784. _1, _2, sizeof(read_data), &called));
  2785. ios.reset();
  2786. ios.run();
  2787. BOOST_ASIO_CHECK(called);
  2788. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2789. s.reset(read_data, sizeof(read_data));
  2790. s.next_read_length(10);
  2791. memset(read_buf, 0, sizeof(read_buf));
  2792. called = false;
  2793. boost::asio::async_read(s, buffers, old_style_transfer_all,
  2794. bindns::bind(async_read_handler,
  2795. _1, _2, sizeof(read_data), &called));
  2796. ios.reset();
  2797. ios.run();
  2798. BOOST_ASIO_CHECK(called);
  2799. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2800. s.reset(read_data, sizeof(read_data));
  2801. memset(read_buf, 0, sizeof(read_buf));
  2802. called = false;
  2803. boost::asio::async_read(s, buffers, short_transfer,
  2804. bindns::bind(async_read_handler,
  2805. _1, _2, sizeof(read_data), &called));
  2806. ios.reset();
  2807. ios.run();
  2808. BOOST_ASIO_CHECK(called);
  2809. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2810. s.reset(read_data, sizeof(read_data));
  2811. s.next_read_length(1);
  2812. memset(read_buf, 0, sizeof(read_buf));
  2813. called = false;
  2814. boost::asio::async_read(s, buffers, short_transfer,
  2815. bindns::bind(async_read_handler,
  2816. _1, _2, sizeof(read_data), &called));
  2817. ios.reset();
  2818. ios.run();
  2819. BOOST_ASIO_CHECK(called);
  2820. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2821. s.reset(read_data, sizeof(read_data));
  2822. s.next_read_length(10);
  2823. memset(read_buf, 0, sizeof(read_buf));
  2824. called = false;
  2825. boost::asio::async_read(s, buffers, short_transfer,
  2826. bindns::bind(async_read_handler,
  2827. _1, _2, sizeof(read_data), &called));
  2828. ios.reset();
  2829. ios.run();
  2830. BOOST_ASIO_CHECK(called);
  2831. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2832. s.reset(read_data, sizeof(read_data));
  2833. memset(read_buf, 0, sizeof(read_buf));
  2834. int i = boost::asio::async_read(s, buffers,
  2835. short_transfer, archetypes::lazy_handler());
  2836. BOOST_ASIO_CHECK(i == 42);
  2837. ios.reset();
  2838. ios.run();
  2839. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2840. #endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
  2841. }
  2842. void test_4_arg_vector_buffers_async_read()
  2843. {
  2844. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  2845. namespace bindns = boost;
  2846. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  2847. namespace bindns = std;
  2848. using std::placeholders::_1;
  2849. using std::placeholders::_2;
  2850. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  2851. boost::asio::io_service ios;
  2852. test_stream s(ios);
  2853. char read_buf[sizeof(read_data)];
  2854. std::vector<boost::asio::mutable_buffer> buffers;
  2855. buffers.push_back(boost::asio::buffer(read_buf, 32));
  2856. buffers.push_back(boost::asio::buffer(read_buf) + 32);
  2857. s.reset(read_data, sizeof(read_data));
  2858. memset(read_buf, 0, sizeof(read_buf));
  2859. bool called = false;
  2860. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2861. bindns::bind(async_read_handler,
  2862. _1, _2, sizeof(read_data), &called));
  2863. ios.reset();
  2864. ios.run();
  2865. BOOST_ASIO_CHECK(called);
  2866. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2867. s.reset(read_data, sizeof(read_data));
  2868. s.next_read_length(1);
  2869. memset(read_buf, 0, sizeof(read_buf));
  2870. called = false;
  2871. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2872. bindns::bind(async_read_handler,
  2873. _1, _2, sizeof(read_data), &called));
  2874. ios.reset();
  2875. ios.run();
  2876. BOOST_ASIO_CHECK(called);
  2877. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2878. s.reset(read_data, sizeof(read_data));
  2879. s.next_read_length(10);
  2880. memset(read_buf, 0, sizeof(read_buf));
  2881. called = false;
  2882. boost::asio::async_read(s, buffers, boost::asio::transfer_all(),
  2883. bindns::bind(async_read_handler,
  2884. _1, _2, sizeof(read_data), &called));
  2885. ios.reset();
  2886. ios.run();
  2887. BOOST_ASIO_CHECK(called);
  2888. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2889. s.reset(read_data, sizeof(read_data));
  2890. memset(read_buf, 0, sizeof(read_buf));
  2891. called = false;
  2892. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2893. bindns::bind(async_read_handler,
  2894. _1, _2, sizeof(read_data), &called));
  2895. ios.reset();
  2896. ios.run();
  2897. BOOST_ASIO_CHECK(called);
  2898. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2899. s.reset(read_data, sizeof(read_data));
  2900. s.next_read_length(1);
  2901. memset(read_buf, 0, sizeof(read_buf));
  2902. called = false;
  2903. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2904. bindns::bind(async_read_handler,
  2905. _1, _2, 1, &called));
  2906. ios.reset();
  2907. ios.run();
  2908. BOOST_ASIO_CHECK(called);
  2909. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2910. s.reset(read_data, sizeof(read_data));
  2911. s.next_read_length(10);
  2912. memset(read_buf, 0, sizeof(read_buf));
  2913. called = false;
  2914. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(1),
  2915. bindns::bind(async_read_handler,
  2916. _1, _2, 10, &called));
  2917. ios.reset();
  2918. ios.run();
  2919. BOOST_ASIO_CHECK(called);
  2920. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2921. s.reset(read_data, sizeof(read_data));
  2922. memset(read_buf, 0, sizeof(read_buf));
  2923. called = false;
  2924. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2925. bindns::bind(async_read_handler,
  2926. _1, _2, sizeof(read_data), &called));
  2927. ios.reset();
  2928. ios.run();
  2929. BOOST_ASIO_CHECK(called);
  2930. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2931. s.reset(read_data, sizeof(read_data));
  2932. s.next_read_length(1);
  2933. memset(read_buf, 0, sizeof(read_buf));
  2934. called = false;
  2935. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2936. bindns::bind(async_read_handler,
  2937. _1, _2, 10, &called));
  2938. ios.reset();
  2939. ios.run();
  2940. BOOST_ASIO_CHECK(called);
  2941. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2942. s.reset(read_data, sizeof(read_data));
  2943. s.next_read_length(10);
  2944. memset(read_buf, 0, sizeof(read_buf));
  2945. called = false;
  2946. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(10),
  2947. bindns::bind(async_read_handler,
  2948. _1, _2, 10, &called));
  2949. ios.reset();
  2950. ios.run();
  2951. BOOST_ASIO_CHECK(called);
  2952. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  2953. s.reset(read_data, sizeof(read_data));
  2954. memset(read_buf, 0, sizeof(read_buf));
  2955. called = false;
  2956. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2957. bindns::bind(async_read_handler,
  2958. _1, _2, sizeof(read_data), &called));
  2959. ios.reset();
  2960. ios.run();
  2961. BOOST_ASIO_CHECK(called);
  2962. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  2963. s.reset(read_data, sizeof(read_data));
  2964. s.next_read_length(1);
  2965. memset(read_buf, 0, sizeof(read_buf));
  2966. called = false;
  2967. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2968. bindns::bind(async_read_handler,
  2969. _1, _2, 42, &called));
  2970. ios.reset();
  2971. ios.run();
  2972. BOOST_ASIO_CHECK(called);
  2973. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  2974. s.reset(read_data, sizeof(read_data));
  2975. s.next_read_length(10);
  2976. memset(read_buf, 0, sizeof(read_buf));
  2977. called = false;
  2978. boost::asio::async_read(s, buffers, boost::asio::transfer_at_least(42),
  2979. bindns::bind(async_read_handler,
  2980. _1, _2, 50, &called));
  2981. ios.reset();
  2982. ios.run();
  2983. BOOST_ASIO_CHECK(called);
  2984. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  2985. s.reset(read_data, sizeof(read_data));
  2986. memset(read_buf, 0, sizeof(read_buf));
  2987. called = false;
  2988. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  2989. bindns::bind(async_read_handler,
  2990. _1, _2, 1, &called));
  2991. ios.reset();
  2992. ios.run();
  2993. BOOST_ASIO_CHECK(called);
  2994. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  2995. s.reset(read_data, sizeof(read_data));
  2996. s.next_read_length(1);
  2997. memset(read_buf, 0, sizeof(read_buf));
  2998. called = false;
  2999. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  3000. bindns::bind(async_read_handler,
  3001. _1, _2, 1, &called));
  3002. ios.reset();
  3003. ios.run();
  3004. BOOST_ASIO_CHECK(called);
  3005. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  3006. s.reset(read_data, sizeof(read_data));
  3007. s.next_read_length(10);
  3008. memset(read_buf, 0, sizeof(read_buf));
  3009. called = false;
  3010. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(1),
  3011. bindns::bind(async_read_handler,
  3012. _1, _2, 1, &called));
  3013. ios.reset();
  3014. ios.run();
  3015. BOOST_ASIO_CHECK(called);
  3016. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  3017. s.reset(read_data, sizeof(read_data));
  3018. memset(read_buf, 0, sizeof(read_buf));
  3019. called = false;
  3020. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  3021. bindns::bind(async_read_handler,
  3022. _1, _2, 10, &called));
  3023. ios.reset();
  3024. ios.run();
  3025. BOOST_ASIO_CHECK(called);
  3026. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  3027. s.reset(read_data, sizeof(read_data));
  3028. s.next_read_length(1);
  3029. memset(read_buf, 0, sizeof(read_buf));
  3030. called = false;
  3031. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  3032. bindns::bind(async_read_handler,
  3033. _1, _2, 10, &called));
  3034. ios.reset();
  3035. ios.run();
  3036. BOOST_ASIO_CHECK(called);
  3037. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  3038. s.reset(read_data, sizeof(read_data));
  3039. s.next_read_length(10);
  3040. memset(read_buf, 0, sizeof(read_buf));
  3041. called = false;
  3042. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(10),
  3043. bindns::bind(async_read_handler,
  3044. _1, _2, 10, &called));
  3045. ios.reset();
  3046. ios.run();
  3047. BOOST_ASIO_CHECK(called);
  3048. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  3049. s.reset(read_data, sizeof(read_data));
  3050. memset(read_buf, 0, sizeof(read_buf));
  3051. called = false;
  3052. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  3053. bindns::bind(async_read_handler,
  3054. _1, _2, 42, &called));
  3055. ios.reset();
  3056. ios.run();
  3057. BOOST_ASIO_CHECK(called);
  3058. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  3059. s.reset(read_data, sizeof(read_data));
  3060. s.next_read_length(1);
  3061. memset(read_buf, 0, sizeof(read_buf));
  3062. called = false;
  3063. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  3064. bindns::bind(async_read_handler,
  3065. _1, _2, 42, &called));
  3066. ios.reset();
  3067. ios.run();
  3068. BOOST_ASIO_CHECK(called);
  3069. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  3070. s.reset(read_data, sizeof(read_data));
  3071. s.next_read_length(10);
  3072. memset(read_buf, 0, sizeof(read_buf));
  3073. called = false;
  3074. boost::asio::async_read(s, buffers, boost::asio::transfer_exactly(42),
  3075. bindns::bind(async_read_handler,
  3076. _1, _2, 42, &called));
  3077. ios.reset();
  3078. ios.run();
  3079. BOOST_ASIO_CHECK(called);
  3080. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  3081. s.reset(read_data, sizeof(read_data));
  3082. memset(read_buf, 0, sizeof(read_buf));
  3083. called = false;
  3084. boost::asio::async_read(s, buffers, old_style_transfer_all,
  3085. bindns::bind(async_read_handler,
  3086. _1, _2, sizeof(read_data), &called));
  3087. ios.reset();
  3088. ios.run();
  3089. BOOST_ASIO_CHECK(called);
  3090. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  3091. s.reset(read_data, sizeof(read_data));
  3092. s.next_read_length(1);
  3093. memset(read_buf, 0, sizeof(read_buf));
  3094. called = false;
  3095. boost::asio::async_read(s, buffers, old_style_transfer_all,
  3096. bindns::bind(async_read_handler,
  3097. _1, _2, sizeof(read_data), &called));
  3098. ios.reset();
  3099. ios.run();
  3100. BOOST_ASIO_CHECK(called);
  3101. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  3102. s.reset(read_data, sizeof(read_data));
  3103. s.next_read_length(10);
  3104. memset(read_buf, 0, sizeof(read_buf));
  3105. called = false;
  3106. boost::asio::async_read(s, buffers, old_style_transfer_all,
  3107. bindns::bind(async_read_handler,
  3108. _1, _2, sizeof(read_data), &called));
  3109. ios.reset();
  3110. ios.run();
  3111. BOOST_ASIO_CHECK(called);
  3112. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  3113. s.reset(read_data, sizeof(read_data));
  3114. memset(read_buf, 0, sizeof(read_buf));
  3115. called = false;
  3116. boost::asio::async_read(s, buffers, short_transfer,
  3117. bindns::bind(async_read_handler,
  3118. _1, _2, sizeof(read_data), &called));
  3119. ios.reset();
  3120. ios.run();
  3121. BOOST_ASIO_CHECK(called);
  3122. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  3123. s.reset(read_data, sizeof(read_data));
  3124. s.next_read_length(1);
  3125. memset(read_buf, 0, sizeof(read_buf));
  3126. called = false;
  3127. boost::asio::async_read(s, buffers, short_transfer,
  3128. bindns::bind(async_read_handler,
  3129. _1, _2, sizeof(read_data), &called));
  3130. ios.reset();
  3131. ios.run();
  3132. BOOST_ASIO_CHECK(called);
  3133. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  3134. s.reset(read_data, sizeof(read_data));
  3135. s.next_read_length(10);
  3136. memset(read_buf, 0, sizeof(read_buf));
  3137. called = false;
  3138. boost::asio::async_read(s, buffers, short_transfer,
  3139. bindns::bind(async_read_handler,
  3140. _1, _2, sizeof(read_data), &called));
  3141. ios.reset();
  3142. ios.run();
  3143. BOOST_ASIO_CHECK(called);
  3144. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  3145. s.reset(read_data, sizeof(read_data));
  3146. memset(read_buf, 0, sizeof(read_buf));
  3147. int i = boost::asio::async_read(s, buffers,
  3148. short_transfer, archetypes::lazy_handler());
  3149. BOOST_ASIO_CHECK(i == 42);
  3150. ios.reset();
  3151. ios.run();
  3152. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(read_data)));
  3153. }
  3154. void test_4_arg_streambuf_async_read()
  3155. {
  3156. #if defined(BOOST_ASIO_HAS_BOOST_BIND)
  3157. namespace bindns = boost;
  3158. #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
  3159. namespace bindns = std;
  3160. using std::placeholders::_1;
  3161. using std::placeholders::_2;
  3162. #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
  3163. boost::asio::io_service ios;
  3164. test_stream s(ios);
  3165. boost::asio::streambuf sb(sizeof(read_data));
  3166. s.reset(read_data, sizeof(read_data));
  3167. sb.consume(sb.size());
  3168. bool called = false;
  3169. boost::asio::async_read(s, sb, boost::asio::transfer_all(),
  3170. bindns::bind(async_read_handler,
  3171. _1, _2, sizeof(read_data), &called));
  3172. ios.reset();
  3173. ios.run();
  3174. BOOST_ASIO_CHECK(called);
  3175. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3176. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3177. s.reset(read_data, sizeof(read_data));
  3178. s.next_read_length(1);
  3179. sb.consume(sb.size());
  3180. called = false;
  3181. boost::asio::async_read(s, sb, boost::asio::transfer_all(),
  3182. bindns::bind(async_read_handler,
  3183. _1, _2, sizeof(read_data), &called));
  3184. ios.reset();
  3185. ios.run();
  3186. BOOST_ASIO_CHECK(called);
  3187. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3188. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3189. s.reset(read_data, sizeof(read_data));
  3190. s.next_read_length(10);
  3191. sb.consume(sb.size());
  3192. called = false;
  3193. boost::asio::async_read(s, sb, boost::asio::transfer_all(),
  3194. bindns::bind(async_read_handler,
  3195. _1, _2, sizeof(read_data), &called));
  3196. ios.reset();
  3197. ios.run();
  3198. BOOST_ASIO_CHECK(called);
  3199. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3200. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3201. s.reset(read_data, sizeof(read_data));
  3202. sb.consume(sb.size());
  3203. called = false;
  3204. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(1),
  3205. bindns::bind(async_read_handler,
  3206. _1, _2, sizeof(read_data), &called));
  3207. ios.reset();
  3208. ios.run();
  3209. BOOST_ASIO_CHECK(called);
  3210. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3211. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3212. s.reset(read_data, sizeof(read_data));
  3213. s.next_read_length(1);
  3214. sb.consume(sb.size());
  3215. called = false;
  3216. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(1),
  3217. bindns::bind(async_read_handler,
  3218. _1, _2, 1, &called));
  3219. ios.reset();
  3220. ios.run();
  3221. BOOST_ASIO_CHECK(called);
  3222. BOOST_ASIO_CHECK(sb.size() == 1);
  3223. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  3224. s.reset(read_data, sizeof(read_data));
  3225. s.next_read_length(10);
  3226. sb.consume(sb.size());
  3227. called = false;
  3228. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(1),
  3229. bindns::bind(async_read_handler,
  3230. _1, _2, 10, &called));
  3231. ios.reset();
  3232. ios.run();
  3233. BOOST_ASIO_CHECK(called);
  3234. BOOST_ASIO_CHECK(sb.size() == 10);
  3235. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  3236. s.reset(read_data, sizeof(read_data));
  3237. sb.consume(sb.size());
  3238. called = false;
  3239. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(10),
  3240. bindns::bind(async_read_handler,
  3241. _1, _2, sizeof(read_data), &called));
  3242. ios.reset();
  3243. ios.run();
  3244. BOOST_ASIO_CHECK(called);
  3245. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3246. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3247. s.reset(read_data, sizeof(read_data));
  3248. s.next_read_length(1);
  3249. sb.consume(sb.size());
  3250. called = false;
  3251. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(10),
  3252. bindns::bind(async_read_handler,
  3253. _1, _2, 10, &called));
  3254. ios.reset();
  3255. ios.run();
  3256. BOOST_ASIO_CHECK(called);
  3257. BOOST_ASIO_CHECK(sb.size() == 10);
  3258. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  3259. s.reset(read_data, sizeof(read_data));
  3260. s.next_read_length(10);
  3261. sb.consume(sb.size());
  3262. called = false;
  3263. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(10),
  3264. bindns::bind(async_read_handler,
  3265. _1, _2, 10, &called));
  3266. ios.reset();
  3267. ios.run();
  3268. BOOST_ASIO_CHECK(called);
  3269. BOOST_ASIO_CHECK(sb.size() == 10);
  3270. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  3271. s.reset(read_data, sizeof(read_data));
  3272. sb.consume(sb.size());
  3273. called = false;
  3274. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(42),
  3275. bindns::bind(async_read_handler,
  3276. _1, _2, sizeof(read_data), &called));
  3277. ios.reset();
  3278. ios.run();
  3279. BOOST_ASIO_CHECK(called);
  3280. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3281. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3282. s.reset(read_data, sizeof(read_data));
  3283. s.next_read_length(1);
  3284. sb.consume(sb.size());
  3285. called = false;
  3286. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(42),
  3287. bindns::bind(async_read_handler,
  3288. _1, _2, 42, &called));
  3289. ios.reset();
  3290. ios.run();
  3291. BOOST_ASIO_CHECK(called);
  3292. BOOST_ASIO_CHECK(sb.size() == 42);
  3293. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  3294. s.reset(read_data, sizeof(read_data));
  3295. s.next_read_length(10);
  3296. sb.consume(sb.size());
  3297. called = false;
  3298. boost::asio::async_read(s, sb, boost::asio::transfer_at_least(42),
  3299. bindns::bind(async_read_handler,
  3300. _1, _2, 50, &called));
  3301. ios.reset();
  3302. ios.run();
  3303. BOOST_ASIO_CHECK(called);
  3304. BOOST_ASIO_CHECK(sb.size() == 50);
  3305. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 50));
  3306. s.reset(read_data, sizeof(read_data));
  3307. sb.consume(sb.size());
  3308. called = false;
  3309. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(1),
  3310. bindns::bind(async_read_handler,
  3311. _1, _2, 1, &called));
  3312. ios.reset();
  3313. ios.run();
  3314. BOOST_ASIO_CHECK(called);
  3315. BOOST_ASIO_CHECK(sb.size() == 1);
  3316. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  3317. s.reset(read_data, sizeof(read_data));
  3318. s.next_read_length(1);
  3319. sb.consume(sb.size());
  3320. called = false;
  3321. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(1),
  3322. bindns::bind(async_read_handler,
  3323. _1, _2, 1, &called));
  3324. ios.reset();
  3325. ios.run();
  3326. BOOST_ASIO_CHECK(called);
  3327. BOOST_ASIO_CHECK(sb.size() == 1);
  3328. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  3329. s.reset(read_data, sizeof(read_data));
  3330. s.next_read_length(10);
  3331. sb.consume(sb.size());
  3332. called = false;
  3333. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(1),
  3334. bindns::bind(async_read_handler,
  3335. _1, _2, 1, &called));
  3336. ios.reset();
  3337. ios.run();
  3338. BOOST_ASIO_CHECK(called);
  3339. BOOST_ASIO_CHECK(sb.size() == 1);
  3340. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 1));
  3341. s.reset(read_data, sizeof(read_data));
  3342. sb.consume(sb.size());
  3343. called = false;
  3344. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(10),
  3345. bindns::bind(async_read_handler,
  3346. _1, _2, 10, &called));
  3347. ios.reset();
  3348. ios.run();
  3349. BOOST_ASIO_CHECK(called);
  3350. BOOST_ASIO_CHECK(sb.size() == 10);
  3351. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  3352. s.reset(read_data, sizeof(read_data));
  3353. s.next_read_length(1);
  3354. sb.consume(sb.size());
  3355. called = false;
  3356. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(10),
  3357. bindns::bind(async_read_handler,
  3358. _1, _2, 10, &called));
  3359. ios.reset();
  3360. ios.run();
  3361. BOOST_ASIO_CHECK(called);
  3362. BOOST_ASIO_CHECK(sb.size() == 10);
  3363. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  3364. s.reset(read_data, sizeof(read_data));
  3365. s.next_read_length(10);
  3366. sb.consume(sb.size());
  3367. called = false;
  3368. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(10),
  3369. bindns::bind(async_read_handler,
  3370. _1, _2, 10, &called));
  3371. ios.reset();
  3372. ios.run();
  3373. BOOST_ASIO_CHECK(called);
  3374. BOOST_ASIO_CHECK(sb.size() == 10);
  3375. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 10));
  3376. s.reset(read_data, sizeof(read_data));
  3377. sb.consume(sb.size());
  3378. called = false;
  3379. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(42),
  3380. bindns::bind(async_read_handler,
  3381. _1, _2, 42, &called));
  3382. ios.reset();
  3383. ios.run();
  3384. BOOST_ASIO_CHECK(called);
  3385. BOOST_ASIO_CHECK(sb.size() == 42);
  3386. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  3387. s.reset(read_data, sizeof(read_data));
  3388. s.next_read_length(1);
  3389. sb.consume(sb.size());
  3390. called = false;
  3391. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(42),
  3392. bindns::bind(async_read_handler,
  3393. _1, _2, 42, &called));
  3394. ios.reset();
  3395. ios.run();
  3396. BOOST_ASIO_CHECK(called);
  3397. BOOST_ASIO_CHECK(sb.size() == 42);
  3398. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  3399. s.reset(read_data, sizeof(read_data));
  3400. s.next_read_length(10);
  3401. sb.consume(sb.size());
  3402. called = false;
  3403. boost::asio::async_read(s, sb, boost::asio::transfer_exactly(42),
  3404. bindns::bind(async_read_handler,
  3405. _1, _2, 42, &called));
  3406. ios.reset();
  3407. ios.run();
  3408. BOOST_ASIO_CHECK(called);
  3409. BOOST_ASIO_CHECK(sb.size() == 42);
  3410. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), 42));
  3411. s.reset(read_data, sizeof(read_data));
  3412. sb.consume(sb.size());
  3413. called = false;
  3414. boost::asio::async_read(s, sb, old_style_transfer_all,
  3415. bindns::bind(async_read_handler,
  3416. _1, _2, sizeof(read_data), &called));
  3417. ios.reset();
  3418. ios.run();
  3419. BOOST_ASIO_CHECK(called);
  3420. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3421. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3422. s.reset(read_data, sizeof(read_data));
  3423. s.next_read_length(1);
  3424. sb.consume(sb.size());
  3425. called = false;
  3426. boost::asio::async_read(s, sb, old_style_transfer_all,
  3427. bindns::bind(async_read_handler,
  3428. _1, _2, sizeof(read_data), &called));
  3429. ios.reset();
  3430. ios.run();
  3431. BOOST_ASIO_CHECK(called);
  3432. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3433. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3434. s.reset(read_data, sizeof(read_data));
  3435. s.next_read_length(10);
  3436. sb.consume(sb.size());
  3437. called = false;
  3438. boost::asio::async_read(s, sb, old_style_transfer_all,
  3439. bindns::bind(async_read_handler,
  3440. _1, _2, sizeof(read_data), &called));
  3441. ios.reset();
  3442. ios.run();
  3443. BOOST_ASIO_CHECK(called);
  3444. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3445. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3446. s.reset(read_data, sizeof(read_data));
  3447. sb.consume(sb.size());
  3448. called = false;
  3449. boost::asio::async_read(s, sb, short_transfer,
  3450. bindns::bind(async_read_handler,
  3451. _1, _2, sizeof(read_data), &called));
  3452. ios.reset();
  3453. ios.run();
  3454. BOOST_ASIO_CHECK(called);
  3455. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3456. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3457. s.reset(read_data, sizeof(read_data));
  3458. s.next_read_length(1);
  3459. sb.consume(sb.size());
  3460. called = false;
  3461. boost::asio::async_read(s, sb, short_transfer,
  3462. bindns::bind(async_read_handler,
  3463. _1, _2, sizeof(read_data), &called));
  3464. ios.reset();
  3465. ios.run();
  3466. BOOST_ASIO_CHECK(called);
  3467. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3468. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3469. s.reset(read_data, sizeof(read_data));
  3470. s.next_read_length(10);
  3471. sb.consume(sb.size());
  3472. called = false;
  3473. boost::asio::async_read(s, sb, short_transfer,
  3474. bindns::bind(async_read_handler,
  3475. _1, _2, sizeof(read_data), &called));
  3476. ios.reset();
  3477. ios.run();
  3478. BOOST_ASIO_CHECK(called);
  3479. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3480. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3481. s.reset(read_data, sizeof(read_data));
  3482. sb.consume(sb.size());
  3483. int i = boost::asio::async_read(s, sb,
  3484. short_transfer, archetypes::lazy_handler());
  3485. BOOST_ASIO_CHECK(i == 42);
  3486. ios.reset();
  3487. ios.run();
  3488. BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
  3489. BOOST_ASIO_CHECK(s.check_buffers(sb.data(), sizeof(read_data)));
  3490. }
  3491. BOOST_ASIO_TEST_SUITE
  3492. (
  3493. "read",
  3494. BOOST_ASIO_TEST_CASE(test_2_arg_zero_buffers_read)
  3495. BOOST_ASIO_TEST_CASE(test_2_arg_mutable_buffers_1_read)
  3496. BOOST_ASIO_TEST_CASE(test_2_arg_vector_buffers_read)
  3497. BOOST_ASIO_TEST_CASE(test_2_arg_streambuf_read)
  3498. BOOST_ASIO_TEST_CASE(test_3_arg_nothrow_zero_buffers_read)
  3499. BOOST_ASIO_TEST_CASE(test_3_arg_nothrow_mutable_buffers_1_read)
  3500. BOOST_ASIO_TEST_CASE(test_3_arg_nothrow_vector_buffers_read)
  3501. BOOST_ASIO_TEST_CASE(test_3_arg_nothrow_streambuf_read)
  3502. BOOST_ASIO_TEST_CASE(test_3_arg_mutable_buffers_1_read)
  3503. BOOST_ASIO_TEST_CASE(test_3_arg_vector_buffers_read)
  3504. BOOST_ASIO_TEST_CASE(test_3_arg_streambuf_read)
  3505. BOOST_ASIO_TEST_CASE(test_4_arg_mutable_buffers_1_read)
  3506. BOOST_ASIO_TEST_CASE(test_4_arg_vector_buffers_read)
  3507. BOOST_ASIO_TEST_CASE(test_4_arg_streambuf_read)
  3508. BOOST_ASIO_TEST_CASE(test_3_arg_mutable_buffers_1_async_read)
  3509. BOOST_ASIO_TEST_CASE(test_3_arg_boost_array_buffers_async_read)
  3510. BOOST_ASIO_TEST_CASE(test_3_arg_std_array_buffers_async_read)
  3511. BOOST_ASIO_TEST_CASE(test_3_arg_vector_buffers_async_read)
  3512. BOOST_ASIO_TEST_CASE(test_3_arg_streambuf_async_read)
  3513. BOOST_ASIO_TEST_CASE(test_4_arg_mutable_buffers_1_async_read)
  3514. BOOST_ASIO_TEST_CASE(test_4_arg_vector_buffers_async_read)
  3515. BOOST_ASIO_TEST_CASE(test_4_arg_boost_array_buffers_async_read)
  3516. BOOST_ASIO_TEST_CASE(test_4_arg_std_array_buffers_async_read)
  3517. BOOST_ASIO_TEST_CASE(test_4_arg_streambuf_async_read)
  3518. )