PageRenderTime 112ms CodeModel.GetById 27ms RepoModel.GetById 1ms 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

Large files files are truncated, but you can click here to view the full 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::err

Large files files are truncated, but you can click here to view the full file