Skip to content

Commit dd31298

Browse files
committed
fix: Change notification consistency.
The store should be updated before events are dispatched to ensure consistent data between event information and variation calls.
1 parent c0ef518 commit dd31298

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

libs/client-sdk/src/flag_manager/flag_updater.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ void FlagUpdater::Upsert(Context const& context,
9595
return;
9696
}
9797

98+
flag_store_.Upsert(key, descriptor);
9899
if (HasListeners()) {
99100
// Existed and updated.
100101
if (existing && descriptor.item) {
@@ -112,7 +113,6 @@ void FlagUpdater::Upsert(Context const& context,
112113
// Do nothing.
113114
}
114115
}
115-
flag_store_.Upsert(key, descriptor);
116116
}
117117

118118
bool FlagUpdater::HasListeners() const {

libs/client-sdk/tests/flag_updater_test.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,21 @@ TEST(FlagUpdaterEventTests, SecondInitWithUpdateProducesEvents) {
207207

208208
std::atomic_bool got_event(false);
209209
notifier->OnFlagChange(
210-
"flagA", [&got_event](std::shared_ptr<FlagValueChangeEvent> event) {
210+
"flagA", [&got_event, &manager](std::shared_ptr<FlagValueChangeEvent> event) {
211211
got_event.store(true);
212212

213213
EXPECT_EQ("test", event->OldValue().AsString());
214214
EXPECT_EQ("potato", event->NewValue().AsString());
215215
EXPECT_EQ("flagA", event->FlagName());
216216
EXPECT_FALSE(event->Deleted());
217+
218+
// The value in the store should be consistent with the new value.
219+
EXPECT_EQ(event->NewValue().AsString(), manager.Get("flagA")
220+
.get()
221+
->item.value()
222+
.Detail()
223+
.Value()
224+
.AsString());
217225
});
218226

219227
updater.Init(
@@ -283,13 +291,21 @@ TEST(FlagUpdaterDataTests, PatchWithUpdateProducesEvent) {
283291

284292
std::atomic_bool got_event(false);
285293
notifier->OnFlagChange(
286-
"flagA", [&got_event](std::shared_ptr<FlagValueChangeEvent> event) {
294+
"flagA",
295+
[&got_event, &manager](std::shared_ptr<FlagValueChangeEvent> event) {
287296
got_event.store(true);
288297

289298
EXPECT_EQ("test", event->OldValue().AsString());
290299
EXPECT_EQ("second", event->NewValue().AsString());
291300
EXPECT_EQ("flagA", event->FlagName());
292301
EXPECT_FALSE(event->Deleted());
302+
// The value in the store should be consistent with the new value.
303+
EXPECT_EQ(event->NewValue().AsString(), manager.Get("flagA")
304+
.get()
305+
->item.value()
306+
.Detail()
307+
.Value()
308+
.AsString());
293309
});
294310

295311
updater.Init(
@@ -317,13 +333,22 @@ TEST(FlagUpdaterEventTests, PatchWithNewFlagProducesEvent) {
317333

318334
std::atomic_bool got_event(false);
319335
notifier->OnFlagChange(
320-
"flagB", [&got_event](std::shared_ptr<FlagValueChangeEvent> event) {
336+
"flagB",
337+
[&got_event, &manager](std::shared_ptr<FlagValueChangeEvent> event) {
321338
got_event.store(true);
322339

323340
EXPECT_TRUE(event->OldValue().IsNull());
324341
EXPECT_EQ("second", event->NewValue().AsString());
325342
EXPECT_EQ("flagB", event->FlagName());
326343
EXPECT_FALSE(event->Deleted());
344+
345+
// The value in the store should be consistent with the new value.
346+
EXPECT_EQ(event->NewValue().AsString(), manager.Get("flagB")
347+
.get()
348+
->item.value()
349+
.Detail()
350+
.Value()
351+
.AsString());
327352
});
328353

329354
updater.Init(

0 commit comments

Comments
 (0)