@@ -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+
12061267TEST (FDv2DataSystemTest, FDv1SourceSelfDirectiveDoesNotRebuildFDv1) {
12071268 auto logger = MakeNullLogger ();
12081269 boost::asio::io_context ioc;
0 commit comments