@@ -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
5150built::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