Skip to content

Commit

Permalink
fix: Setup config correct when passing a Uri (fixes open-feature#71) (o…
Browse files Browse the repository at this point in the history
…pen-feature#83)

Signed-off-by: bjoneill <[email protected]>
  • Loading branch information
bjoneill authored Sep 13, 2023
1 parent b749549 commit e27d351
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 42 deletions.
24 changes: 23 additions & 1 deletion src/OpenFeature.Contrib.Providers.Flagd/FlagdConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,28 @@ internal FlagdConfig()
}
}

internal FlagdConfig(Uri url)
{
if (url == null)
{
throw new ArgumentNullException(nameof(url));
}

_host = url.Host;
_port = url.Port.ToString();
_useTLS = url.Scheme.ToLower().Equals("https");
_cert = Environment.GetEnvironmentVariable(EnvCertPart) ?? "";
_socketPath = url.Scheme.ToLower().Equals("unix") ? url.GetComponents(UriComponents.AbsoluteUri & ~UriComponents.Scheme, UriFormat.UriEscaped) : "";
var cacheStr = Environment.GetEnvironmentVariable(EnvVarCache) ?? "";

if (cacheStr.ToUpper().Equals("LRU"))
{
_cache = true;
_maxCacheSize = int.Parse(Environment.GetEnvironmentVariable(EnvVarMaxCacheSize) ?? $"{CacheSizeDefault}");
_maxEventStreamRetries = int.Parse(Environment.GetEnvironmentVariable(EnvVarMaxEventStreamRetries) ?? "3");
}
}

internal Uri GetUri()
{
Uri uri;
Expand All @@ -97,4 +119,4 @@ internal Uri GetUri()
return uri;
}
}
}
}
34 changes: 8 additions & 26 deletions src/OpenFeature.Contrib.Providers.Flagd/FlagdProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,39 +50,22 @@ public sealed class FlagdProvider : FeatureProvider
/// FLAGD_MAX_CACHE_SIZE - The maximum size of the cache (default="10")
/// FLAGD_MAX_EVENT_STREAM_RETRIES - The maximum amount of retries for establishing the EventStream
/// </summary>
public FlagdProvider()
public FlagdProvider() : this(new FlagdConfig())
{
_config = new FlagdConfig();

_client = BuildClientForPlatform(_config.GetUri());

_mtx = new System.Threading.Mutex();

if (_config.CacheEnabled)
{
_cache = new LRUCache<string, object>(_config.MaxCacheSize);
Task.Run(async () =>
{
await HandleEvents();
});
}
}

/// <summary>
/// Constructor of the provider.
/// Constructor of the provider. This constructor uses the value of the following
/// environment variables to initialise its client:
/// FLAGD_FLAGD_SERVER_CERT_PATH - The path to the client certificate (default="")
/// FLAGD_CACHE - Enable or disable the cache (default="false")
/// FLAGD_MAX_CACHE_SIZE - The maximum size of the cache (default="10")
/// FLAGD_MAX_EVENT_STREAM_RETRIES - The maximum amount of retries for establishing the EventStream
/// <param name="url">The URL of the flagD server</param>
/// <exception cref="ArgumentNullException">if no url is provided.</exception>
/// </summary>
public FlagdProvider(Uri url)
public FlagdProvider(Uri url) : this(new FlagdConfig(url))
{
if (url == null)
{
throw new ArgumentNullException(nameof(url));
}

_mtx = new System.Threading.Mutex();

_client = BuildClientForPlatform(url);
}

/// <summary>
Expand Down Expand Up @@ -610,4 +593,3 @@ private Service.ServiceClient BuildClientForPlatform(Uri url)
}
}
}

105 changes: 90 additions & 15 deletions test/OpenFeature.Contrib.Providers.Flagd.Test/FlagdConfigTest.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using Xunit;

namespace OpenFeature.Contrib.Providers.Flagd.Test
Expand All @@ -11,36 +12,36 @@ public void TestFlagdConfigDefault()
var config = new FlagdConfig();

Assert.False(config.CacheEnabled);
Assert.Equal(new System.Uri("http://localhost:8013"), config.GetUri());
Assert.Equal(new Uri("http://localhost:8013"), config.GetUri());
}

[Fact]
public void TestFlagdConfigUseTLS()
{
CleanEnvVars();
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarTLS, "true");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarTLS, "true");

var config = new FlagdConfig();

Assert.Equal(new System.Uri("https://localhost:8013"), config.GetUri());
Assert.Equal(new Uri("https://localhost:8013"), config.GetUri());
}

[Fact]
public void TestFlagdConfigUnixSocket()
{
CleanEnvVars();
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarSocketPath, "tmp.sock");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarSocketPath, "tmp.sock");

var config = new FlagdConfig();

