Skip to content

Commit 8603981

Browse files
authored
Last one wins flag providers (#501)
* Adjusts to last one wins logic for flag provider * Removed unused schema * Reverted dotnet feature definition to continue to use FirstOrDefault
1 parent 138fe01 commit 8603981

File tree

5 files changed

+31
-2
lines changed

5 files changed

+31
-2
lines changed

src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ private FeatureDefinition GetMicrosoftSchemaFeatureDefinition(string featureName
172172
IEnumerable<IConfigurationSection> microsoftFeatureDefinitionSections = GetMicrosoftFeatureDefinitionSections();
173173

174174
IConfigurationSection configuration = microsoftFeatureDefinitionSections
175-
.FirstOrDefault(section =>
175+
.LastOrDefault(section =>
176176
string.Equals(section[MicrosoftFeatureManagementFields.Id], featureName, StringComparison.OrdinalIgnoreCase));
177177

178178
if (configuration == null)

tests/Tests.FeatureManagement/DotnetFeatureManagementSchema.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
]
1414
}
1515
}
16-
}
16+
}

tests/Tests.FeatureManagement/FeatureManagementTest.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,26 @@ public async Task CustomFeatureDefinitionProvider()
427427

428428
Assert.True(called);
429429
}
430+
431+
[Fact]
432+
public async Task LastFeatureFlagWins()
433+
{
434+
IConfiguration configuration = new ConfigurationBuilder()
435+
.AddJsonFile("appsettings.json")
436+
.Build();
437+
438+
IServiceCollection services = new ServiceCollection();
439+
440+
services
441+
.AddSingleton(configuration)
442+
.AddFeatureManagement();
443+
444+
ServiceProvider serviceProvider = services.BuildServiceProvider();
445+
446+
IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();
447+
448+
Assert.True(await featureManager.IsEnabledAsync(Features.DuplicateFlag));
449+
}
430450
}
431451

432452
public class FeatureManagementFeatureFilterGeneralTest

tests/Tests.FeatureManagement/Features.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ static class Features
3030
public const string OnTelemetryTestFeature = "OnTelemetryTestFeature";
3131
public const string OffTelemetryTestFeature = "OffTelemetryTestFeature";
3232
public const string ContextualFeatureWithVariant = "ContextualFeatureWithVariant";
33+
public const string DuplicateFlag = "DuplicateFlag";
3334
}
3435
}

tests/Tests.FeatureManagement/appsettings.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,14 @@
530530
"default_when_enabled": "Big",
531531
"default_when_disabled": "Small"
532532
}
533+
},
534+
{
535+
"id": "DuplicateFlag",
536+
"enabled": false
537+
},
538+
{
539+
"id": "DuplicateFlag",
540+
"enabled": true
533541
}
534542
]
535543
}

0 commit comments

Comments
 (0)