• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 //          Copyright Oliver Kowalke 2013.
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 #include <chrono>
8 #include <sstream>
9 #include <string>
10 #include <vector>
11 
12 #include <boost/assert.hpp>
13 #include <boost/test/unit_test.hpp>
14 
15 #include <boost/fiber/all.hpp>
16 
17 struct moveable {
18     bool    state;
19     int     value;
20 
moveablemoveable21     moveable() :
22         state( false),
23         value( -1) {
24     }
25 
moveablemoveable26     moveable( int v) :
27         state( true),
28         value( v) {
29     }
30 
moveablemoveable31     moveable( moveable && other) :
32         state( other.state),
33         value( other.value) {
34         other.state = false;
35         other.value = -1;
36     }
37 
operator =moveable38     moveable & operator=( moveable && other) {
39         if ( this == & other) return * this;
40         state = other.state;
41         other.state = false;
42         value = other.value;
43         other.value = -1;
44         return * this;
45     }
46 };
47 
test_zero_wm()48 void test_zero_wm() {
49     bool thrown = false;
50     try {
51         boost::fibers::buffered_channel< int > c( 0);
52     } catch ( boost::fibers::fiber_error const&) {
53         thrown = true;
54     }
55     BOOST_CHECK( thrown);
56 }
57 
test_push()58 void test_push() {
59     boost::fibers::buffered_channel< int > c( 16);
60     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 1) );
61 }
62 
test_push_closed()63 void test_push_closed() {
64     boost::fibers::buffered_channel< int > c( 16);
65     c.close();
66     BOOST_CHECK( boost::fibers::channel_op_status::closed == c.push( 1) );
67 }
68 
test_try_push()69 void test_try_push() {
70     boost::fibers::buffered_channel< int > c( 2);
71     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 1) );
72 }
73 
test_try_push_closed()74 void test_try_push_closed() {
75     boost::fibers::buffered_channel< int > c( 2);
76     BOOST_CHECK( boost::fibers::channel_op_status::success == c.try_push( 1) );
77     c.close();
78     BOOST_CHECK( boost::fibers::channel_op_status::closed == c.try_push( 2) );
79 }
80 
test_try_push_full()81 void test_try_push_full() {
82     boost::fibers::buffered_channel< int > c( 2);
83     BOOST_CHECK( boost::fibers::channel_op_status::success == c.try_push( 1) );
84     BOOST_CHECK( boost::fibers::channel_op_status::full == c.try_push( 2) );
85 }
86 
test_push_wait_for()87 void test_push_wait_for() {
88     boost::fibers::buffered_channel< int > c( 2);
89     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push_wait_for( 1, std::chrono::seconds( 1) ) );
90 }
91 
test_push_wait_for_closed()92 void test_push_wait_for_closed() {
93     boost::fibers::buffered_channel< int > c( 2);
94     c.close();
95     BOOST_CHECK( boost::fibers::channel_op_status::closed == c.push_wait_for( 1, std::chrono::seconds( 1) ) );
96 }
97 
test_push_wait_for_timeout()98 void test_push_wait_for_timeout() {
99     boost::fibers::buffered_channel< int > c( 2);
100     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push_wait_for( 1, std::chrono::seconds( 1) ) );
101     BOOST_CHECK( boost::fibers::channel_op_status::timeout == c.push_wait_for( 2, std::chrono::seconds( 1) ) );
102 }
103 
test_push_wait_until()104 void test_push_wait_until() {
105     boost::fibers::buffered_channel< int > c( 2);
106     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push_wait_until( 1,
107                     std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
108 }
109 
test_push_wait_until_closed()110 void test_push_wait_until_closed() {
111     boost::fibers::buffered_channel< int > c( 2);
112     c.close();
113     BOOST_CHECK( boost::fibers::channel_op_status::closed == c.push_wait_until( 1,
114                     std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
115 }
116 
test_push_wait_until_timeout()117 void test_push_wait_until_timeout() {
118     boost::fibers::buffered_channel< int > c( 2);
119     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push_wait_until( 1,
120                     std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
121     BOOST_CHECK( boost::fibers::channel_op_status::timeout == c.push_wait_until( 2,
122                     std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
123 }
124 
test_pop()125 void test_pop() {
126     boost::fibers::buffered_channel< int > c( 16);
127     int v1 = 2, v2 = 0;
128     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
129     BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( v2) );
130     BOOST_CHECK_EQUAL( v1, v2);
131 }
132 
test_pop_closed()133 void test_pop_closed() {
134     boost::fibers::buffered_channel< int > c( 16);
135     int v1 = 2, v2 = 0;
136     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
137     c.close();
138     BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( v2) );
139     BOOST_CHECK_EQUAL( v1, v2);
140     BOOST_CHECK( boost::fibers::channel_op_status::closed == c.pop( v2) );
141 }
142 
test_pop_success()143 void test_pop_success() {
144     boost::fibers::buffered_channel< int > c( 16);
145     int v1 = 2, v2 = 0;
146     boost::fibers::fiber f1( boost::fibers::launch::post, [&c,&v2](){
147         BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( v2) );
148     });
149     boost::fibers::fiber f2( boost::fibers::launch::post, [&c,v1](){
150         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
151     });
152     f1.join();
153     f2.join();
154     BOOST_CHECK_EQUAL( v1, v2);
155 }
156 
test_value_pop()157 void test_value_pop() {
158     boost::fibers::buffered_channel< int > c( 16);
159     int v1 = 2, v2 = 0;
160     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
161     v2 = c.value_pop();
162     BOOST_CHECK_EQUAL( v1, v2);
163 }
164 
test_value_pop_closed()165 void test_value_pop_closed() {
166     boost::fibers::buffered_channel< int > c( 16);
167     int v1 = 2, v2 = 0;
168     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
169     c.close();
170     v2 = c.value_pop();
171     BOOST_CHECK_EQUAL( v1, v2);
172     bool thrown = false;
173     try {
174         c.value_pop();
175     } catch ( boost::fibers::fiber_error const&) {
176         thrown = true;
177     }
178     BOOST_CHECK( thrown);
179 }
180 
test_value_pop_success()181 void test_value_pop_success() {
182     boost::fibers::buffered_channel< int > c( 16);
183     int v1 = 2, v2 = 0;
184     boost::fibers::fiber f1( boost::fibers::launch::post, [&c,&v2](){
185         v2 = c.value_pop();
186     });
187     boost::fibers::fiber f2( boost::fibers::launch::post, [&c,v1](){
188         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
189     });
190     f1.join();
191     f2.join();
192     BOOST_CHECK_EQUAL( v1, v2);
193 }
194 
test_try_pop()195 void test_try_pop() {
196     boost::fibers::buffered_channel< int > c( 16);
197     int v1 = 2, v2 = 0;
198     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
199     BOOST_CHECK( boost::fibers::channel_op_status::success == c.try_pop( v2) );
200     BOOST_CHECK_EQUAL( v1, v2);
201 }
202 
test_try_pop_closed()203 void test_try_pop_closed() {
204     boost::fibers::buffered_channel< int > c( 16);
205     int v1 = 2, v2 = 0;
206     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
207     c.close();
208     BOOST_CHECK( boost::fibers::channel_op_status::success == c.try_pop( v2) );
209     BOOST_CHECK_EQUAL( v1, v2);
210     BOOST_CHECK( boost::fibers::channel_op_status::closed == c.try_pop( v2) );
211 }
212 
test_try_pop_success()213 void test_try_pop_success() {
214     boost::fibers::buffered_channel< int > c( 16);
215     int v1 = 2, v2 = 0;
216     boost::fibers::fiber f1( boost::fibers::launch::post, [&c,&v2](){
217         while ( boost::fibers::channel_op_status::success != c.try_pop( v2) ) {
218             boost::this_fiber::yield();
219         }
220     });
221     boost::fibers::fiber f2( boost::fibers::launch::post, [&c,v1](){
222         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
223     });
224     f1.join();
225     f2.join();
226     BOOST_CHECK_EQUAL( v1, v2);
227 }
228 
test_pop_wait_for()229 void test_pop_wait_for() {
230     boost::fibers::buffered_channel< int > c( 16);
231     int v1 = 2, v2 = 0;
232     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
233     BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_for( v2, std::chrono::seconds( 1) ) );
234     BOOST_CHECK_EQUAL( v1, v2);
235 }
236 
test_pop_wait_for_closed()237 void test_pop_wait_for_closed() {
238     boost::fibers::buffered_channel< int > c( 16);
239     int v1 = 2, v2 = 0;
240     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
241     c.close();
242     BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_for( v2, std::chrono::seconds( 1) ) );
243     BOOST_CHECK_EQUAL( v1, v2);
244     BOOST_CHECK( boost::fibers::channel_op_status::closed == c.pop_wait_for( v2, std::chrono::seconds( 1) ) );
245 }
246 
test_pop_wait_for_success()247 void test_pop_wait_for_success() {
248     boost::fibers::buffered_channel< int > c( 16);
249     int v1 = 2, v2 = 0;
250     boost::fibers::fiber f1( boost::fibers::launch::post, [&c,&v2](){
251         BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_for( v2, std::chrono::seconds( 1) ) );
252     });
253     boost::fibers::fiber f2( boost::fibers::launch::post, [&c,v1](){
254         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
255     });
256     f1.join();
257     f2.join();
258     BOOST_CHECK_EQUAL( v1, v2);
259 }
260 
test_pop_wait_for_timeout()261 void test_pop_wait_for_timeout() {
262     boost::fibers::buffered_channel< int > c( 16);
263     int v = 0;
264     boost::fibers::fiber f( boost::fibers::launch::post, [&c,&v](){
265         BOOST_CHECK( boost::fibers::channel_op_status::timeout == c.pop_wait_for( v, std::chrono::seconds( 1) ) );
266     });
267     f.join();
268 }
269 
test_pop_wait_until()270 void test_pop_wait_until() {
271     boost::fibers::buffered_channel< int > c( 16);
272     int v1 = 2, v2 = 0;
273     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
274     BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_until( v2,
275             std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
276     BOOST_CHECK_EQUAL( v1, v2);
277 }
278 
test_pop_wait_until_closed()279 void test_pop_wait_until_closed() {
280     boost::fibers::buffered_channel< int > c( 16);
281     int v1 = 2, v2 = 0;
282     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
283     c.close();
284     BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_until( v2,
285             std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
286     BOOST_CHECK_EQUAL( v1, v2);
287     BOOST_CHECK( boost::fibers::channel_op_status::closed == c.pop_wait_until( v2,
288             std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
289 }
290 
test_pop_wait_until_success()291 void test_pop_wait_until_success() {
292     boost::fibers::buffered_channel< int > c( 16);
293     int v1 = 2, v2 = 0;
294     boost::fibers::fiber f1( boost::fibers::launch::post, [&c,&v2](){
295         BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop_wait_until( v2,
296                     std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
297     });
298     boost::fibers::fiber f2( boost::fibers::launch::post, [&c,v1](){
299         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( v1) );
300     });
301     f1.join();
302     f2.join();
303     BOOST_CHECK_EQUAL( v1, v2);
304 }
305 
test_pop_wait_until_timeout()306 void test_pop_wait_until_timeout() {
307     boost::fibers::buffered_channel< int > c( 16);
308     int v = 0;
309     boost::fibers::fiber f( boost::fibers::launch::post, [&c,&v](){
310         BOOST_CHECK( boost::fibers::channel_op_status::timeout == c.pop_wait_until( v,
311                     std::chrono::system_clock::now() + std::chrono::seconds( 1) ) );
312     });
313     f.join();
314 }
315 
test_wm_1()316 void test_wm_1() {
317     boost::fibers::buffered_channel< int > c( 4);
318     std::vector< boost::fibers::fiber::id > ids;
319     boost::fibers::fiber f1( boost::fibers::launch::post, [&c,&ids](){
320         ids.push_back( boost::this_fiber::get_id() );
321         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 1) );
322 
323         ids.push_back( boost::this_fiber::get_id() );
324         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 2) );
325 
326         ids.push_back( boost::this_fiber::get_id() );
327         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 3) );
328 
329         ids.push_back( boost::this_fiber::get_id() );
330         // would be blocked because channel is full
331         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 4) );
332 
333         ids.push_back( boost::this_fiber::get_id() );
334         // would be blocked because channel is full
335         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 5) );
336 
337         ids.push_back( boost::this_fiber::get_id() );
338     });
339     boost::fibers::fiber f2( boost::fibers::launch::post, [&c,&ids](){
340         ids.push_back( boost::this_fiber::get_id() );
341         BOOST_CHECK_EQUAL( 1, c.value_pop() );
342 
343         // let other fiber run
344         boost::this_fiber::yield();
345 
346         ids.push_back( boost::this_fiber::get_id() );
347         BOOST_CHECK_EQUAL( 2, c.value_pop() );
348 
349         ids.push_back( boost::this_fiber::get_id() );
350         BOOST_CHECK_EQUAL( 3, c.value_pop() );
351 
352         ids.push_back( boost::this_fiber::get_id() );
353         BOOST_CHECK_EQUAL( 4, c.value_pop() );
354 
355         ids.push_back( boost::this_fiber::get_id() );
356         // would block because channel is empty
357         BOOST_CHECK_EQUAL( 5, c.value_pop() );
358 
359         ids.push_back( boost::this_fiber::get_id() );
360     });
361     boost::fibers::fiber::id id1 = f1.get_id();
362     boost::fibers::fiber::id id2 = f2.get_id();
363     f1.join();
364     f2.join();
365     BOOST_CHECK_EQUAL( (std::size_t)12, ids.size() );
366     BOOST_CHECK_EQUAL( id1, ids[0]);
367     BOOST_CHECK_EQUAL( id1, ids[1]);
368     BOOST_CHECK_EQUAL( id1, ids[2]);
369     BOOST_CHECK_EQUAL( id1, ids[3]);
370     BOOST_CHECK_EQUAL( id2, ids[4]);
371     BOOST_CHECK_EQUAL( id1, ids[5]);
372     BOOST_CHECK_EQUAL( id2, ids[6]);
373     BOOST_CHECK_EQUAL( id2, ids[7]);
374     BOOST_CHECK_EQUAL( id2, ids[8]);
375     BOOST_CHECK_EQUAL( id2, ids[9]);
376     BOOST_CHECK_EQUAL( id1, ids[10]);
377     BOOST_CHECK_EQUAL( id2, ids[11]);
378 }
379 
test_wm_2()380 void test_wm_2() {
381     boost::fibers::buffered_channel< int > c( 8);
382     std::vector< boost::fibers::fiber::id > ids;
383     boost::fibers::fiber f1( boost::fibers::launch::post, [&c,&ids](){
384         ids.push_back( boost::this_fiber::get_id() );
385         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 1) );
386 
387         ids.push_back( boost::this_fiber::get_id() );
388         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 2) );
389 
390         ids.push_back( boost::this_fiber::get_id() );
391         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 3) );
392 
393         ids.push_back( boost::this_fiber::get_id() );
394         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 4) );
395 
396         ids.push_back( boost::this_fiber::get_id() );
397         BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( 5) );
398 
399         ids.push_back( boost::this_fiber::get_id() );
400     });
401     boost::fibers::fiber f2( boost::fibers::launch::post, [&c,&ids](){
402         ids.push_back( boost::this_fiber::get_id() );
403         BOOST_CHECK_EQUAL( 1, c.value_pop() );
404 
405         // let other fiber run
406         boost::this_fiber::yield();
407 
408         ids.push_back( boost::this_fiber::get_id() );
409         BOOST_CHECK_EQUAL( 2, c.value_pop() );
410 
411         // let other fiber run
412         boost::this_fiber::yield();
413 
414         ids.push_back( boost::this_fiber::get_id() );
415         BOOST_CHECK_EQUAL( 3, c.value_pop() );
416 
417         ids.push_back( boost::this_fiber::get_id() );
418         BOOST_CHECK_EQUAL( 4, c.value_pop() );
419 
420         ids.push_back( boost::this_fiber::get_id() );
421         BOOST_CHECK_EQUAL( 5, c.value_pop() );
422 
423         ids.push_back( boost::this_fiber::get_id() );
424     });
425     boost::fibers::fiber::id id1 = f1.get_id();
426     boost::fibers::fiber::id id2 = f2.get_id();
427     f1.join();
428     f2.join();
429     BOOST_CHECK_EQUAL( (std::size_t)12, ids.size() );
430     BOOST_CHECK_EQUAL( id1, ids[0]);
431     BOOST_CHECK_EQUAL( id1, ids[1]);
432     BOOST_CHECK_EQUAL( id1, ids[2]);
433     BOOST_CHECK_EQUAL( id1, ids[3]);
434     BOOST_CHECK_EQUAL( id1, ids[4]);
435     BOOST_CHECK_EQUAL( id1, ids[5]);
436     BOOST_CHECK_EQUAL( id2, ids[6]);
437     BOOST_CHECK_EQUAL( id2, ids[7]);
438     BOOST_CHECK_EQUAL( id2, ids[8]);
439     BOOST_CHECK_EQUAL( id2, ids[9]);
440     BOOST_CHECK_EQUAL( id2, ids[10]);
441     BOOST_CHECK_EQUAL( id2, ids[11]);
442 }
443 
test_moveable()444 void test_moveable() {
445     boost::fibers::buffered_channel< moveable > c( 16);
446     moveable m1( 3), m2;
447     BOOST_CHECK( m1.state);
448     BOOST_CHECK_EQUAL( 3, m1.value);
449     BOOST_CHECK( ! m2.state);
450     BOOST_CHECK_EQUAL( -1, m2.value);
451     BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( std::move( m1) ) );
452     BOOST_CHECK( ! m1.state);
453     BOOST_CHECK( ! m2.state);
454     BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( m2) );
455     BOOST_CHECK( ! m1.state);
456     BOOST_CHECK_EQUAL( -1, m1.value);
457     BOOST_CHECK( m2.state);
458     BOOST_CHECK_EQUAL( 3, m2.value);
459 }
460 
test_rangefor()461 void test_rangefor() {
462     boost::fibers::buffered_channel< int > chan{ 2 };
463     std::vector< int > vec;
464     boost::fibers::fiber f1([&chan]{
465         chan.push( 1);
466         chan.push( 1);
467         chan.push( 2);
468         chan.push( 3);
469         chan.push( 5);
470         chan.push( 8);
471         chan.push( 12);
472         chan.close();
473     });
474     boost::fibers::fiber f2([&vec,&chan]{
475         for ( int value : chan) {
476             vec.push_back( value);
477         }
478     });
479     f1.join();
480     f2.join();
481     BOOST_CHECK_EQUAL( 1, vec[0]);
482     BOOST_CHECK_EQUAL( 1, vec[1]);
483     BOOST_CHECK_EQUAL( 2, vec[2]);
484     BOOST_CHECK_EQUAL( 3, vec[3]);
485     BOOST_CHECK_EQUAL( 5, vec[4]);
486     BOOST_CHECK_EQUAL( 8, vec[5]);
487     BOOST_CHECK_EQUAL( 12, vec[6]);
488 }
489 
init_unit_test_suite(int,char * [])490 boost::unit_test::test_suite * init_unit_test_suite( int, char* []) {
491     boost::unit_test::test_suite * test =
492         BOOST_TEST_SUITE("Boost.Fiber: buffered_channel test suite");
493 
494      test->add( BOOST_TEST_CASE( & test_zero_wm) );
495      test->add( BOOST_TEST_CASE( & test_push) );
496      test->add( BOOST_TEST_CASE( & test_push_closed) );
497      test->add( BOOST_TEST_CASE( & test_try_push) );
498      test->add( BOOST_TEST_CASE( & test_try_push_closed) );
499      test->add( BOOST_TEST_CASE( & test_try_push_full) );
500      test->add( BOOST_TEST_CASE( & test_push_wait_for) );
501      test->add( BOOST_TEST_CASE( & test_push_wait_for_closed) );
502      test->add( BOOST_TEST_CASE( & test_push_wait_for_timeout) );
503      test->add( BOOST_TEST_CASE( & test_push_wait_until) );
504      test->add( BOOST_TEST_CASE( & test_push_wait_until_closed) );
505      test->add( BOOST_TEST_CASE( & test_push_wait_until_timeout) );
506      test->add( BOOST_TEST_CASE( & test_pop) );
507      test->add( BOOST_TEST_CASE( & test_pop_closed) );
508      test->add( BOOST_TEST_CASE( & test_pop_success) );
509      test->add( BOOST_TEST_CASE( & test_value_pop) );
510      test->add( BOOST_TEST_CASE( & test_value_pop_closed) );
511      test->add( BOOST_TEST_CASE( & test_value_pop_success) );
512      test->add( BOOST_TEST_CASE( & test_try_pop) );
513      test->add( BOOST_TEST_CASE( & test_try_pop_closed) );
514      test->add( BOOST_TEST_CASE( & test_try_pop_success) );
515      test->add( BOOST_TEST_CASE( & test_pop_wait_for) );
516      test->add( BOOST_TEST_CASE( & test_pop_wait_for_closed) );
517      test->add( BOOST_TEST_CASE( & test_pop_wait_for_success) );
518      test->add( BOOST_TEST_CASE( & test_pop_wait_for_timeout) );
519      test->add( BOOST_TEST_CASE( & test_pop_wait_until) );
520      test->add( BOOST_TEST_CASE( & test_pop_wait_until_closed) );
521      test->add( BOOST_TEST_CASE( & test_pop_wait_until_success) );
522      test->add( BOOST_TEST_CASE( & test_pop_wait_until_timeout) );
523      test->add( BOOST_TEST_CASE( & test_wm_1) );
524      test->add( BOOST_TEST_CASE( & test_wm_2) );
525      test->add( BOOST_TEST_CASE( & test_moveable) );
526      test->add( BOOST_TEST_CASE( & test_rangefor) );
527 
528     return test;
529 }
530