PageRenderTime 51ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 1ms

/test/write.cpp

https://bitbucket.org/boostorg/asio
C++ | 3914 lines | 3466 code | 437 blank | 11 comment | 203 complexity | 46442eaafa875daa55ca7f61598e5a2f MD5 | raw file

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

  1. //
  2. // write.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/write.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_(max_length),
  41. position_(0),
  42. next_write_length_(max_length)
  43. {
  44. memset(data_, 0, max_length);
  45. }
  46. io_service_type& get_io_service()
  47. {
  48. return io_service_;
  49. }
  50. void reset(size_t length = max_length)
  51. {
  52. BOOST_ASIO_CHECK(length <= max_length);
  53. memset(data_, 0, max_length);
  54. length_ = length;
  55. position_ = 0;
  56. next_write_length_ = length;
  57. }
  58. void next_write_length(size_t length)
  59. {
  60. next_write_length_ = length;
  61. }
  62. template <typename Const_Buffers>
  63. bool check_buffers(const Const_Buffers& buffers, size_t length)
  64. {
  65. if (length != position_)
  66. return false;
  67. typename Const_Buffers::const_iterator iter = buffers.begin();
  68. typename Const_Buffers::const_iterator end = buffers.end();
  69. size_t checked_length = 0;
  70. for (; iter != end && checked_length < length; ++iter)
  71. {
  72. size_t buffer_length = boost::asio::buffer_size(*iter);
  73. if (buffer_length > length - checked_length)
  74. buffer_length = length - checked_length;
  75. if (memcmp(data_ + checked_length,
  76. boost::asio::buffer_cast<const void*>(*iter), buffer_length) != 0)
  77. return false;
  78. checked_length += buffer_length;
  79. }
  80. return true;
  81. }
  82. template <typename Const_Buffers>
  83. size_t write_some(const Const_Buffers& buffers)
  84. {
  85. size_t n = boost::asio::buffer_copy(
  86. boost::asio::buffer(data_, length_) + position_,
  87. buffers, next_write_length_);
  88. position_ += n;
  89. return n;
  90. }
  91. template <typename Const_Buffers>
  92. size_t write_some(const Const_Buffers& buffers, boost::system::error_code& ec)
  93. {
  94. ec = boost::system::error_code();
  95. return write_some(buffers);
  96. }
  97. template <typename Const_Buffers, typename Handler>
  98. void async_write_some(const Const_Buffers& buffers, Handler handler)
  99. {
  100. size_t bytes_transferred = write_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_write_length_;
  111. };
  112. static const char write_data[]
  113. = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  114. static char mutable_write_data[]
  115. = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  116. void test_2_arg_zero_buffers_write()
  117. {
  118. boost::asio::io_service ios;
  119. test_stream s(ios);
  120. std::vector<boost::asio::const_buffer> buffers;
  121. size_t bytes_transferred = boost::asio::write(s, buffers);
  122. BOOST_ASIO_CHECK(bytes_transferred == 0);
  123. }
  124. void test_2_arg_const_buffers_1_write()
  125. {
  126. boost::asio::io_service ios;
  127. test_stream s(ios);
  128. boost::asio::const_buffers_1 buffers
  129. = boost::asio::buffer(write_data, sizeof(write_data));
  130. s.reset();
  131. size_t bytes_transferred = boost::asio::write(s, buffers);
  132. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  133. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  134. s.reset();
  135. s.next_write_length(1);
  136. bytes_transferred = boost::asio::write(s, buffers);
  137. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  138. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  139. s.reset();
  140. s.next_write_length(10);
  141. bytes_transferred = boost::asio::write(s, buffers);
  142. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  143. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  144. }
  145. void test_2_arg_mutable_buffers_1_write()
  146. {
  147. boost::asio::io_service ios;
  148. test_stream s(ios);
  149. boost::asio::mutable_buffers_1 buffers
  150. = boost::asio::buffer(mutable_write_data, sizeof(mutable_write_data));
  151. s.reset();
  152. size_t bytes_transferred = boost::asio::write(s, buffers);
  153. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  154. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  155. s.reset();
  156. s.next_write_length(1);
  157. bytes_transferred = boost::asio::write(s, buffers);
  158. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  159. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  160. s.reset();
  161. s.next_write_length(10);
  162. bytes_transferred = boost::asio::write(s, buffers);
  163. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  164. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  165. }
  166. void test_2_arg_vector_buffers_write()
  167. {
  168. boost::asio::io_service ios;
  169. test_stream s(ios);
  170. std::vector<boost::asio::const_buffer> buffers;
  171. buffers.push_back(boost::asio::buffer(write_data, 32));
  172. buffers.push_back(boost::asio::buffer(write_data) + 32);
  173. s.reset();
  174. size_t bytes_transferred = boost::asio::write(s, buffers);
  175. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  176. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  177. s.reset();
  178. s.next_write_length(1);
  179. bytes_transferred = boost::asio::write(s, buffers);
  180. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  181. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  182. s.reset();
  183. s.next_write_length(10);
  184. bytes_transferred = boost::asio::write(s, buffers);
  185. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  186. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  187. }
  188. void test_3_arg_nothrow_zero_buffers_write()
  189. {
  190. boost::asio::io_service ios;
  191. test_stream s(ios);
  192. std::vector<boost::asio::const_buffer> buffers;
  193. boost::system::error_code error;
  194. size_t bytes_transferred = boost::asio::write(s, buffers, error);
  195. BOOST_ASIO_CHECK(bytes_transferred == 0);
  196. BOOST_ASIO_CHECK(!error);
  197. }
  198. void test_3_arg_nothrow_const_buffers_1_write()
  199. {
  200. boost::asio::io_service ios;
  201. test_stream s(ios);
  202. boost::asio::const_buffers_1 buffers
  203. = boost::asio::buffer(write_data, sizeof(write_data));
  204. s.reset();
  205. boost::system::error_code error;
  206. size_t bytes_transferred = boost::asio::write(s, buffers, error);
  207. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  208. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  209. BOOST_ASIO_CHECK(!error);
  210. s.reset();
  211. s.next_write_length(1);
  212. bytes_transferred = boost::asio::write(s, buffers, error);
  213. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  214. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  215. BOOST_ASIO_CHECK(!error);
  216. s.reset();
  217. s.next_write_length(10);
  218. bytes_transferred = boost::asio::write(s, buffers, error);
  219. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  220. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  221. BOOST_ASIO_CHECK(!error);
  222. }
  223. void test_3_arg_nothrow_mutable_buffers_1_write()
  224. {
  225. boost::asio::io_service ios;
  226. test_stream s(ios);
  227. boost::asio::mutable_buffers_1 buffers
  228. = boost::asio::buffer(mutable_write_data, sizeof(mutable_write_data));
  229. s.reset();
  230. boost::system::error_code error;
  231. size_t bytes_transferred = boost::asio::write(s, buffers, error);
  232. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  233. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  234. BOOST_ASIO_CHECK(!error);
  235. s.reset();
  236. s.next_write_length(1);
  237. bytes_transferred = boost::asio::write(s, buffers, error);
  238. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  239. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  240. BOOST_ASIO_CHECK(!error);
  241. s.reset();
  242. s.next_write_length(10);
  243. bytes_transferred = boost::asio::write(s, buffers, error);
  244. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  245. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  246. BOOST_ASIO_CHECK(!error);
  247. }
  248. void test_3_arg_nothrow_vector_buffers_write()
  249. {
  250. boost::asio::io_service ios;
  251. test_stream s(ios);
  252. std::vector<boost::asio::const_buffer> buffers;
  253. buffers.push_back(boost::asio::buffer(write_data, 32));
  254. buffers.push_back(boost::asio::buffer(write_data) + 32);
  255. s.reset();
  256. boost::system::error_code error;
  257. size_t bytes_transferred = boost::asio::write(s, buffers, error);
  258. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  259. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  260. BOOST_ASIO_CHECK(!error);
  261. s.reset();
  262. s.next_write_length(1);
  263. bytes_transferred = boost::asio::write(s, buffers, error);
  264. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  265. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  266. BOOST_ASIO_CHECK(!error);
  267. s.reset();
  268. s.next_write_length(10);
  269. bytes_transferred = boost::asio::write(s, buffers, error);
  270. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  271. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  272. BOOST_ASIO_CHECK(!error);
  273. }
  274. bool old_style_transfer_all(const boost::system::error_code& ec,
  275. size_t /*bytes_transferred*/)
  276. {
  277. return !!ec;
  278. }
  279. size_t short_transfer(const boost::system::error_code& ec,
  280. size_t /*bytes_transferred*/)
  281. {
  282. return !!ec ? 0 : 3;
  283. }
  284. void test_3_arg_const_buffers_1_write()
  285. {
  286. boost::asio::io_service ios;
  287. test_stream s(ios);
  288. boost::asio::const_buffers_1 buffers
  289. = boost::asio::buffer(write_data, sizeof(write_data));
  290. s.reset();
  291. size_t bytes_transferred = boost::asio::write(s, buffers,
  292. boost::asio::transfer_all());
  293. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  294. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  295. s.reset();
  296. s.next_write_length(1);
  297. bytes_transferred = boost::asio::write(s, buffers,
  298. boost::asio::transfer_all());
  299. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  300. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  301. s.reset();
  302. s.next_write_length(10);
  303. bytes_transferred = boost::asio::write(s, buffers,
  304. boost::asio::transfer_all());
  305. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  306. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  307. s.reset();
  308. bytes_transferred = boost::asio::write(s, buffers,
  309. boost::asio::transfer_at_least(1));
  310. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  311. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  312. s.reset();
  313. s.next_write_length(1);
  314. bytes_transferred = boost::asio::write(s, buffers,
  315. boost::asio::transfer_at_least(1));
  316. BOOST_ASIO_CHECK(bytes_transferred == 1);
  317. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  318. s.reset();
  319. s.next_write_length(10);
  320. bytes_transferred = boost::asio::write(s, buffers,
  321. boost::asio::transfer_at_least(1));
  322. BOOST_ASIO_CHECK(bytes_transferred == 10);
  323. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  324. s.reset();
  325. bytes_transferred = boost::asio::write(s, buffers,
  326. boost::asio::transfer_at_least(10));
  327. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  328. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  329. s.reset();
  330. s.next_write_length(1);
  331. bytes_transferred = boost::asio::write(s, buffers,
  332. boost::asio::transfer_at_least(10));
  333. BOOST_ASIO_CHECK(bytes_transferred == 10);
  334. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  335. s.reset();
  336. s.next_write_length(10);
  337. bytes_transferred = boost::asio::write(s, buffers,
  338. boost::asio::transfer_at_least(10));
  339. BOOST_ASIO_CHECK(bytes_transferred == 10);
  340. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  341. s.reset();
  342. bytes_transferred = boost::asio::write(s, buffers,
  343. boost::asio::transfer_at_least(42));
  344. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  345. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  346. s.reset();
  347. s.next_write_length(1);
  348. bytes_transferred = boost::asio::write(s, buffers,
  349. boost::asio::transfer_at_least(42));
  350. BOOST_ASIO_CHECK(bytes_transferred == 42);
  351. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  352. s.reset();
  353. s.next_write_length(10);
  354. bytes_transferred = boost::asio::write(s, buffers,
  355. boost::asio::transfer_at_least(42));
  356. BOOST_ASIO_CHECK(bytes_transferred == 50);
  357. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  358. s.reset();
  359. bytes_transferred = boost::asio::write(s, buffers,
  360. boost::asio::transfer_exactly(1));
  361. BOOST_ASIO_CHECK(bytes_transferred == 1);
  362. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  363. s.reset();
  364. s.next_write_length(1);
  365. bytes_transferred = boost::asio::write(s, buffers,
  366. boost::asio::transfer_exactly(1));
  367. BOOST_ASIO_CHECK(bytes_transferred == 1);
  368. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  369. s.reset();
  370. s.next_write_length(10);
  371. bytes_transferred = boost::asio::write(s, buffers,
  372. boost::asio::transfer_exactly(1));
  373. BOOST_ASIO_CHECK(bytes_transferred == 1);
  374. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  375. s.reset();
  376. bytes_transferred = boost::asio::write(s, buffers,
  377. boost::asio::transfer_exactly(10));
  378. BOOST_ASIO_CHECK(bytes_transferred == 10);
  379. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  380. s.reset();
  381. s.next_write_length(1);
  382. bytes_transferred = boost::asio::write(s, buffers,
  383. boost::asio::transfer_exactly(10));
  384. BOOST_ASIO_CHECK(bytes_transferred == 10);
  385. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  386. s.reset();
  387. s.next_write_length(10);
  388. bytes_transferred = boost::asio::write(s, buffers,
  389. boost::asio::transfer_exactly(10));
  390. BOOST_ASIO_CHECK(bytes_transferred == 10);
  391. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  392. s.reset();
  393. bytes_transferred = boost::asio::write(s, buffers,
  394. boost::asio::transfer_exactly(42));
  395. BOOST_ASIO_CHECK(bytes_transferred == 42);
  396. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  397. s.reset();
  398. s.next_write_length(1);
  399. bytes_transferred = boost::asio::write(s, buffers,
  400. boost::asio::transfer_exactly(42));
  401. BOOST_ASIO_CHECK(bytes_transferred == 42);
  402. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  403. s.reset();
  404. s.next_write_length(10);
  405. bytes_transferred = boost::asio::write(s, buffers,
  406. boost::asio::transfer_exactly(42));
  407. BOOST_ASIO_CHECK(bytes_transferred == 42);
  408. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  409. s.reset();
  410. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  411. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  412. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  413. s.reset();
  414. s.next_write_length(1);
  415. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  416. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  417. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  418. s.reset();
  419. s.next_write_length(10);
  420. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  421. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  422. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  423. s.reset();
  424. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  425. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  426. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  427. s.reset();
  428. s.next_write_length(1);
  429. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  430. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  431. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  432. s.reset();
  433. s.next_write_length(10);
  434. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  435. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  436. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  437. }
  438. void test_3_arg_mutable_buffers_1_write()
  439. {
  440. boost::asio::io_service ios;
  441. test_stream s(ios);
  442. boost::asio::mutable_buffers_1 buffers
  443. = boost::asio::buffer(mutable_write_data, sizeof(mutable_write_data));
  444. s.reset();
  445. size_t bytes_transferred = boost::asio::write(s, buffers,
  446. boost::asio::transfer_all());
  447. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  448. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  449. s.reset();
  450. s.next_write_length(1);
  451. bytes_transferred = boost::asio::write(s, buffers,
  452. boost::asio::transfer_all());
  453. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  454. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  455. s.reset();
  456. s.next_write_length(10);
  457. bytes_transferred = boost::asio::write(s, buffers,
  458. boost::asio::transfer_all());
  459. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  460. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  461. s.reset();
  462. bytes_transferred = boost::asio::write(s, buffers,
  463. boost::asio::transfer_at_least(1));
  464. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  465. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  466. s.reset();
  467. s.next_write_length(1);
  468. bytes_transferred = boost::asio::write(s, buffers,
  469. boost::asio::transfer_at_least(1));
  470. BOOST_ASIO_CHECK(bytes_transferred == 1);
  471. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  472. s.reset();
  473. s.next_write_length(10);
  474. bytes_transferred = boost::asio::write(s, buffers,
  475. boost::asio::transfer_at_least(1));
  476. BOOST_ASIO_CHECK(bytes_transferred == 10);
  477. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  478. s.reset();
  479. bytes_transferred = boost::asio::write(s, buffers,
  480. boost::asio::transfer_at_least(10));
  481. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  482. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  483. s.reset();
  484. s.next_write_length(1);
  485. bytes_transferred = boost::asio::write(s, buffers,
  486. boost::asio::transfer_at_least(10));
  487. BOOST_ASIO_CHECK(bytes_transferred == 10);
  488. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  489. s.reset();
  490. s.next_write_length(10);
  491. bytes_transferred = boost::asio::write(s, buffers,
  492. boost::asio::transfer_at_least(10));
  493. BOOST_ASIO_CHECK(bytes_transferred == 10);
  494. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  495. s.reset();
  496. bytes_transferred = boost::asio::write(s, buffers,
  497. boost::asio::transfer_at_least(42));
  498. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  499. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  500. s.reset();
  501. s.next_write_length(1);
  502. bytes_transferred = boost::asio::write(s, buffers,
  503. boost::asio::transfer_at_least(42));
  504. BOOST_ASIO_CHECK(bytes_transferred == 42);
  505. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  506. s.reset();
  507. s.next_write_length(10);
  508. bytes_transferred = boost::asio::write(s, buffers,
  509. boost::asio::transfer_at_least(42));
  510. BOOST_ASIO_CHECK(bytes_transferred == 50);
  511. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  512. s.reset();
  513. bytes_transferred = boost::asio::write(s, buffers,
  514. boost::asio::transfer_exactly(1));
  515. BOOST_ASIO_CHECK(bytes_transferred == 1);
  516. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  517. s.reset();
  518. s.next_write_length(1);
  519. bytes_transferred = boost::asio::write(s, buffers,
  520. boost::asio::transfer_exactly(1));
  521. BOOST_ASIO_CHECK(bytes_transferred == 1);
  522. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  523. s.reset();
  524. s.next_write_length(10);
  525. bytes_transferred = boost::asio::write(s, buffers,
  526. boost::asio::transfer_exactly(1));
  527. BOOST_ASIO_CHECK(bytes_transferred == 1);
  528. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  529. s.reset();
  530. bytes_transferred = boost::asio::write(s, buffers,
  531. boost::asio::transfer_exactly(10));
  532. BOOST_ASIO_CHECK(bytes_transferred == 10);
  533. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  534. s.reset();
  535. s.next_write_length(1);
  536. bytes_transferred = boost::asio::write(s, buffers,
  537. boost::asio::transfer_exactly(10));
  538. BOOST_ASIO_CHECK(bytes_transferred == 10);
  539. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  540. s.reset();
  541. s.next_write_length(10);
  542. bytes_transferred = boost::asio::write(s, buffers,
  543. boost::asio::transfer_exactly(10));
  544. BOOST_ASIO_CHECK(bytes_transferred == 10);
  545. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  546. s.reset();
  547. bytes_transferred = boost::asio::write(s, buffers,
  548. boost::asio::transfer_exactly(42));
  549. BOOST_ASIO_CHECK(bytes_transferred == 42);
  550. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  551. s.reset();
  552. s.next_write_length(1);
  553. bytes_transferred = boost::asio::write(s, buffers,
  554. boost::asio::transfer_exactly(42));
  555. BOOST_ASIO_CHECK(bytes_transferred == 42);
  556. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  557. s.reset();
  558. s.next_write_length(10);
  559. bytes_transferred = boost::asio::write(s, buffers,
  560. boost::asio::transfer_exactly(42));
  561. BOOST_ASIO_CHECK(bytes_transferred == 42);
  562. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  563. s.reset();
  564. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  565. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  566. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  567. s.reset();
  568. s.next_write_length(1);
  569. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  570. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  571. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  572. s.reset();
  573. s.next_write_length(10);
  574. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  575. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  576. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  577. s.reset();
  578. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  579. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  580. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  581. s.reset();
  582. s.next_write_length(1);
  583. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  584. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  585. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  586. s.reset();
  587. s.next_write_length(10);
  588. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  589. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  590. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  591. }
  592. void test_3_arg_vector_buffers_write()
  593. {
  594. boost::asio::io_service ios;
  595. test_stream s(ios);
  596. std::vector<boost::asio::const_buffer> buffers;
  597. buffers.push_back(boost::asio::buffer(write_data, 32));
  598. buffers.push_back(boost::asio::buffer(write_data) + 32);
  599. s.reset();
  600. size_t bytes_transferred = boost::asio::write(s, buffers,
  601. boost::asio::transfer_all());
  602. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  603. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  604. s.reset();
  605. s.next_write_length(1);
  606. bytes_transferred = boost::asio::write(s, buffers,
  607. boost::asio::transfer_all());
  608. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  609. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  610. s.reset();
  611. s.next_write_length(10);
  612. bytes_transferred = boost::asio::write(s, buffers,
  613. boost::asio::transfer_all());
  614. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  615. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  616. s.reset();
  617. bytes_transferred = boost::asio::write(s, buffers,
  618. boost::asio::transfer_at_least(1));
  619. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  620. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  621. s.reset();
  622. s.next_write_length(1);
  623. bytes_transferred = boost::asio::write(s, buffers,
  624. boost::asio::transfer_at_least(1));
  625. BOOST_ASIO_CHECK(bytes_transferred == 1);
  626. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  627. s.reset();
  628. s.next_write_length(10);
  629. bytes_transferred = boost::asio::write(s, buffers,
  630. boost::asio::transfer_at_least(1));
  631. BOOST_ASIO_CHECK(bytes_transferred == 10);
  632. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  633. s.reset();
  634. bytes_transferred = boost::asio::write(s, buffers,
  635. boost::asio::transfer_at_least(10));
  636. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  637. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  638. s.reset();
  639. s.next_write_length(1);
  640. bytes_transferred = boost::asio::write(s, buffers,
  641. boost::asio::transfer_at_least(10));
  642. BOOST_ASIO_CHECK(bytes_transferred == 10);
  643. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  644. s.reset();
  645. s.next_write_length(10);
  646. bytes_transferred = boost::asio::write(s, buffers,
  647. boost::asio::transfer_at_least(10));
  648. BOOST_ASIO_CHECK(bytes_transferred == 10);
  649. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  650. s.reset();
  651. bytes_transferred = boost::asio::write(s, buffers,
  652. boost::asio::transfer_at_least(42));
  653. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  654. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  655. s.reset();
  656. s.next_write_length(1);
  657. bytes_transferred = boost::asio::write(s, buffers,
  658. boost::asio::transfer_at_least(42));
  659. BOOST_ASIO_CHECK(bytes_transferred == 42);
  660. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  661. s.reset();
  662. s.next_write_length(10);
  663. bytes_transferred = boost::asio::write(s, buffers,
  664. boost::asio::transfer_at_least(42));
  665. BOOST_ASIO_CHECK(bytes_transferred == 50);
  666. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  667. s.reset();
  668. bytes_transferred = boost::asio::write(s, buffers,
  669. boost::asio::transfer_exactly(1));
  670. BOOST_ASIO_CHECK(bytes_transferred == 1);
  671. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  672. s.reset();
  673. s.next_write_length(1);
  674. bytes_transferred = boost::asio::write(s, buffers,
  675. boost::asio::transfer_exactly(1));
  676. BOOST_ASIO_CHECK(bytes_transferred == 1);
  677. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  678. s.reset();
  679. s.next_write_length(10);
  680. bytes_transferred = boost::asio::write(s, buffers,
  681. boost::asio::transfer_exactly(1));
  682. BOOST_ASIO_CHECK(bytes_transferred == 1);
  683. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  684. s.reset();
  685. bytes_transferred = boost::asio::write(s, buffers,
  686. boost::asio::transfer_exactly(10));
  687. BOOST_ASIO_CHECK(bytes_transferred == 10);
  688. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  689. s.reset();
  690. s.next_write_length(1);
  691. bytes_transferred = boost::asio::write(s, buffers,
  692. boost::asio::transfer_exactly(10));
  693. BOOST_ASIO_CHECK(bytes_transferred == 10);
  694. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  695. s.reset();
  696. s.next_write_length(10);
  697. bytes_transferred = boost::asio::write(s, buffers,
  698. boost::asio::transfer_exactly(10));
  699. BOOST_ASIO_CHECK(bytes_transferred == 10);
  700. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  701. s.reset();
  702. bytes_transferred = boost::asio::write(s, buffers,
  703. boost::asio::transfer_exactly(42));
  704. BOOST_ASIO_CHECK(bytes_transferred == 42);
  705. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  706. s.reset();
  707. s.next_write_length(1);
  708. bytes_transferred = boost::asio::write(s, buffers,
  709. boost::asio::transfer_exactly(42));
  710. BOOST_ASIO_CHECK(bytes_transferred == 42);
  711. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  712. s.reset();
  713. s.next_write_length(10);
  714. bytes_transferred = boost::asio::write(s, buffers,
  715. boost::asio::transfer_exactly(42));
  716. BOOST_ASIO_CHECK(bytes_transferred == 42);
  717. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  718. s.reset();
  719. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  720. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  721. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  722. s.reset();
  723. s.next_write_length(1);
  724. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  725. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  726. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  727. s.reset();
  728. s.next_write_length(10);
  729. bytes_transferred = boost::asio::write(s, buffers, old_style_transfer_all);
  730. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  731. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  732. s.reset();
  733. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  734. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  735. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  736. s.reset();
  737. s.next_write_length(1);
  738. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  739. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  740. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  741. s.reset();
  742. s.next_write_length(10);
  743. bytes_transferred = boost::asio::write(s, buffers, short_transfer);
  744. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  745. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  746. }
  747. void test_4_arg_const_buffers_1_write()
  748. {
  749. boost::asio::io_service ios;
  750. test_stream s(ios);
  751. boost::asio::const_buffers_1 buffers
  752. = boost::asio::buffer(write_data, sizeof(write_data));
  753. s.reset();
  754. boost::system::error_code error;
  755. size_t bytes_transferred = boost::asio::write(s, buffers,
  756. boost::asio::transfer_all(), error);
  757. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  758. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  759. BOOST_ASIO_CHECK(!error);
  760. s.reset();
  761. s.next_write_length(1);
  762. error = boost::system::error_code();
  763. bytes_transferred = boost::asio::write(s, buffers,
  764. boost::asio::transfer_all(), error);
  765. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  766. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  767. BOOST_ASIO_CHECK(!error);
  768. s.reset();
  769. s.next_write_length(10);
  770. error = boost::system::error_code();
  771. bytes_transferred = boost::asio::write(s, buffers,
  772. boost::asio::transfer_all(), error);
  773. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  774. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  775. BOOST_ASIO_CHECK(!error);
  776. s.reset();
  777. error = boost::system::error_code();
  778. bytes_transferred = boost::asio::write(s, buffers,
  779. boost::asio::transfer_at_least(1), error);
  780. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  781. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  782. BOOST_ASIO_CHECK(!error);
  783. s.reset();
  784. s.next_write_length(1);
  785. error = boost::system::error_code();
  786. bytes_transferred = boost::asio::write(s, buffers,
  787. boost::asio::transfer_at_least(1), error);
  788. BOOST_ASIO_CHECK(bytes_transferred == 1);
  789. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  790. BOOST_ASIO_CHECK(!error);
  791. s.reset();
  792. s.next_write_length(10);
  793. error = boost::system::error_code();
  794. bytes_transferred = boost::asio::write(s, buffers,
  795. boost::asio::transfer_at_least(1), error);
  796. BOOST_ASIO_CHECK(bytes_transferred == 10);
  797. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  798. BOOST_ASIO_CHECK(!error);
  799. s.reset();
  800. error = boost::system::error_code();
  801. bytes_transferred = boost::asio::write(s, buffers,
  802. boost::asio::transfer_at_least(10), error);
  803. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  804. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  805. BOOST_ASIO_CHECK(!error);
  806. s.reset();
  807. s.next_write_length(1);
  808. error = boost::system::error_code();
  809. bytes_transferred = boost::asio::write(s, buffers,
  810. boost::asio::transfer_at_least(10), error);
  811. BOOST_ASIO_CHECK(bytes_transferred == 10);
  812. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  813. BOOST_ASIO_CHECK(!error);
  814. s.reset();
  815. s.next_write_length(10);
  816. error = boost::system::error_code();
  817. bytes_transferred = boost::asio::write(s, buffers,
  818. boost::asio::transfer_at_least(10), error);
  819. BOOST_ASIO_CHECK(bytes_transferred == 10);
  820. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  821. BOOST_ASIO_CHECK(!error);
  822. s.reset();
  823. error = boost::system::error_code();
  824. bytes_transferred = boost::asio::write(s, buffers,
  825. boost::asio::transfer_at_least(42), error);
  826. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  827. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  828. BOOST_ASIO_CHECK(!error);
  829. s.reset();
  830. s.next_write_length(1);
  831. error = boost::system::error_code();
  832. bytes_transferred = boost::asio::write(s, buffers,
  833. boost::asio::transfer_at_least(42), error);
  834. BOOST_ASIO_CHECK(bytes_transferred == 42);
  835. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  836. BOOST_ASIO_CHECK(!error);
  837. s.reset();
  838. s.next_write_length(10);
  839. error = boost::system::error_code();
  840. bytes_transferred = boost::asio::write(s, buffers,
  841. boost::asio::transfer_at_least(42), error);
  842. BOOST_ASIO_CHECK(bytes_transferred == 50);
  843. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  844. BOOST_ASIO_CHECK(!error);
  845. s.reset();
  846. error = boost::system::error_code();
  847. bytes_transferred = boost::asio::write(s, buffers,
  848. boost::asio::transfer_exactly(1), error);
  849. BOOST_ASIO_CHECK(bytes_transferred == 1);
  850. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  851. BOOST_ASIO_CHECK(!error);
  852. s.reset();
  853. s.next_write_length(1);
  854. error = boost::system::error_code();
  855. bytes_transferred = boost::asio::write(s, buffers,
  856. boost::asio::transfer_exactly(1), error);
  857. BOOST_ASIO_CHECK(bytes_transferred == 1);
  858. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  859. BOOST_ASIO_CHECK(!error);
  860. s.reset();
  861. s.next_write_length(10);
  862. error = boost::system::error_code();
  863. bytes_transferred = boost::asio::write(s, buffers,
  864. boost::asio::transfer_exactly(1), error);
  865. BOOST_ASIO_CHECK(bytes_transferred == 1);
  866. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  867. BOOST_ASIO_CHECK(!error);
  868. s.reset();
  869. error = boost::system::error_code();
  870. bytes_transferred = boost::asio::write(s, buffers,
  871. boost::asio::transfer_exactly(10), error);
  872. BOOST_ASIO_CHECK(bytes_transferred == 10);
  873. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  874. BOOST_ASIO_CHECK(!error);
  875. s.reset();
  876. s.next_write_length(1);
  877. error = boost::system::error_code();
  878. bytes_transferred = boost::asio::write(s, buffers,
  879. boost::asio::transfer_exactly(10), error);
  880. BOOST_ASIO_CHECK(bytes_transferred == 10);
  881. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  882. BOOST_ASIO_CHECK(!error);
  883. s.reset();
  884. s.next_write_length(10);
  885. error = boost::system::error_code();
  886. bytes_transferred = boost::asio::write(s, buffers,
  887. boost::asio::transfer_exactly(10), error);
  888. BOOST_ASIO_CHECK(bytes_transferred == 10);
  889. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  890. BOOST_ASIO_CHECK(!error);
  891. s.reset();
  892. error = boost::system::error_code();
  893. bytes_transferred = boost::asio::write(s, buffers,
  894. boost::asio::transfer_exactly(42), error);
  895. BOOST_ASIO_CHECK(bytes_transferred == 42);
  896. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  897. BOOST_ASIO_CHECK(!error);
  898. s.reset();
  899. s.next_write_length(1);
  900. error = boost::system::error_code();
  901. bytes_transferred = boost::asio::write(s, buffers,
  902. boost::asio::transfer_exactly(42), error);
  903. BOOST_ASIO_CHECK(bytes_transferred == 42);
  904. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  905. BOOST_ASIO_CHECK(!error);
  906. s.reset();
  907. s.next_write_length(10);
  908. error = boost::system::error_code();
  909. bytes_transferred = boost::asio::write(s, buffers,
  910. boost::asio::transfer_exactly(42), error);
  911. BOOST_ASIO_CHECK(bytes_transferred == 42);
  912. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  913. BOOST_ASIO_CHECK(!error);
  914. s.reset();
  915. bytes_transferred = boost::asio::write(s, buffers,
  916. old_style_transfer_all, error);
  917. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  918. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  919. BOOST_ASIO_CHECK(!error);
  920. s.reset();
  921. s.next_write_length(1);
  922. error = boost::system::error_code();
  923. bytes_transferred = boost::asio::write(s, buffers,
  924. old_style_transfer_all, error);
  925. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  926. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  927. BOOST_ASIO_CHECK(!error);
  928. s.reset();
  929. s.next_write_length(10);
  930. error = boost::system::error_code();
  931. bytes_transferred = boost::asio::write(s, buffers,
  932. old_style_transfer_all, error);
  933. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  934. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  935. BOOST_ASIO_CHECK(!error);
  936. s.reset();
  937. bytes_transferred = boost::asio::write(s, buffers, short_transfer, error);
  938. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  939. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  940. BOOST_ASIO_CHECK(!error);
  941. s.reset();
  942. s.next_write_length(1);
  943. error = boost::system::error_code();
  944. bytes_transferred = boost::asio::write(s, buffers, short_transfer, error);
  945. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  946. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  947. BOOST_ASIO_CHECK(!error);
  948. s.reset();
  949. s.next_write_length(10);
  950. error = boost::system::error_code();
  951. bytes_transferred = boost::asio::write(s, buffers, short_transfer, error);
  952. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  953. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  954. BOOST_ASIO_CHECK(!error);
  955. }
  956. void test_4_arg_mutable_buffers_1_write()
  957. {
  958. boost::asio::io_service ios;
  959. test_stream s(ios);
  960. boost::asio::mutable_buffers_1 buffers
  961. = boost::asio::buffer(mutable_write_data, sizeof(mutable_write_data));
  962. s.reset();
  963. boost::system::error_code error;
  964. size_t bytes_transferred = boost::asio::write(s, buffers,
  965. boost::asio::transfer_all(), error);
  966. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  967. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  968. BOOST_ASIO_CHECK(!error);
  969. s.reset();
  970. s.next_write_length(1);
  971. error = boost::system::error_code();
  972. bytes_transferred = boost::asio::write(s, buffers,
  973. boost::asio::transfer_all(), error);
  974. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  975. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  976. BOOST_ASIO_CHECK(!error);
  977. s.reset();
  978. s.next_write_length(10);
  979. error = boost::system::error_code();
  980. bytes_transferred = boost::asio::write(s, buffers,
  981. boost::asio::transfer_all(), error);
  982. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  983. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  984. BOOST_ASIO_CHECK(!error);
  985. s.reset();
  986. error = boost::system::error_code();
  987. bytes_transferred = boost::asio::write(s, buffers,
  988. boost::asio::transfer_at_least(1), error);
  989. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  990. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  991. BOOST_ASIO_CHECK(!error);
  992. s.reset();
  993. s.next_write_length(1);
  994. error = boost::system::error_code();
  995. bytes_transferred = boost::asio::write(s, buffers,
  996. boost::asio::transfer_at_least(1), error);
  997. BOOST_ASIO_CHECK(bytes_transferred == 1);
  998. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  999. BOOST_ASIO_CHECK(!error);
  1000. s.reset();
  1001. s.next_write_length(10);
  1002. error = boost::system::error_code();
  1003. bytes_transferred = boost::asio::write(s, buffers,
  1004. boost::asio::transfer_at_least(1), error);
  1005. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1006. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1007. BOOST_ASIO_CHECK(!error);
  1008. s.reset();
  1009. error = boost::system::error_code();
  1010. bytes_transferred = boost::asio::write(s, buffers,
  1011. boost::asio::transfer_at_least(10), error);
  1012. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  1013. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  1014. BOOST_ASIO_CHECK(!error);
  1015. s.reset();
  1016. s.next_write_length(1);
  1017. error = boost::system::error_code();
  1018. bytes_transferred = boost::asio::write(s, buffers,
  1019. boost::asio::transfer_at_least(10), error);
  1020. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1021. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1022. BOOST_ASIO_CHECK(!error);
  1023. s.reset();
  1024. s.next_write_length(10);
  1025. error = boost::system::error_code();
  1026. bytes_transferred = boost::asio::write(s, buffers,
  1027. boost::asio::transfer_at_least(10), error);
  1028. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1029. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1030. BOOST_ASIO_CHECK(!error);
  1031. s.reset();
  1032. error = boost::system::error_code();
  1033. bytes_transferred = boost::asio::write(s, buffers,
  1034. boost::asio::transfer_at_least(42), error);
  1035. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  1036. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  1037. BOOST_ASIO_CHECK(!error);
  1038. s.reset();
  1039. s.next_write_length(1);
  1040. error = boost::system::error_code();
  1041. bytes_transferred = boost::asio::write(s, buffers,
  1042. boost::asio::transfer_at_least(42), error);
  1043. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1044. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1045. BOOST_ASIO_CHECK(!error);
  1046. s.reset();
  1047. s.next_write_length(10);
  1048. error = boost::system::error_code();
  1049. bytes_transferred = boost::asio::write(s, buffers,
  1050. boost::asio::transfer_at_least(42), error);
  1051. BOOST_ASIO_CHECK(bytes_transferred == 50);
  1052. BOOST_ASIO_CHECK(s.check_buffers(buffers, 50));
  1053. BOOST_ASIO_CHECK(!error);
  1054. s.reset();
  1055. error = boost::system::error_code();
  1056. bytes_transferred = boost::asio::write(s, buffers,
  1057. boost::asio::transfer_exactly(1), error);
  1058. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1059. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1060. BOOST_ASIO_CHECK(!error);
  1061. s.reset();
  1062. s.next_write_length(1);
  1063. error = boost::system::error_code();
  1064. bytes_transferred = boost::asio::write(s, buffers,
  1065. boost::asio::transfer_exactly(1), error);
  1066. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1067. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1068. BOOST_ASIO_CHECK(!error);
  1069. s.reset();
  1070. s.next_write_length(10);
  1071. error = boost::system::error_code();
  1072. bytes_transferred = boost::asio::write(s, buffers,
  1073. boost::asio::transfer_exactly(1), error);
  1074. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1075. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1076. BOOST_ASIO_CHECK(!error);
  1077. s.reset();
  1078. error = boost::system::error_code();
  1079. bytes_transferred = boost::asio::write(s, buffers,
  1080. boost::asio::transfer_exactly(10), error);
  1081. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1082. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1083. BOOST_ASIO_CHECK(!error);
  1084. s.reset();
  1085. s.next_write_length(1);
  1086. error = boost::system::error_code();
  1087. bytes_transferred = boost::asio::write(s, buffers,
  1088. boost::asio::transfer_exactly(10), error);
  1089. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1090. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1091. BOOST_ASIO_CHECK(!error);
  1092. s.reset();
  1093. s.next_write_length(10);
  1094. error = boost::system::error_code();
  1095. bytes_transferred = boost::asio::write(s, buffers,
  1096. boost::asio::transfer_exactly(10), error);
  1097. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1098. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1099. BOOST_ASIO_CHECK(!error);
  1100. s.reset();
  1101. error = boost::system::error_code();
  1102. bytes_transferred = boost::asio::write(s, buffers,
  1103. boost::asio::transfer_exactly(42), error);
  1104. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1105. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1106. BOOST_ASIO_CHECK(!error);
  1107. s.reset();
  1108. s.next_write_length(1);
  1109. error = boost::system::error_code();
  1110. bytes_transferred = boost::asio::write(s, buffers,
  1111. boost::asio::transfer_exactly(42), error);
  1112. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1113. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1114. BOOST_ASIO_CHECK(!error);
  1115. s.reset();
  1116. s.next_write_length(10);
  1117. error = boost::system::error_code();
  1118. bytes_transferred = boost::asio::write(s, buffers,
  1119. boost::asio::transfer_exactly(42), error);
  1120. BOOST_ASIO_CHECK(bytes_transferred == 42);
  1121. BOOST_ASIO_CHECK(s.check_buffers(buffers, 42));
  1122. BOOST_ASIO_CHECK(!error);
  1123. s.reset();
  1124. bytes_transferred = boost::asio::write(s, buffers,
  1125. old_style_transfer_all, error);
  1126. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  1127. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  1128. BOOST_ASIO_CHECK(!error);
  1129. s.reset();
  1130. s.next_write_length(1);
  1131. error = boost::system::error_code();
  1132. bytes_transferred = boost::asio::write(s, buffers,
  1133. old_style_transfer_all, error);
  1134. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  1135. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  1136. BOOST_ASIO_CHECK(!error);
  1137. s.reset();
  1138. s.next_write_length(10);
  1139. error = boost::system::error_code();
  1140. bytes_transferred = boost::asio::write(s, buffers,
  1141. old_style_transfer_all, error);
  1142. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  1143. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  1144. BOOST_ASIO_CHECK(!error);
  1145. s.reset();
  1146. bytes_transferred = boost::asio::write(s, buffers, short_transfer, error);
  1147. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  1148. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  1149. BOOST_ASIO_CHECK(!error);
  1150. s.reset();
  1151. s.next_write_length(1);
  1152. error = boost::system::error_code();
  1153. bytes_transferred = boost::asio::write(s, buffers, short_transfer, error);
  1154. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  1155. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  1156. BOOST_ASIO_CHECK(!error);
  1157. s.reset();
  1158. s.next_write_length(10);
  1159. error = boost::system::error_code();
  1160. bytes_transferred = boost::asio::write(s, buffers, short_transfer, error);
  1161. BOOST_ASIO_CHECK(bytes_transferred == sizeof(mutable_write_data));
  1162. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(mutable_write_data)));
  1163. BOOST_ASIO_CHECK(!error);
  1164. }
  1165. void test_4_arg_vector_buffers_write()
  1166. {
  1167. boost::asio::io_service ios;
  1168. test_stream s(ios);
  1169. std::vector<boost::asio::const_buffer> buffers;
  1170. buffers.push_back(boost::asio::buffer(write_data, 32));
  1171. buffers.push_back(boost::asio::buffer(write_data) + 32);
  1172. s.reset();
  1173. boost::system::error_code error;
  1174. size_t bytes_transferred = boost::asio::write(s, buffers,
  1175. boost::asio::transfer_all(), error);
  1176. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  1177. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  1178. BOOST_ASIO_CHECK(!error);
  1179. s.reset();
  1180. s.next_write_length(1);
  1181. error = boost::system::error_code();
  1182. bytes_transferred = boost::asio::write(s, buffers,
  1183. boost::asio::transfer_all(), error);
  1184. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  1185. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  1186. BOOST_ASIO_CHECK(!error);
  1187. s.reset();
  1188. s.next_write_length(10);
  1189. error = boost::system::error_code();
  1190. bytes_transferred = boost::asio::write(s, buffers,
  1191. boost::asio::transfer_all(), error);
  1192. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  1193. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  1194. BOOST_ASIO_CHECK(!error);
  1195. s.reset();
  1196. error = boost::system::error_code();
  1197. bytes_transferred = boost::asio::write(s, buffers,
  1198. boost::asio::transfer_at_least(1), error);
  1199. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  1200. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  1201. BOOST_ASIO_CHECK(!error);
  1202. s.reset();
  1203. s.next_write_length(1);
  1204. error = boost::system::error_code();
  1205. bytes_transferred = boost::asio::write(s, buffers,
  1206. boost::asio::transfer_at_least(1), error);
  1207. BOOST_ASIO_CHECK(bytes_transferred == 1);
  1208. BOOST_ASIO_CHECK(s.check_buffers(buffers, 1));
  1209. BOOST_ASIO_CHECK(!error);
  1210. s.reset();
  1211. s.next_write_length(10);
  1212. error = boost::system::error_code();
  1213. bytes_transferred = boost::asio::write(s, buffers,
  1214. boost::asio::transfer_at_least(1), error);
  1215. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1216. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1217. BOOST_ASIO_CHECK(!error);
  1218. s.reset();
  1219. error = boost::system::error_code();
  1220. bytes_transferred = boost::asio::write(s, buffers,
  1221. boost::asio::transfer_at_least(10), error);
  1222. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  1223. BOOST_ASIO_CHECK(s.check_buffers(buffers, sizeof(write_data)));
  1224. BOOST_ASIO_CHECK(!error);
  1225. s.reset();
  1226. s.next_write_length(1);
  1227. error = boost::system::error_code();
  1228. bytes_transferred = boost::asio::write(s, buffers,
  1229. boost::asio::transfer_at_least(10), error);
  1230. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1231. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1232. BOOST_ASIO_CHECK(!error);
  1233. s.reset();
  1234. s.next_write_length(10);
  1235. error = boost::system::error_code();
  1236. bytes_transferred = boost::asio::write(s, buffers,
  1237. boost::asio::transfer_at_least(10), error);
  1238. BOOST_ASIO_CHECK(bytes_transferred == 10);
  1239. BOOST_ASIO_CHECK(s.check_buffers(buffers, 10));
  1240. BOOST_ASIO_CHECK(!error);
  1241. s.reset();
  1242. error = boost::system::error_code();
  1243. bytes_transferred = boost::asio::write(s, buffers,
  1244. boost::asio::transfer_at_least(42), error);
  1245. BOOST_ASIO_CHECK(bytes_transferred == sizeof(write_data));
  1246. BOOST_ASIO_CHECK(s.check_

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