// Copyright (C) 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #define BOOST_TEST_MAIN #ifdef BOOST_LOCKFREE_INCLUDE_TESTS #include #else #include #endif #include #include #include "test_common.hpp" using namespace boost; using namespace boost::lockfree; using namespace std; BOOST_AUTO_TEST_CASE( simple_queue_test ) { queue f(64); BOOST_WARN(f.is_lock_free()); BOOST_REQUIRE(f.empty()); f.push(1); f.push(2); int i1(0), i2(0); BOOST_REQUIRE(f.pop(i1)); BOOST_REQUIRE_EQUAL(i1, 1); BOOST_REQUIRE(f.pop(i2)); BOOST_REQUIRE_EQUAL(i2, 2); BOOST_REQUIRE(f.empty()); } BOOST_AUTO_TEST_CASE( simple_queue_test_capacity ) { queue > f; BOOST_WARN(f.is_lock_free()); BOOST_REQUIRE(f.empty()); f.push(1); f.push(2); int i1(0), i2(0); BOOST_REQUIRE(f.pop(i1)); BOOST_REQUIRE_EQUAL(i1, 1); BOOST_REQUIRE(f.pop(i2)); BOOST_REQUIRE_EQUAL(i2, 2); BOOST_REQUIRE(f.empty()); } BOOST_AUTO_TEST_CASE( unsafe_queue_test ) { queue f(64); BOOST_WARN(f.is_lock_free()); BOOST_REQUIRE(f.empty()); int i1(0), i2(0); f.unsynchronized_push(1); f.unsynchronized_push(2); BOOST_REQUIRE(f.unsynchronized_pop(i1)); BOOST_REQUIRE_EQUAL(i1, 1); BOOST_REQUIRE(f.unsynchronized_pop(i2)); BOOST_REQUIRE_EQUAL(i2, 2); BOOST_REQUIRE(f.empty()); } BOOST_AUTO_TEST_CASE( queue_convert_pop_test ) { queue f(128); BOOST_REQUIRE(f.empty()); f.push(new int(1)); f.push(new int(2)); f.push(new int(3)); f.push(new int(4)); { int * i1; BOOST_REQUIRE(f.pop(i1)); BOOST_REQUIRE_EQUAL(*i1, 1); delete i1; } { boost::shared_ptr i2; BOOST_REQUIRE(f.pop(i2)); BOOST_REQUIRE_EQUAL(*i2, 2); } { auto_ptr i3; BOOST_REQUIRE(f.pop(i3)); BOOST_REQUIRE_EQUAL(*i3, 3); } { boost::shared_ptr i4; BOOST_REQUIRE(f.pop(i4)); BOOST_REQUIRE_EQUAL(*i4, 4); } BOOST_REQUIRE(f.empty()); } BOOST_AUTO_TEST_CASE( queue_test_bounded ) { queue_stress_tester tester(4, 4); boost::lockfree::queue stk(128); tester.run(stk); } BOOST_AUTO_TEST_CASE( queue_test_unbounded ) { queue_stress_tester tester(4, 4); boost::lockfree::queue stk(128); tester.run(stk); } BOOST_AUTO_TEST_CASE( queue_test_fixed_size ) { queue_stress_tester<> tester(4, 4); boost::lockfree::queue > stk; tester.run(stk); }