Assert.Equal(new System.Uri("unix://tmp.sock/"), config.GetUri());
Assert.Equal(new Uri("unix://tmp.sock/"), config.GetUri());
}

[Fact]
public void TestFlagdConfigEnabledCacheDefaultCacheSize()
{
CleanEnvVars();
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");

var config = new FlagdConfig();

Expand All @@ -52,8 +53,8 @@ public void TestFlagdConfigEnabledCacheDefaultCacheSize()
public void TestFlagdConfigEnabledCacheApplyCacheSize()
{
CleanEnvVars();
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "20");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "20");

var config = new FlagdConfig();

Expand All @@ -65,7 +66,7 @@ public void TestFlagdConfigEnabledCacheApplyCacheSize()
public void TestFlagdConfigSetCertificatePath()
{
CleanEnvVars();
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvCertPart, "/cert/path");
Environment.SetEnvironmentVariable(FlagdConfig.EnvCertPart, "/cert/path");

var config = new FlagdConfig();

Expand All @@ -80,13 +81,87 @@ public void TestFlagdConfigSetCertificatePath()
Assert.False(config.UseCertificate);
}

[Fact]
public void TestFlagdConfigFromUriHttp()
{
CleanEnvVars();
var config = new FlagdConfig(new Uri("http://domain:8123"));

Assert.False(config.CacheEnabled);
Assert.Equal(new Uri("http://domain:8123"), config.GetUri());
}

[Fact]
public void TestFlagdConfigFromUriHttps()
{
CleanEnvVars();
var config = new FlagdConfig(new Uri("https://domain:8123"));

Assert.False(config.CacheEnabled);
Assert.Equal(new Uri("https://domain:8123"), config.GetUri());
}

[Fact]
public void TestFlagdConfigFromUriUnix()
{
CleanEnvVars();
var config = new FlagdConfig(new Uri("unix:///var/run/tmp.sock"));

Assert.False(config.CacheEnabled);
Assert.Equal(new Uri("unix:///var/run/tmp.sock"), config.GetUri());
}

[Fact]
public void TestFlagdConfigFromUriSetCertificatePath()
{
CleanEnvVars();
Environment.SetEnvironmentVariable(FlagdConfig.EnvCertPart, "/cert/path");

var config = new FlagdConfig(new Uri("http://localhost:8013"));

Assert.Equal("/cert/path", config.CertificatePath);
Assert.True(config.UseCertificate);

CleanEnvVars();

config = new FlagdConfig(new Uri("http://localhost:8013"));

Assert.Equal("", config.CertificatePath);
Assert.False(config.UseCertificate);
}

[Fact]
public void TestFlagdConfigFromUriEnabledCacheDefaultCacheSize()
{
CleanEnvVars();
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");

var config = new FlagdConfig(new Uri("http://localhost:8013"));

Assert.True(config.CacheEnabled);
Assert.Equal(FlagdConfig.CacheSizeDefault, config.MaxCacheSize);
}

[Fact]
public void TestFlagdConfigFromUriEnabledCacheApplyCacheSize()
{
CleanEnvVars();
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "20");

var config = new FlagdConfig(new Uri("http://localhost:8013"));

Assert.True(config.CacheEnabled);
Assert.Equal(20, config.MaxCacheSize);
}

private void CleanEnvVars()
{
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarTLS, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarSocketPath, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvCertPart, "");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarTLS, "");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarSocketPath, "");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "");
Environment.SetEnvironmentVariable(FlagdConfig.EnvCertPart, "");
}
}
}
}
38 changes: 38 additions & 0 deletions test/OpenFeature.Contrib.Providers.Flagd.Test/FlagdProviderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,44 @@ public void TestGetProviderWithConfig()
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "");
}

[Fact]
public void TestGetProviderWithUri()
{
// Set env variables (should be used by the constructor)
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvCertPart, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "20");

// Set env variables (should be ignored by the constructor)
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarHost, "localhost111");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarPort, "5001");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarTLS, "false");

// Create provider, which ignores the env vars and uses the config
var flagdProvider = new FlagdProvider(new Uri("https://localhost:8013"));

// Client should no be nil
var client = flagdProvider.GetClient();
Assert.NotNull(client);

// Retrieve config for assertions
var config = flagdProvider.GetConfig();

// Assert
Assert.Equal("", config.CertificatePath);
Assert.Equal(new Uri("https://localhost:8013"), config.GetUri());
Assert.True(config.CacheEnabled);
Assert.Equal(20, config.MaxCacheSize);

// Cleanup
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvCertPart, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarHost, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarPort, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarTLS, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "");
System.Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "");
}

[Fact]
public void TestResolveBooleanValue()
{
Expand Down

0 comments on commit e27d351

Please sign in to comment.