Skip to content

Commit c164913

Browse files
committed
test: cover initializer ChangeSet+directive basis preservation
1 parent 82d2730 commit c164913

1 file changed

Lines changed: 61 additions & 0 deletions

File tree

libs/server-sdk/tests/fdv2_data_system_test.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,67 @@ TEST(FDv2DataSystemTest, InitializerFdv1FlagSwitchesToFdv1Adapter) {
12031203
EXPECT_EQ(1, fdv1_factory_ptr->build_count_);
12041204
}
12051205

1206+
TEST(FDv2DataSystemTest,
1207+
InitializerChangeSetWithDirectiveAppliesBasisThenSwitches) {
1208+
auto logger = MakeNullLogger();
1209+
boost::asio::io_context ioc;
1210+
data_components::DataSourceStatusManager status_manager;
1211+
1212+
// Initializer returns a Full changeset carrying a flag AND the directive.
1213+
// The basis must be applied to the store before the orchestrator
1214+
// transitions to the FDv1 fallback.
1215+
data_model::Flag flag_a;
1216+
flag_a.key = "flagA";
1217+
flag_a.version = 1;
1218+
1219+
FDv2SourceResult init_result = MakeFullChangeSetResult(
1220+
ChangeSetData{
1221+
ItemChange{"flagA", data_model::FlagDescriptor(flag_a)},
1222+
},
1223+
MakeSelector(1, "state-1"));
1224+
init_result.fdv1_fallback = true;
1225+
1226+
auto initializer =
1227+
std::make_unique<MockInitializer>(std::move(init_result));
1228+
1229+
std::vector<std::unique_ptr<IFDv2InitializerFactory>> initializers;
1230+
initializers.push_back(
1231+
std::make_unique<OneShotInitializerFactory>(std::move(initializer)));
1232+
1233+
auto fdv2_sync =
1234+
std::make_unique<MockSynchronizer>(std::vector<FDv2SourceResult>{});
1235+
auto fdv2_factory =
1236+
std::make_unique<OneShotSynchronizerFactory>(std::move(fdv2_sync));
1237+
auto* fdv2_factory_ptr = fdv2_factory.get();
1238+
1239+
auto fdv1_sync =
1240+
std::make_unique<MockSynchronizer>(std::vector<FDv2SourceResult>{});
1241+
auto fdv1_factory =
1242+
std::make_unique<FDv1FallbackOneShotFactory>(std::move(fdv1_sync));
1243+
auto* fdv1_factory_ptr = fdv1_factory.get();
1244+
1245+
std::vector<std::unique_ptr<IFDv2SynchronizerFactory>> synchronizers;
1246+
synchronizers.push_back(std::move(fdv2_factory));
1247+
synchronizers.push_back(std::move(fdv1_factory));
1248+
1249+
FDv2DataSystem ds(std::move(initializers), std::move(synchronizers),
1250+
/*fallback_condition_factory=*/nullptr,
1251+
/*recovery_condition_factory=*/nullptr,
1252+
ioc.get_executor(), &status_manager, logger);
1253+
ds.Initialize();
1254+
ioc.run();
1255+
1256+
// Basis applied before the switch.
1257+
EXPECT_TRUE(ds.Initialized());
1258+
auto fetched = ds.GetFlag("flagA");
1259+
ASSERT_TRUE(fetched);
1260+
EXPECT_EQ(1u, fetched->version);
1261+
1262+
// FDv2 synchronizer skipped; FDv1 adapter built and ran.
1263+
EXPECT_EQ(0, fdv2_factory_ptr->build_count_);
1264+
EXPECT_EQ(1, fdv1_factory_ptr->build_count_);
1265+
}
1266+
12061267
TEST(FDv2DataSystemTest, FDv1SourceSelfDirectiveDoesNotRebuildFDv1) {
12071268
auto logger = MakeNullLogger();
12081269
boost::asio::io_context ioc;

0 commit comments

Comments
 (0)