Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion tracer/src/Datadog.Trace/FeatureFlags/Rcm/FfeProduct.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,18 @@ public ApplyDetails[] UpdateFromRcm(Dictionary<string, List<RemoteConfiguration>
var serverConfigFile = new NamedRawFile(ffeConfig.Path, ffeConfig.Contents).Deserialize<ServerConfiguration>();
if (serverConfigFile.TypedFile is not null)
{
_serverConfigurations.Add(new KeyValuePair<string, ServerConfiguration>(ffeConfig.Path.Path, serverConfigFile.TypedFile));
var path = ffeConfig.Path.Path;
var updatedConfig = new KeyValuePair<string, ServerConfiguration>(path, serverConfigFile.TypedFile);
var existingIndex = _serverConfigurations.FindIndex(config => config.Key == path);
if (existingIndex >= 0)
{
_serverConfigurations[existingIndex] = updatedConfig;
}
else
{
_serverConfigurations.Add(updatedConfig);
}

res.Add(ApplyDetails.FromOk(ffeConfig.Path.Path));
apply = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,46 @@ public void UpdateRemoteConfig_WithEmptyList_InvokesCallbackAndReturnsProviderNo
result.Reason.Should().Be(EvaluationReason.Error);
}

[Fact]
public void UpdateRemoteConfig_WithExistingPath_ReplacesPreviousConfiguration()
{
var rcmManager = new MockRcmSubscriptionManager();
var module = new FeatureFlagsModule(CreateSettings(), rcmManager);
var configPath = RemoteConfigurationPath.FromPath($"datadog/2/{RcmProducts.FfeFlags}/test-config/config");

rcmManager.LastSubscription!.Invoke(
new Dictionary<string, List<RemoteConfiguration>>
{
[RcmProducts.FfeFlags] = [CreateRemoteConfiguration(configPath, "old-flag")]
},
null);

module.Evaluate("old-flag", FeatureFlagsValueType.Boolean, false, "user-1", null).Error.Should().BeNull();

rcmManager.LastSubscription.Invoke(
new Dictionary<string, List<RemoteConfiguration>>
{
[RcmProducts.FfeFlags] = [CreateRemoteConfiguration(configPath, "new-flag")]
},
null);

module.Evaluate("old-flag", FeatureFlagsValueType.Boolean, false, "user-1", null).Error.Should().Be("FLAG_NOT_FOUND");
module.Evaluate("new-flag", FeatureFlagsValueType.Boolean, false, "user-1", null).Error.Should().BeNull();
}

private static RemoteConfiguration CreateRemoteConfiguration(RemoteConfigurationPath configPath, string flagKey)
{
var configJson = JsonConvert.SerializeObject(new ServerConfiguration
{
Flags = new FlagCollection
{
[flagKey] = new Flag { Key = flagKey, Enabled = true, VariationType = FeatureFlagsValueType.Boolean }
}
});
var configBytes = System.Text.Encoding.UTF8.GetBytes(configJson);
return new RemoteConfiguration(configPath, configBytes, configBytes.Length, new Dictionary<string, string> { { "sha256", "dummy" } }, 1);
}

private static TracerSettings CreateSettings()
{
var collection = new NameValueCollection
Expand Down
Loading