diff --git a/src/Microsoft.FeatureManagement/FeatureManager.cs b/src/Microsoft.FeatureManagement/FeatureManager.cs index ef850a03..7730fa92 100644 --- a/src/Microsoft.FeatureManagement/FeatureManager.cs +++ b/src/Microsoft.FeatureManagement/FeatureManager.cs @@ -39,17 +39,21 @@ private class ConfigurationCacheItem /// /// The provider of feature flag definitions. /// Options controlling the behavior of the feature manager. + /// The collection of feature filter metadata. + /// The collection of session managers. /// Thrown if is null. public FeatureManager( IFeatureDefinitionProvider featureDefinitionProvider, - FeatureManagementOptions options = null) + FeatureManagementOptions options = null, + IEnumerable featureFilters = null, + IEnumerable sessionManagers = null) { _filterMetadataCache = new ConcurrentDictionary(); _contextualFeatureFilterCache = new ConcurrentDictionary(); _featureDefinitionProvider = featureDefinitionProvider ?? throw new ArgumentNullException(nameof(featureDefinitionProvider)); _options = options ?? new FeatureManagementOptions(); - _featureFilters = Enumerable.Empty(); - _sessionManagers = Enumerable.Empty(); + _featureFilters = featureFilters ?? Enumerable.Empty(); + _sessionManagers = sessionManagers ?? Enumerable.Empty(); } /// diff --git a/tests/Tests.FeatureManagement/FeatureManagement.cs b/tests/Tests.FeatureManagement/FeatureManagement.cs index e5c0ba06..54758614 100644 --- a/tests/Tests.FeatureManagement/FeatureManagement.cs +++ b/tests/Tests.FeatureManagement/FeatureManagement.cs @@ -1027,5 +1027,41 @@ public async Task BindsFeatureFlagSettings() Assert.True(called); } + + [Fact] + public void ConstructorUsesFallbackValues() + { + var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); + var configDefinitionProvider = new ConfigurationFeatureDefinitionProvider(config); + var featureManager = new FeatureManager(configDefinitionProvider); + + Assert.Empty(featureManager.FeatureFilters); + Assert.Empty(featureManager.SessionManagers); + } + + [Fact] + public void ConstructorSetsOptionalValues() + { + var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); + var configDefinitionProvider = new ConfigurationFeatureDefinitionProvider(config); + var options = new FeatureManagementOptions(); + var featureFilters = new List + { + new TestFilter() + }; + var sessionManagers = new List + { + new TestSessionManager() + }; + var featureManager = new FeatureManager( + configDefinitionProvider, + options, + featureFilters, + sessionManagers + ); + + Assert.Single(featureManager.FeatureFilters); + Assert.Single(featureManager.SessionManagers); + } } } diff --git a/tests/Tests.FeatureManagement/TestSessionManager.cs b/tests/Tests.FeatureManagement/TestSessionManager.cs new file mode 100644 index 00000000..59b6b0d1 --- /dev/null +++ b/tests/Tests.FeatureManagement/TestSessionManager.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.FeatureManagement; + +namespace Tests.FeatureManagement +{ + class TestSessionManager : ISessionManager + { + private readonly IDictionary _features = new Dictionary(); + + public Task SetAsync(string featureName, bool enabled) + { + _features[featureName] = enabled; + + return Task.CompletedTask; + } + + public Task GetAsync(string featureName) + { + bool? result = _features.TryGetValue(featureName, out var feature) ? feature : null; + + return Task.FromResult(result); + } + } +} \ No newline at end of file