Skip to content

Commit f11f6b3

Browse files
committed
test: drive Big Segments status provider tests through real polling
1 parent b6d2af6 commit f11f6b3

1 file changed

Lines changed: 19 additions & 43 deletions

File tree

libs/server-sdk/tests/big_segment_store_status_provider_test.cpp

Lines changed: 19 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ class FakeBigSegmentStore : public integrations::IBigSegmentStore {
4444

4545
private:
4646
mutable std::mutex mutex_;
47-
GetMetadataResult metadata_ =
48-
std::optional<integrations::StoreMetadata>{std::nullopt};
47+
GetMetadataResult metadata_;
4948
};
5049

5150
built::BigSegmentsConfig MakeConfig(
@@ -78,43 +77,7 @@ TEST(BigSegmentStoreStatusProviderTest, UnconfiguredReportsUnavailable) {
7877
EXPECT_FALSE(fired);
7978
}
8079

81-
TEST(BigSegmentStoreStatusProviderTest, DelegatesStatusToWrapper) {
82-
auto store = std::make_shared<FakeBigSegmentStore>();
83-
store->SetMetadata(
84-
integrations::StoreMetadata{std::chrono::system_clock::now()});
85-
86-
auto logger = launchdarkly::logging::NullLogger();
87-
boost::asio::io_context ioc;
88-
auto wrapper = std::make_shared<BigSegmentStoreWrapper>(
89-
MakeConfig(store, /*poll_interval=*/5s), ioc.get_executor(), logger);
90-
91-
BigSegmentStoreStatusProvider provider(wrapper);
92-
93-
// The wrapper polls inline on the first GetStatus, so fresh metadata is
94-
// reported as available and not stale.
95-
auto const status = provider.Status();
96-
EXPECT_TRUE(status.IsAvailable());
97-
EXPECT_FALSE(status.IsStale());
98-
}
99-
100-
TEST(BigSegmentStoreStatusProviderTest, StaleMetadataReportedAsStale) {
101-
auto store = std::make_shared<FakeBigSegmentStore>();
102-
store->SetMetadata(
103-
integrations::StoreMetadata{std::chrono::system_clock::now() - 5min});
104-
105-
auto logger = launchdarkly::logging::NullLogger();
106-
boost::asio::io_context ioc;
107-
auto wrapper = std::make_shared<BigSegmentStoreWrapper>(
108-
MakeConfig(store, /*poll_interval=*/5s), ioc.get_executor(), logger);
109-
110-
BigSegmentStoreStatusProvider provider(wrapper);
111-
112-
auto const status = provider.Status();
113-
EXPECT_TRUE(status.IsAvailable());
114-
EXPECT_TRUE(status.IsStale());
115-
}
116-
117-
TEST(BigSegmentStoreStatusProviderTest, ListenerReceivesConvertedPublicStatus) {
80+
TEST(BigSegmentStoreStatusProviderTest, StatusAndListenerReflectStoreTransitions) {
11881
auto store = std::make_shared<FakeBigSegmentStore>();
11982
store->SetMetadata(
12083
integrations::StoreMetadata{std::chrono::system_clock::now()});
@@ -141,21 +104,34 @@ TEST(BigSegmentStoreStatusProviderTest, ListenerReceivesConvertedPublicStatus) {
141104

142105
wrapper->Start();
143106

144-
// First poll broadcasts the initial healthy status through the adapter.
107+
// Fresh metadata is reported as available and not stale.
108+
{
109+
std::unique_lock lock(mutex);
110+
ASSERT_TRUE(cv.wait_for(lock, 1s, [&] {
111+
return last.has_value() && last->IsAvailable() && !last->IsStale();
112+
}));
113+
EXPECT_EQ(provider.Status(), *last);
114+
}
115+
116+
// Old metadata is reported as available but stale.
117+
store->SetMetadata(
118+
integrations::StoreMetadata{std::chrono::system_clock::now() - 5min});
145119
{
146120
std::unique_lock lock(mutex);
147121
ASSERT_TRUE(cv.wait_for(
148-
lock, 1s, [&] { return last.has_value() && last->IsAvailable(); }));
149-
EXPECT_FALSE(last->IsStale());
122+
lock, 1s, [&] { return last.has_value() && last->IsStale(); }));
123+
EXPECT_TRUE(last->IsAvailable());
124+
EXPECT_EQ(provider.Status(), *last);
150125
}
151126

152-
// A store error flips availability, which the listener observes.
127+
// A store error flips availability.
153128
store->SetMetadata(tl::make_unexpected("boom"));
154129
{
155130
std::unique_lock lock(mutex);
156131
ASSERT_TRUE(cv.wait_for(lock, 1s, [&] {
157132
return last.has_value() && !last->IsAvailable();
158133
}));
134+
EXPECT_EQ(provider.Status(), *last);
159135
}
160136

161137
connection->Disconnect();

0 commit comments

Comments
 (0)