From cd4a13dbb55fefdc26263d2790cc9f22682c219d Mon Sep 17 00:00:00 2001 From: AMER JUSUPOVIC Date: Mon, 26 Feb 2024 17:18:56 -0800 Subject: [PATCH 1/7] update featuremanagementkeyvalueadapter to add status, don't set flag to boolean if variants are present --- .../FeatureManagementConstants.cs | 2 ++ .../FeatureManagementKeyValueAdapter.cs | 22 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementConstants.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementConstants.cs index 57806731..4f6a8d43 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementConstants.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementConstants.cs @@ -34,5 +34,7 @@ internal class FeatureManagementConstants public const string ETag = "ETag"; public const string FeatureFlagId = "FeatureFlagId"; public const string FeatureFlagReference = "FeatureFlagReference"; + public const string Status = "Status"; + public const string AlwaysOnFilter = "AlwaysOn"; } } diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs index e22437ba..a71c0e38 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs @@ -44,9 +44,16 @@ public Task>> ProcessKeyValue(Configura //if (featureFlag.Conditions?.ClientFilters == null) if (featureFlag.Conditions?.ClientFilters == null || !featureFlag.Conditions.ClientFilters.Any()) // workaround since we are not yet setting client filters to null { - // - // Always on - keyValues.Add(new KeyValuePair(featureFlagPath, true.ToString())); + if (featureFlag.Variants != null && featureFlag.Variants.Any()) + { + keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.EnabledFor}:{0}:{FeatureManagementConstants.Name}", FeatureManagementConstants.AlwaysOnFilter)); + } + else + { + // + // Always on + keyValues.Add(new KeyValuePair(featureFlagPath, true.ToString())); + } } else { @@ -77,10 +84,17 @@ public Task>> ProcessKeyValue(Configura featureFlag.Conditions.RequirementType)); } } + + keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", "Conditional")); } else { - keyValues.Add(new KeyValuePair($"{FeatureManagementConstants.SectionName}:{featureFlag.Id}", false.ToString())); + if (featureFlag.Variants == null || !featureFlag.Variants.Any()) + { + keyValues.Add(new KeyValuePair(featureFlagPath, false.ToString())); + } + + keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", "Disabled")); } if (featureFlag.Variants != null) From e003a036f8e9357142fcb2d874e9b40327fc9a20 Mon Sep 17 00:00:00 2001 From: AMER JUSUPOVIC Date: Tue, 27 Feb 2024 10:54:03 -0800 Subject: [PATCH 2/7] use constants for status --- .../FeatureManagement/FeatureManagementConstants.cs | 2 ++ .../FeatureManagement/FeatureManagementKeyValueAdapter.cs | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementConstants.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementConstants.cs index 4f6a8d43..7d53c234 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementConstants.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementConstants.cs @@ -36,5 +36,7 @@ internal class FeatureManagementConstants public const string FeatureFlagReference = "FeatureFlagReference"; public const string Status = "Status"; public const string AlwaysOnFilter = "AlwaysOn"; + public const string Conditional = "Conditional"; + public const string Disabled = "Disabled"; } } diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs index a71c0e38..009fd740 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs @@ -85,7 +85,7 @@ public Task>> ProcessKeyValue(Configura } } - keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", "Conditional")); + keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", FeatureManagementConstants.Conditional)); } else { @@ -94,7 +94,7 @@ public Task>> ProcessKeyValue(Configura keyValues.Add(new KeyValuePair(featureFlagPath, false.ToString())); } - keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", "Disabled")); + keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", FeatureManagementConstants.Disabled)); } if (featureFlag.Variants != null) From 604b3811bccc26ee4521e7a93531a12b537db124 Mon Sep 17 00:00:00 2001 From: AMER JUSUPOVIC Date: Tue, 27 Feb 2024 13:40:33 -0800 Subject: [PATCH 3/7] check for telemetry too, add status test --- .../FeatureManagementKeyValueAdapter.cs | 4 +-- .../FeatureManagementTests.cs | 28 +++++++++++++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs index 009fd740..1495e6e3 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs @@ -44,7 +44,7 @@ public Task>> ProcessKeyValue(Configura //if (featureFlag.Conditions?.ClientFilters == null) if (featureFlag.Conditions?.ClientFilters == null || !featureFlag.Conditions.ClientFilters.Any()) // workaround since we are not yet setting client filters to null { - if (featureFlag.Variants != null && featureFlag.Variants.Any()) + if (featureFlag.Variants != null && featureFlag.Telemetry != null) { keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.EnabledFor}:{0}:{FeatureManagementConstants.Name}", FeatureManagementConstants.AlwaysOnFilter)); } @@ -89,7 +89,7 @@ public Task>> ProcessKeyValue(Configura } else { - if (featureFlag.Variants == null || !featureFlag.Variants.Any()) + if (featureFlag.Variants == null) { keyValues.Add(new KeyValuePair(featureFlagPath, false.ToString())); } diff --git a/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs b/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs index 02a3d3c8..1e92a32d 100644 --- a/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs +++ b/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs @@ -198,9 +198,6 @@ public class FeatureManagementTests ""enabled"": true, ""conditions"": { ""client_filters"": [ - { - ""name"": ""AlwaysOn"" - } ] }, ""variants"": [ @@ -278,9 +275,6 @@ public class FeatureManagementTests ""enabled"": true, ""conditions"": { ""client_filters"": [ - { - ""name"": ""AlwaysOn"" - } ] }, ""telemetry"": { @@ -1289,6 +1283,7 @@ public void WithVariants() }) .Build(); + Assert.Equal("AlwaysOn", config["FeatureManagement:VariantsFeature:EnabledFor:0:Name"]); Assert.Equal("Big", config["FeatureManagement:VariantsFeature:Variants:0:Name"]); Assert.Equal("600px", config["FeatureManagement:VariantsFeature:Variants:0:ConfigurationValue"]); Assert.Equal("Small", config["FeatureManagement:VariantsFeature:Variants:1:Name"]); @@ -1316,6 +1311,27 @@ public void WithVariants() Assert.Equal("13992821", config["FeatureManagement:VariantsFeature:Allocation:Seed"]); } + [Fact] + public void WithStatus() + { + var mockResponse = new Mock(); + var mockClient = new Mock(MockBehavior.Strict); + + mockClient.Setup(c => c.GetConfigurationSettingsAsync(It.IsAny(), It.IsAny())) + .Returns(new MockAsyncPageable(_featureFlagCollection)); + + var config = new ConfigurationBuilder() + .AddAzureAppConfiguration(options => + { + options.ClientManager = TestHelpers.CreateMockedConfigurationClientManager(mockClient.Object); + options.UseFeatureFlags(); + }) + .Build(); + + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); + Assert.Equal("Conditional", config["FeatureManagement:Feature1:Status"]); + } + [Fact] public void WithTelemetry() { From c264ca2091b95009b5ef83b1c5721d67876ba313 Mon Sep 17 00:00:00 2001 From: AMER JUSUPOVIC Date: Tue, 27 Feb 2024 13:47:08 -0800 Subject: [PATCH 4/7] add comments --- .../FeatureManagement/FeatureManagementKeyValueAdapter.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs index 1495e6e3..d9624aec 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs @@ -44,6 +44,7 @@ public Task>> ProcessKeyValue(Configura //if (featureFlag.Conditions?.ClientFilters == null) if (featureFlag.Conditions?.ClientFilters == null || !featureFlag.Conditions.ClientFilters.Any()) // workaround since we are not yet setting client filters to null { + // Add the AlwaysOn filter instead of setting the flag to "true" so feature management doesn't skip evaluating variants and telemetry when present if (featureFlag.Variants != null && featureFlag.Telemetry != null) { keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.EnabledFor}:{0}:{FeatureManagementConstants.Name}", FeatureManagementConstants.AlwaysOnFilter)); @@ -89,6 +90,7 @@ public Task>> ProcessKeyValue(Configura } else { + // Only explicitly set the flag to false if there are no variants to override the enabled state if (featureFlag.Variants == null) { keyValues.Add(new KeyValuePair(featureFlagPath, false.ToString())); From c812844406fca706a1af536611cc9c5bab8c42ac Mon Sep 17 00:00:00 2001 From: AMER JUSUPOVIC Date: Tue, 27 Feb 2024 13:50:39 -0800 Subject: [PATCH 5/7] fix if statement condition for alwayson --- .../FeatureManagement/FeatureManagementKeyValueAdapter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs index d9624aec..393e5f43 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs @@ -45,7 +45,7 @@ public Task>> ProcessKeyValue(Configura if (featureFlag.Conditions?.ClientFilters == null || !featureFlag.Conditions.ClientFilters.Any()) // workaround since we are not yet setting client filters to null { // Add the AlwaysOn filter instead of setting the flag to "true" so feature management doesn't skip evaluating variants and telemetry when present - if (featureFlag.Variants != null && featureFlag.Telemetry != null) + if (featureFlag.Variants != null || featureFlag.Telemetry != null) { keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.EnabledFor}:{0}:{FeatureManagementConstants.Name}", FeatureManagementConstants.AlwaysOnFilter)); } From 00aa36d9b6f3c98835a7d2e066f09c5437ae979b Mon Sep 17 00:00:00 2001 From: AMER JUSUPOVIC Date: Tue, 27 Feb 2024 15:49:17 -0800 Subject: [PATCH 6/7] revisions --- .../FeatureManagementKeyValueAdapter.cs | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs index 393e5f43..dbdacbf0 100644 --- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs +++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/FeatureManagement/FeatureManagementKeyValueAdapter.cs @@ -41,20 +41,12 @@ public Task>> ProcessKeyValue(Configura if (featureFlag.Enabled) { + keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", FeatureManagementConstants.Conditional)); + //if (featureFlag.Conditions?.ClientFilters == null) if (featureFlag.Conditions?.ClientFilters == null || !featureFlag.Conditions.ClientFilters.Any()) // workaround since we are not yet setting client filters to null { - // Add the AlwaysOn filter instead of setting the flag to "true" so feature management doesn't skip evaluating variants and telemetry when present - if (featureFlag.Variants != null || featureFlag.Telemetry != null) - { - keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.EnabledFor}:{0}:{FeatureManagementConstants.Name}", FeatureManagementConstants.AlwaysOnFilter)); - } - else - { - // - // Always on - keyValues.Add(new KeyValuePair(featureFlagPath, true.ToString())); - } + keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.EnabledFor}:{0}:{FeatureManagementConstants.Name}", FeatureManagementConstants.AlwaysOnFilter)); } else { @@ -85,17 +77,9 @@ public Task>> ProcessKeyValue(Configura featureFlag.Conditions.RequirementType)); } } - - keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", FeatureManagementConstants.Conditional)); } else { - // Only explicitly set the flag to false if there are no variants to override the enabled state - if (featureFlag.Variants == null) - { - keyValues.Add(new KeyValuePair(featureFlagPath, false.ToString())); - } - keyValues.Add(new KeyValuePair($"{featureFlagPath}:{FeatureManagementConstants.Status}", FeatureManagementConstants.Disabled)); } From 1ae4a9f818e110bb344370daf651a052b970a1d4 Mon Sep 17 00:00:00 2001 From: AMER JUSUPOVIC Date: Wed, 28 Feb 2024 10:01:52 -0800 Subject: [PATCH 7/7] fix tests to match removal of explicit false value for flag --- .../FeatureManagementTests.cs | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs b/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs index 1e92a32d..852f053b 100644 --- a/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs +++ b/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs @@ -571,8 +571,8 @@ public void SelectFeatureFlags() }) .Build(); - Assert.Equal("True", config["FeatureManagement:App1_Feature1"]); - Assert.Equal("False", config["FeatureManagement:App1_Feature2"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App1_Feature1:EnabledFor:0:Name"]); + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); // Verify that the feature flag that did not start with the specified prefix was not loaded Assert.Null(config["FeatureManagement:Feature1"]); @@ -614,10 +614,10 @@ public void MultipleSelectsInSameUseFeatureFlags() }) .Build(); - Assert.Equal("True", config["FeatureManagement:App1_Feature1"]); - Assert.Equal("False", config["FeatureManagement:App1_Feature2"]); - Assert.Equal("False", config["FeatureManagement:App2_Feature1"]); - Assert.Equal("True", config["FeatureManagement:App2_Feature2"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App1_Feature1:EnabledFor:0:Name"]); + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); + Assert.Equal("Disabled", config["FeatureManagement:App2_Feature1:Status"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App2_Feature2:EnabledFor:0:Name"]); // Verify that the feature flag that did not start with the specified prefix was not loaded Assert.Null(config["FeatureManagement:Feature1"]); @@ -655,7 +655,7 @@ public void KeepSelectorPrecedenceAfterDedup() }) .Build(); // label: App1_Label has higher precedence - Assert.Equal("True", config["FeatureManagement:Feature1"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:Feature1:EnabledFor:0:Name"]); } [Fact] @@ -727,10 +727,10 @@ public void MultipleCallsToUseFeatureFlags() }) .Build(); - Assert.Equal("True", config["FeatureManagement:App1_Feature1"]); - Assert.Equal("False", config["FeatureManagement:App1_Feature2"]); - Assert.Equal("False", config["FeatureManagement:App2_Feature1"]); - Assert.Equal("True", config["FeatureManagement:App2_Feature2"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App1_Feature1:EnabledFor:0:Name"]); + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); + Assert.Equal("Disabled", config["FeatureManagement:App2_Feature1:Status"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App2_Feature2:EnabledFor:0:Name"]); // Verify that the feature flag that did not start with the specified prefix was not loaded Assert.Null(config["FeatureManagement:Feature1"]); @@ -771,13 +771,13 @@ public void MultipleCallsToUseFeatureFlagsWithSelectAndLabel() .Build(); // Loaded from prefix1 and label1 - Assert.Equal("True", config["FeatureManagement:App1_Feature1"]); - Assert.Equal("False", config["FeatureManagement:App1_Feature2"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App1_Feature1:EnabledFor:0:Name"]); + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); // Loaded from label2 - Assert.Equal("False", config["FeatureManagement:App2_Feature1"]); - Assert.Equal("True", config["FeatureManagement:App2_Feature2"]); - Assert.Equal("True", config["FeatureManagement:Feature1"]); + Assert.Equal("Disabled", config["FeatureManagement:App2_Feature1:Status"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App2_Feature2:EnabledFor:0:Name"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:Feature1:EnabledFor:0:Name"]); } [Fact] @@ -821,10 +821,10 @@ public void DifferentCacheExpirationsForMultipleFeatureFlagRegistrations() }) .Build(); - Assert.Equal("True", config["FeatureManagement:App1_Feature1"]); - Assert.Equal("False", config["FeatureManagement:App1_Feature2"]); - Assert.Equal("False", config["FeatureManagement:App2_Feature1"]); - Assert.Equal("True", config["FeatureManagement:App2_Feature2"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App1_Feature1:EnabledFor:0:Name"]); + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); + Assert.Equal("Disabled", config["FeatureManagement:App2_Feature1:Status"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App2_Feature2:EnabledFor:0:Name"]); // update the value of App1_Feature1 feature flag with label1 featureFlagCollection[0] = ConfigurationModelFactory.ConfigurationSetting( @@ -872,9 +872,9 @@ public void DifferentCacheExpirationsForMultipleFeatureFlagRegistrations() Assert.Equal("Browser", config["FeatureManagement:App1_Feature1:EnabledFor:0:Name"]); Assert.Equal("Chrome", config["FeatureManagement:App1_Feature1:EnabledFor:0:Parameters:AllowedBrowsers:0"]); Assert.Equal("Edge", config["FeatureManagement:App1_Feature1:EnabledFor:0:Parameters:AllowedBrowsers:1"]); - Assert.Equal("False", config["FeatureManagement:App1_Feature2"]); - Assert.Equal("False", config["FeatureManagement:App2_Feature1"]); - Assert.Equal("True", config["FeatureManagement:App2_Feature2"]); + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); + Assert.Equal("Disabled", config["FeatureManagement:App2_Feature1:Status"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App2_Feature2:EnabledFor:0:Name"]); // even though App2_Feature3 feature flag has been added, its value should not be loaded in config because label2 cache has not expired Assert.Null(config["FeatureManagement:App2_Feature3"]); @@ -914,11 +914,11 @@ public void OverwrittenCacheExpirationForSameFeatureFlagRegistrations() }) .Build(); - Assert.Equal("True", config["FeatureManagement:App1_Feature1"]); - Assert.Equal("False", config["FeatureManagement:App1_Feature2"]); - Assert.Equal("False", config["FeatureManagement:App2_Feature1"]); - Assert.Equal("True", config["FeatureManagement:App2_Feature2"]); - Assert.Equal("True", config["FeatureManagement:Feature1"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App1_Feature1:EnabledFor:0:Name"]); + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); + Assert.Equal("Disabled", config["FeatureManagement:App2_Feature1:Status"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App2_Feature2:EnabledFor:0:Name"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:Feature1:EnabledFor:0:Name"]); // update the value of App1_Feature1 feature flag with label1 featureFlagCollection[0] = ConfigurationModelFactory.ConfigurationSetting( @@ -948,11 +948,11 @@ public void OverwrittenCacheExpirationForSameFeatureFlagRegistrations() // The cache expiration time for feature flags was overwritten by second call to UseFeatureFlags. // Sleeping for cacheExpiration1 time should not update feature flags. - Assert.Equal("True", config["FeatureManagement:App1_Feature1"]); - Assert.Equal("False", config["FeatureManagement:App1_Feature2"]); - Assert.Equal("False", config["FeatureManagement:App2_Feature1"]); - Assert.Equal("True", config["FeatureManagement:App2_Feature2"]); - Assert.Equal("True", config["FeatureManagement:Feature1"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App1_Feature1:EnabledFor:0:Name"]); + Assert.Equal("Disabled", config["FeatureManagement:App1_Feature2:Status"]); + Assert.Equal("Disabled", config["FeatureManagement:App2_Feature1:Status"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:App2_Feature2:EnabledFor:0:Name"]); + Assert.Equal("AlwaysOn", config["FeatureManagement:Feature1:EnabledFor:0:Name"]); } [Fact] @@ -987,7 +987,7 @@ public void SelectAndRefreshSingleFeatureFlag() }) .Build(); - Assert.Equal("False", config["FeatureManagement:Feature1"]); + Assert.Equal("Disabled", config["FeatureManagement:Feature1:Status"]); // update the value of Feature1 feature flag with App1_Label featureFlagCollection[2] = ConfigurationModelFactory.ConfigurationSetting(