summaryrefslogtreecommitdiff
path: root/libs/atomic/test
diff options
context:
space:
mode:
Diffstat (limited to 'libs/atomic/test')
-rw-r--r--libs/atomic/test/api_test_helpers.hpp115
-rw-r--r--libs/atomic/test/atomicity.cpp19
-rw-r--r--libs/atomic/test/fallback_api.cpp6
-rw-r--r--libs/atomic/test/lockfree.cpp20
-rw-r--r--libs/atomic/test/native_api.cpp9
-rw-r--r--libs/atomic/test/ordering.cpp13
6 files changed, 95 insertions, 87 deletions
diff --git a/libs/atomic/test/api_test_helpers.hpp b/libs/atomic/test/api_test_helpers.hpp
index 107e7d7d1..1db8c1fb8 100644
--- a/libs/atomic/test/api_test_helpers.hpp
+++ b/libs/atomic/test/api_test_helpers.hpp
@@ -7,6 +7,11 @@
#ifndef BOOST_ATOMIC_API_TEST_HELPERS_HPP
#define BOOST_ATOMIC_API_TEST_HELPERS_HPP
+#include <cstring>
+#include <boost/config.hpp>
+#include <boost/core/lightweight_test.hpp>
+#include <boost/atomic.hpp>
+
/* provide helpers that exercise whether the API
functions of "boost::atomic" provide the correct
operational semantic in the case of sequential
@@ -21,10 +26,10 @@ test_flag_api(void)
boost::atomic_flag f;
#endif
- BOOST_CHECK( !f.test_and_set() );
- BOOST_CHECK( f.test_and_set() );
+ BOOST_TEST( !f.test_and_set() );
+ BOOST_TEST( f.test_and_set() );
f.clear();
- BOOST_CHECK( !f.test_and_set() );
+ BOOST_TEST( !f.test_and_set() );
}
template<typename T>
@@ -33,48 +38,48 @@ void test_base_operators(T value1, T value2, T value3)
/* explicit load/store */
{
boost::atomic<T> a(value1);
- BOOST_CHECK( a.load() == value1 );
+ BOOST_TEST( a.load() == value1 );
}
{
boost::atomic<T> a(value1);
a.store(value2);
- BOOST_CHECK( a.load() == value2 );
+ BOOST_TEST( a.load() == value2 );
}
/* overloaded assignment/conversion */
{
boost::atomic<T> a(value1);
- BOOST_CHECK( value1 == a );
+ BOOST_TEST( value1 == a );
}
{
boost::atomic<T> a;
a = value2;
- BOOST_CHECK( value2 == a );
+ BOOST_TEST( value2 == a );
}
/* exchange-type operators */
{
boost::atomic<T> a(value1);
T n = a.exchange(value2);
- BOOST_CHECK( a.load() == value2 && n == value1 );
+ BOOST_TEST( a.load() == value2 && n == value1 );
}
{
boost::atomic<T> a(value1);
T expected = value1;
bool success = a.compare_exchange_strong(expected, value3);
- BOOST_CHECK( success );
- BOOST_CHECK( a.load() == value3 && expected == value1 );
+ BOOST_TEST( success );
+ BOOST_TEST( a.load() == value3 && expected == value1 );
}
{
boost::atomic<T> a(value1);
T expected = value2;
bool success = a.compare_exchange_strong(expected, value3);
- BOOST_CHECK( !success );
- BOOST_CHECK( a.load() == value1 && expected == value1 );
+ BOOST_TEST( !success );
+ BOOST_TEST( a.load() == value1 && expected == value1 );
}
{
@@ -85,8 +90,8 @@ void test_base_operators(T value1, T value2, T value3)
expected = value1;
success = a.compare_exchange_weak(expected, value3);
} while(!success);
- BOOST_CHECK( success );
- BOOST_CHECK( a.load() == value3 && expected == value1 );
+ BOOST_TEST( success );
+ BOOST_TEST( a.load() == value3 && expected == value1 );
}
{
@@ -99,8 +104,8 @@ void test_base_operators(T value1, T value2, T value3)
if (expected != value2)
break;
} while(!success);
- BOOST_CHECK( !success );
- BOOST_CHECK( a.load() == value1 && expected == value1 );
+ BOOST_TEST( !success );
+ BOOST_TEST( a.load() == value1 && expected == value1 );
}
}
@@ -111,7 +116,7 @@ void test_constexpr_ctor()
#ifndef BOOST_NO_CXX11_CONSTEXPR
const T value(0);
const boost::atomic<T> tester(value);
- BOOST_CHECK( tester == value );
+ BOOST_TEST( tester == value );
#endif
}
@@ -126,59 +131,59 @@ void test_additive_operators_with_type(T value, D delta)
{
boost::atomic<T> a(value);
T n = a.fetch_add(delta);
- BOOST_CHECK( a.load() == T((AddType)value + delta) );
- BOOST_CHECK( n == value );
+ BOOST_TEST( a.load() == T((AddType)value + delta) );
+ BOOST_TEST( n == value );
}
{
boost::atomic<T> a(value);
T n = a.fetch_sub(delta);
- BOOST_CHECK( a.load() == T((AddType)value - delta) );
- BOOST_CHECK( n == value );
+ BOOST_TEST( a.load() == T((AddType)value - delta) );
+ BOOST_TEST( n == value );
}
/* overloaded modify/assign*/
{
boost::atomic<T> a(value);
T n = (a += delta);
- BOOST_CHECK( a.load() == T((AddType)value + delta) );
- BOOST_CHECK( n == T((AddType)value + delta) );
+ BOOST_TEST( a.load() == T((AddType)value + delta) );
+ BOOST_TEST( n == T((AddType)value + delta) );
}
{
boost::atomic<T> a(value);
T n = (a -= delta);
- BOOST_CHECK( a.load() == T((AddType)value - delta) );
- BOOST_CHECK( n == T((AddType)value - delta) );
+ BOOST_TEST( a.load() == T((AddType)value - delta) );
+ BOOST_TEST( n == T((AddType)value - delta) );
}
/* overloaded increment/decrement */
{
boost::atomic<T> a(value);
T n = a++;
- BOOST_CHECK( a.load() == T((AddType)value + 1) );
- BOOST_CHECK( n == value );
+ BOOST_TEST( a.load() == T((AddType)value + 1) );
+ BOOST_TEST( n == value );
}
{
boost::atomic<T> a(value);
T n = ++a;
- BOOST_CHECK( a.load() == T((AddType)value + 1) );
- BOOST_CHECK( n == T((AddType)value + 1) );
+ BOOST_TEST( a.load() == T((AddType)value + 1) );
+ BOOST_TEST( n == T((AddType)value + 1) );
}
{
boost::atomic<T> a(value);
T n = a--;
- BOOST_CHECK( a.load() == T((AddType)value - 1) );
- BOOST_CHECK( n == value );
+ BOOST_TEST( a.load() == T((AddType)value - 1) );
+ BOOST_TEST( n == value );
}
{
boost::atomic<T> a(value);
T n = --a;
- BOOST_CHECK( a.load() == T((AddType)value - 1) );
- BOOST_CHECK( n == T((AddType)value - 1) );
+ BOOST_TEST( a.load() == T((AddType)value - 1) );
+ BOOST_TEST( n == T((AddType)value - 1) );
}
}
@@ -194,12 +199,12 @@ void test_additive_wrap(T value)
{
boost::atomic<T> a(value);
T n = a.fetch_add(1) + 1;
- BOOST_CHECK( a.compare_exchange_strong(n, n) );
+ BOOST_TEST( a.compare_exchange_strong(n, n) );
}
{
boost::atomic<T> a(value);
T n = a.fetch_sub(1) - 1;
- BOOST_CHECK( a.compare_exchange_strong(n, n) );
+ BOOST_TEST( a.compare_exchange_strong(n, n) );
}
}
@@ -210,51 +215,51 @@ void test_bit_operators(T value, T delta)
{
boost::atomic<T> a(value);
T n = a.fetch_and(delta);
- BOOST_CHECK( a.load() == T(value & delta) );
- BOOST_CHECK( n == value );
+ BOOST_TEST( a.load() == T(value & delta) );
+ BOOST_TEST( n == value );
}
{
boost::atomic<T> a(value);
T n = a.fetch_or(delta);
- BOOST_CHECK( a.load() == T(value | delta) );
- BOOST_CHECK( n == value );
+ BOOST_TEST( a.load() == T(value | delta) );
+ BOOST_TEST( n == value );
}
{
boost::atomic<T> a(value);
T n = a.fetch_xor(delta);
- BOOST_CHECK( a.load() == T(value ^ delta) );
- BOOST_CHECK( n == value );
+ BOOST_TEST( a.load() == T(value ^ delta) );
+ BOOST_TEST( n == value );
}
/* overloaded modify/assign */
{
boost::atomic<T> a(value);
T n = (a &= delta);
- BOOST_CHECK( a.load() == T(value & delta) );
- BOOST_CHECK( n == T(value & delta) );
+ BOOST_TEST( a.load() == T(value & delta) );
+ BOOST_TEST( n == T(value & delta) );
}
{
boost::atomic<T> a(value);
T n = (a |= delta);
- BOOST_CHECK( a.load() == T(value | delta) );
- BOOST_CHECK( n == T(value | delta) );
+ BOOST_TEST( a.load() == T(value | delta) );
+ BOOST_TEST( n == T(value | delta) );
}
{
boost::atomic<T> a(value);
T n = (a ^= delta);
- BOOST_CHECK( a.load() == T(value ^ delta) );
- BOOST_CHECK( n == T(value ^ delta) );
+ BOOST_TEST( a.load() == T(value ^ delta) );
+ BOOST_TEST( n == T(value ^ delta) );
}
}
template<typename T>
void test_integral_api(void)
{
- BOOST_CHECK( sizeof(boost::atomic<T>) >= sizeof(T));
+ BOOST_TEST( sizeof(boost::atomic<T>) >= sizeof(T));
test_base_operators<T>(42, 43, 44);
test_additive_operators<T, T>(42, 17);
@@ -276,8 +281,8 @@ void test_integral_api(void)
template<typename T>
void test_pointer_api(void)
{
- BOOST_CHECK( sizeof(boost::atomic<T *>) >= sizeof(T *));
- BOOST_CHECK( sizeof(boost::atomic<void *>) >= sizeof(T *));
+ BOOST_TEST( sizeof(boost::atomic<T *>) >= sizeof(T *));
+ BOOST_TEST( sizeof(boost::atomic<void *>) >= sizeof(T *));
T values[3];
@@ -289,7 +294,7 @@ void test_pointer_api(void)
boost::atomic<void *> ptr;
boost::atomic<intptr_t> integral;
- BOOST_CHECK( ptr.is_lock_free() == integral.is_lock_free() );
+ BOOST_TEST( ptr.is_lock_free() == integral.is_lock_free() );
}
enum test_enum {
@@ -321,7 +326,7 @@ test_struct_api(void)
{
boost::atomic<T> sa;
boost::atomic<typename T::value_type> si;
- BOOST_CHECK( sa.is_lock_free() == si.is_lock_free() );
+ BOOST_TEST( sa.is_lock_free() == si.is_lock_free() );
}
}
struct large_struct {
@@ -329,11 +334,11 @@ struct large_struct {
inline bool operator==(const large_struct & c) const
{
- return memcmp(data, &c.data, sizeof(data)) == 0;
+ return std::memcmp(data, &c.data, sizeof(data)) == 0;
}
inline bool operator!=(const large_struct & c) const
{
- return memcmp(data, &c.data, sizeof(data)) != 0;
+ return std::memcmp(data, &c.data, sizeof(data)) != 0;
}
};
@@ -359,7 +364,7 @@ test_struct_with_ctor_api(void)
test_struct_with_ctor s;
boost::atomic<test_struct_with_ctor> sa;
// Check that the default constructor was called
- BOOST_CHECK( sa.load() == s );
+ BOOST_TEST( sa.load() == s );
}
test_struct_with_ctor a, b, c;
diff --git a/libs/atomic/test/atomicity.cpp b/libs/atomic/test/atomicity.cpp
index f1a64f502..d62ae748b 100644
--- a/libs/atomic/test/atomicity.cpp
+++ b/libs/atomic/test/atomicity.cpp
@@ -24,20 +24,20 @@
// operations truly behave atomic if this test program does not
// report an error.
-#include <algorithm>
-
#include <boost/atomic.hpp>
+
+#include <algorithm>
+#include <boost/ref.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/date_time/posix_time/time_formatters.hpp>
-#include <boost/test/test_tools.hpp>
-#include <boost/test/included/test_exec_monitor.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/thread_time.hpp>
#include <boost/thread/locks.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>
+#include <boost/core/lightweight_test.hpp>
/* helper class to let two instances of a function race against each
other, with configurable timeout and early abort on detection of error */
@@ -160,7 +160,7 @@ estimate_avg_race_time(void)
);
if (success) {
- BOOST_FAIL("Failed to establish baseline time for reproducing race condition");
+ BOOST_ERROR("Failed to establish baseline time for reproducing race condition");
}
sum = sum + timeout.total_microseconds();
@@ -239,7 +239,7 @@ test_bitops(boost::atomic<value_type> & shared_value, size_t instance)
return true;
}
-int test_main(int, char *[])
+int main(int, char *[])
{
boost::posix_time::time_duration reciprocal_lambda;
@@ -260,7 +260,7 @@ int test_main(int, char *[])
tmp
);
- BOOST_CHECK_MESSAGE(success, "concurrent arithmetic");
+ BOOST_TEST(success); // concurrent arithmetic error
}
{
@@ -275,7 +275,8 @@ int test_main(int, char *[])
tmp
);
- BOOST_CHECK_MESSAGE(success, "concurrent bitops");
+ BOOST_TEST(success); // concurrent bit operations error
}
- return 0;
+
+ return boost::report_errors();
}
diff --git a/libs/atomic/test/fallback_api.cpp b/libs/atomic/test/fallback_api.cpp
index b767856c5..0bb42d81c 100644
--- a/libs/atomic/test/fallback_api.cpp
+++ b/libs/atomic/test/fallback_api.cpp
@@ -9,11 +9,11 @@
#include <boost/atomic.hpp>
#include <boost/cstdint.hpp>
-#include <boost/test/minimal.hpp>
+#include <boost/core/lightweight_test.hpp>
#include "api_test_helpers.hpp"
-int test_main(int, char *[])
+int main(int, char *[])
{
test_flag_api();
@@ -55,5 +55,5 @@ int test_main(int, char *[])
// Other non-trivial constructors are allowed.
test_struct_with_ctor_api();
- return 0;
+ return boost::report_errors();
}
diff --git a/libs/atomic/test/lockfree.cpp b/libs/atomic/test/lockfree.cpp
index 99260e3a8..9c1640737 100644
--- a/libs/atomic/test/lockfree.cpp
+++ b/libs/atomic/test/lockfree.cpp
@@ -9,11 +9,11 @@
// Also, if any operation is lock-free, then the platform
// implementation must provide overridden fence implementations.
-#include <iostream>
+#include <boost/atomic.hpp>
+#include <iostream>
#include <boost/config.hpp>
-#include <boost/atomic.hpp>
-#include <boost/test/minimal.hpp>
+#include <boost/core/lightweight_test.hpp>
static const char * lock_free_level[] = {
"never",
@@ -25,15 +25,15 @@ template<typename T>
void
verify_lock_free(const char * type_name, int lock_free_macro_val, int lock_free_expect)
{
- BOOST_CHECK(lock_free_macro_val >= 0 && lock_free_macro_val <= 2);
- BOOST_CHECK(lock_free_macro_val == lock_free_expect);
+ BOOST_TEST(lock_free_macro_val >= 0 && lock_free_macro_val <= 2);
+ BOOST_TEST(lock_free_macro_val == lock_free_expect);
boost::atomic<T> value;
if (lock_free_macro_val == 0)
- BOOST_CHECK(!value.is_lock_free());
+ BOOST_TEST(!value.is_lock_free());
if (lock_free_macro_val == 2)
- BOOST_CHECK(value.is_lock_free());
+ BOOST_TEST(value.is_lock_free());
std::cout << "atomic<" << type_name << "> is " << lock_free_level[lock_free_macro_val] << " lock free\n";
}
@@ -174,7 +174,7 @@ verify_lock_free(const char * type_name, int lock_free_macro_val, int lock_free_
#endif
-int test_main(int, char *[])
+int main(int, char *[])
{
verify_lock_free<char>("char", BOOST_ATOMIC_CHAR_LOCK_FREE, EXPECT_CHAR_LOCK_FREE);
verify_lock_free<short>("short", BOOST_ATOMIC_SHORT_LOCK_FREE, EXPECT_SHORT_LOCK_FREE);
@@ -197,7 +197,7 @@ int test_main(int, char *[])
BOOST_ATOMIC_LLONG_LOCK_FREE > 0 ||
BOOST_ATOMIC_BOOL_LOCK_FREE > 0;
- BOOST_CHECK(!any_lock_free || BOOST_ATOMIC_THREAD_FENCE > 0);
+ BOOST_TEST(!any_lock_free || BOOST_ATOMIC_THREAD_FENCE > 0);
- return 0;
+ return boost::report_errors();
}
diff --git a/libs/atomic/test/native_api.cpp b/libs/atomic/test/native_api.cpp
index ddcc0f653..c9b3dad99 100644
--- a/libs/atomic/test/native_api.cpp
+++ b/libs/atomic/test/native_api.cpp
@@ -4,14 +4,15 @@
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
-#include <boost/config.hpp>
#include <boost/atomic.hpp>
+
+#include <boost/config.hpp>
#include <boost/cstdint.hpp>
-#include <boost/test/minimal.hpp>
+#include <boost/core/lightweight_test.hpp>
#include "api_test_helpers.hpp"
-int test_main(int, char *[])
+int main(int, char *[])
{
test_flag_api();
@@ -66,5 +67,5 @@ int test_main(int, char *[])
// Other non-trivial constructors are allowed.
test_struct_with_ctor_api();
- return 0;
+ return boost::report_errors();
}
diff --git a/libs/atomic/test/ordering.cpp b/libs/atomic/test/ordering.cpp
index f76985504..2bfcd4adf 100644
--- a/libs/atomic/test/ordering.cpp
+++ b/libs/atomic/test/ordering.cpp
@@ -26,18 +26,19 @@
// Overall this yields 0.995 * 0.995 > 0.99 confidence that the
// fences work as expected if this test program does not
// report an error.
+
#include <boost/atomic.hpp>
+
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/date_time/posix_time/time_formatters.hpp>
-#include <boost/test/test_tools.hpp>
-#include <boost/test/included/test_exec_monitor.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/thread_time.hpp>
#include <boost/thread/locks.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/thread/barrier.hpp>
+#include <boost/core/lightweight_test.hpp>
// Two threads perform the following operations:
//
@@ -224,7 +225,7 @@ test_seq_cst(void)
total_store_order_test<boost::memory_order_relaxed, boost::memory_order_relaxed> test;
test.run(timeout);
if (!test.detected_conflict()) {
- BOOST_WARN_MESSAGE(false, "Failed to detect order=seq_cst violation while ith order=relaxed -- intrinsic ordering too strong for this test");
+ std::cout << "Failed to detect order=seq_cst violation while ith order=relaxed -- intrinsic ordering too strong for this test\n";
return;
}
@@ -248,12 +249,12 @@ test_seq_cst(void)
total_store_order_test<boost::memory_order_seq_cst, boost::memory_order_relaxed> test;
test.run(timeout);
- BOOST_CHECK_MESSAGE(!test.detected_conflict(), "sequential consistency");
+ BOOST_TEST(!test.detected_conflict()); // sequential consistency error
}
-int test_main(int, char *[])
+int main(int, char *[])
{
test_seq_cst();
- return 0;
+ return boost::report_errors();
}