Skip to content

Commit 9b18fb1

Browse files
test: Complete the traits tests for the concurrency strategy
1 parent d7920c2 commit 9b18fb1

1 file changed

Lines changed: 57 additions & 8 deletions

File tree

tests/basic/test_policies.cpp

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <atomic>
12
#include <gtest/gtest.h>
23
#include <type_traits>
34
import mcpplibs.primitives;
@@ -43,8 +44,20 @@ TEST(PolicyTraitsTest, BuiltinPoliciesHaveCategories) {
4344
EXPECT_EQ(policy::traits<policy::concurrency::none>::kind,
4445
policy::category::concurrency);
4546

46-
EXPECT_TRUE((policy::traits<policy::concurrency::atomic>::enabled));
47-
EXPECT_EQ(policy::traits<policy::concurrency::atomic>::kind,
47+
EXPECT_TRUE((policy::traits<policy::concurrency::fenced>::enabled));
48+
EXPECT_EQ(policy::traits<policy::concurrency::fenced>::kind,
49+
policy::category::concurrency);
50+
51+
EXPECT_TRUE((policy::traits<policy::concurrency::fenced_relaxed>::enabled));
52+
EXPECT_EQ(policy::traits<policy::concurrency::fenced_relaxed>::kind,
53+
policy::category::concurrency);
54+
55+
EXPECT_TRUE((policy::traits<policy::concurrency::fenced_acq_rel>::enabled));
56+
EXPECT_EQ(policy::traits<policy::concurrency::fenced_acq_rel>::kind,
57+
policy::category::concurrency);
58+
59+
EXPECT_TRUE((policy::traits<policy::concurrency::fenced_seq_cst>::enabled));
60+
EXPECT_EQ(policy::traits<policy::concurrency::fenced_seq_cst>::kind,
4861
policy::category::concurrency);
4962

5063
EXPECT_TRUE((policy::traits<policy::value::saturating>::enabled));
@@ -60,24 +73,60 @@ TEST(PolicyTraitsTest, BuiltinPoliciesHaveCategories) {
6073
EXPECT_TRUE((std::is_same_v<policy::defaults::type, policy::type::strict>));
6174
}
6275

63-
TEST(PolicyConcurrencyTest, AtomicInjectsFences) {
64-
using atomic_handler =
65-
policy::concurrency::handler<policy::concurrency::atomic,
76+
TEST(PolicyConcurrencyTest, FencedInjectsFences) {
77+
using fenced_handler =
78+
policy::concurrency::handler<policy::concurrency::fenced,
6679
operations::Addition, int,
6780
policy::error::kind>;
6881
using single_handler = policy::concurrency::handler<policy::concurrency::none,
6982
operations::Addition, int,
7083
policy::error::kind>;
7184

72-
auto const atomic_injection = atomic_handler::inject();
85+
auto const fenced_injection = fenced_handler::inject();
7386
auto const single_injection = single_handler::inject();
7487

75-
EXPECT_TRUE(atomic_injection.fence_before);
76-
EXPECT_TRUE(atomic_injection.fence_after);
88+
EXPECT_TRUE(fenced_injection.fence_before);
89+
EXPECT_TRUE(fenced_injection.fence_after);
90+
EXPECT_EQ(fenced_injection.order_before, std::memory_order_seq_cst);
91+
EXPECT_EQ(fenced_injection.order_after, std::memory_order_seq_cst);
7792
EXPECT_FALSE(single_injection.fence_before);
7893
EXPECT_FALSE(single_injection.fence_after);
7994
}
8095

96+
TEST(PolicyConcurrencyTest, FencedVariantsUseExpectedMemoryOrders) {
97+
using relaxed_handler =
98+
policy::concurrency::handler<policy::concurrency::fenced_relaxed,
99+
operations::Addition, int,
100+
policy::error::kind>;
101+
using acq_rel_handler =
102+
policy::concurrency::handler<policy::concurrency::fenced_acq_rel,
103+
operations::Addition, int,
104+
policy::error::kind>;
105+
106+
auto const relaxed = relaxed_handler::inject();
107+
auto const acq_rel = acq_rel_handler::inject();
108+
109+
EXPECT_EQ(relaxed.order_before, std::memory_order_relaxed);
110+
EXPECT_EQ(relaxed.order_after, std::memory_order_relaxed);
111+
EXPECT_EQ(acq_rel.order_before, std::memory_order_acquire);
112+
EXPECT_EQ(acq_rel.order_after, std::memory_order_release);
113+
}
114+
115+
TEST(PolicyConcurrencyTest, PrimitiveAccessHandlerProtocolByPolicy) {
116+
EXPECT_TRUE((
117+
policy::concurrency::handler_access_available<policy::concurrency::fenced,
118+
int>));
119+
EXPECT_TRUE((policy::concurrency::handler_access_available<
120+
policy::concurrency::fenced_relaxed, int>));
121+
EXPECT_TRUE((policy::concurrency::handler_access_available<
122+
policy::concurrency::fenced_acq_rel, int>));
123+
EXPECT_TRUE((policy::concurrency::handler_access_available<
124+
policy::concurrency::fenced_seq_cst, int>));
125+
EXPECT_FALSE(
126+
(policy::concurrency::handler_access_available<policy::concurrency::none,
127+
int>));
128+
}
129+
81130
TEST(PolicyProtocolTest, BuiltinHandlersSatisfyProtocolConcepts) {
82131
static_assert(policy::type::handler_protocol<policy::type::strict,
83132
operations::Addition, int, int>);

0 commit comments

Comments
 (0)