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