Skip to content

Commit 6e14d3d

Browse files
test: Add tests for non-trivially copyable and low alignment representations in concurrency policies
1 parent 156439f commit 6e14d3d

1 file changed

Lines changed: 41 additions & 0 deletions

File tree

tests/basic/test_policies.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ using namespace mcpplibs::primitives;
77

88
namespace {
99
struct NullCapabilityProbe {};
10+
11+
struct NonTriviallyCopyableRep {
12+
int value{0};
13+
~NonTriviallyCopyableRep() {}
14+
};
15+
16+
struct LowAlignmentRep {
17+
unsigned char bytes[sizeof(std::uint64_t)]{};
18+
};
1019
} // namespace
1120

1221
template <> struct operations::traits<NullCapabilityProbe> {
@@ -127,6 +136,38 @@ TEST(PolicyConcurrencyTest, PrimitiveAccessHandlerProtocolByPolicy) {
127136
int>));
128137
}
129138

139+
TEST(PolicyConcurrencyTest, PrimitiveAccessRejectsNonTriviallyCopyableRep) {
140+
EXPECT_FALSE((
141+
policy::concurrency::handler_access_available<policy::concurrency::fenced,
142+
NonTriviallyCopyableRep>));
143+
EXPECT_FALSE((policy::concurrency::handler_access_available<
144+
policy::concurrency::fenced_relaxed, NonTriviallyCopyableRep>));
145+
EXPECT_FALSE((policy::concurrency::handler_access_available<
146+
policy::concurrency::fenced_acq_rel, NonTriviallyCopyableRep>));
147+
EXPECT_FALSE((policy::concurrency::handler_access_available<
148+
policy::concurrency::fenced_seq_cst, NonTriviallyCopyableRep>));
149+
}
150+
151+
TEST(PolicyConcurrencyTest, PrimitiveAccessRespectsAtomicRefAlignmentGate) {
152+
constexpr bool requires_stronger_alignment =
153+
std::atomic_ref<LowAlignmentRep>::required_alignment >
154+
alignof(LowAlignmentRep);
155+
156+
if constexpr (requires_stronger_alignment) {
157+
EXPECT_FALSE((policy::concurrency::handler_access_available<
158+
policy::concurrency::fenced, LowAlignmentRep>));
159+
EXPECT_FALSE((policy::concurrency::handler_access_available<
160+
policy::concurrency::fenced_relaxed, LowAlignmentRep>));
161+
EXPECT_FALSE((policy::concurrency::handler_access_available<
162+
policy::concurrency::fenced_acq_rel, LowAlignmentRep>));
163+
EXPECT_FALSE((policy::concurrency::handler_access_available<
164+
policy::concurrency::fenced_seq_cst, LowAlignmentRep>));
165+
} else {
166+
GTEST_SKIP() << "platform atomic_ref required_alignment does not exceed "
167+
"alignof(LowAlignmentRep)";
168+
}
169+
}
170+
130171
TEST(PolicyProtocolTest, BuiltinHandlersSatisfyProtocolConcepts) {
131172
static_assert(policy::type::handler_protocol<policy::type::strict,
132173
operations::Addition, int, int>);

0 commit comments

Comments
 (0)