Skip to content
Merged
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
62 changes: 33 additions & 29 deletions src/OpenFeature.Contrib.Providers.Flagd/FlagdConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,20 @@ public static FlagdConfigBuilder Builder()
return new FlagdConfigBuilder();
}

internal static FlagdConfigBuilder Builder(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException(nameof(uri));
}

return new FlagdConfigBuilder()
.WithHost(uri.Host)
.WithPort(uri.Port)
.WithTls(string.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
.WithSocketPath(string.Equals(uri.Scheme, "unix", StringComparison.OrdinalIgnoreCase) ? uri.GetComponents(UriComponents.AbsoluteUri & ~UriComponents.Scheme, UriFormat.UriEscaped) : string.Empty);
}

/// <summary>
/// The host for the provider to connect to.
/// </summary>
Expand Down Expand Up @@ -175,7 +189,7 @@ public ILogger Logger
internal FlagdConfig()
{
_host = string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(EnvVarHost)) ? "localhost" : Environment.GetEnvironmentVariable(EnvVarHost);
_port = int.TryParse(Environment.GetEnvironmentVariable(EnvVarPort), out var port) ? port : 8013;
_port = int.TryParse(Environment.GetEnvironmentVariable(EnvVarPort), out var port) ? port : 0;
_useTLS = bool.TryParse(Environment.GetEnvironmentVariable(EnvVarTLS), out var useTLS) ? useTLS : false;
_cert = Environment.GetEnvironmentVariable(EnvCertPart) ?? "";
_socketPath = Environment.GetEnvironmentVariable(EnvVarSocketPath) ?? "";
Expand All @@ -194,33 +208,6 @@ internal FlagdConfig()
_resolverType = string.Equals(resolverTypeStr, InProcessResolverValue, StringComparison.OrdinalIgnoreCase) ? ResolverType.IN_PROCESS : ResolverType.RPC;
}

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

_host = url.Host;
_port = url.Port;
_useTLS = string.Equals(url.Scheme, "https", StringComparison.OrdinalIgnoreCase);
_cert = Environment.GetEnvironmentVariable(EnvCertPart) ?? "";
_socketPath = string.Equals(url.Scheme, "unix", StringComparison.OrdinalIgnoreCase) ? url.GetComponents(UriComponents.AbsoluteUri & ~UriComponents.Scheme, UriFormat.UriEscaped) : "";
_sourceSelector = Environment.GetEnvironmentVariable(EnvVarSourceSelector) ?? "";

var cacheStr = Environment.GetEnvironmentVariable(EnvVarCache) ?? "";

if (string.Equals(cacheStr, LruCacheValue, StringComparison.OrdinalIgnoreCase))
{
_cache = true;
_maxCacheSize = int.TryParse(Environment.GetEnvironmentVariable(EnvVarMaxCacheSize), out var maxCacheSize) ? maxCacheSize : CacheSizeDefault;
_maxEventStreamRetries = int.TryParse(Environment.GetEnvironmentVariable(EnvVarMaxEventStreamRetries), out var maxEventStreamRetries) ? maxEventStreamRetries : 3;
}

var resolverTypeStr = Environment.GetEnvironmentVariable(EnvVarResolverType) ?? "RPC";
_resolverType = string.Equals(resolverTypeStr, InProcessResolverValue, StringComparison.OrdinalIgnoreCase) ? ResolverType.IN_PROCESS : ResolverType.RPC;
}

internal Uri GetUri()
{
Uri uri;
Expand Down Expand Up @@ -356,6 +343,23 @@ public FlagdConfigBuilder WithLogger(ILogger logger)
/// </summary>
public FlagdConfig Build()
{
return _config;
this.PreBuild();

return this._config;
}

private void PreBuild()
{
if (this._config.Port == 0)
{
var defaultPortForResolver = this._config.ResolverType switch
{
ResolverType.RPC => 8013,
ResolverType.IN_PROCESS => 8015,
_ => throw new NotImplementedException("ResolverType does not use Ports.")
};

this._config.Port = defaultPortForResolver;
}
}
}
4 changes: 2 additions & 2 deletions src/OpenFeature.Contrib.Providers.Flagd/FlagdProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public sealed class FlagdProvider : FeatureProvider
/// FLAGD_MAX_EVENT_STREAM_RETRIES - The maximum amount of retries for establishing the EventStream
/// FLAGD_RESOLVER - The type of resolver (in-process or rpc) to be used for the provider
/// </summary>
public FlagdProvider() : this(new FlagdConfig())
public FlagdProvider() : this(FlagdConfig.Builder().Build())
{
}

Expand All @@ -51,7 +51,7 @@ public FlagdProvider() : this(new FlagdConfig())
/// <param name="url">The URL of the flagd server</param>
/// <exception cref="ArgumentNullException">if no url is provided.</exception>
/// </summary>
public FlagdProvider(Uri url) : this(new FlagdConfig(url))
public FlagdProvider(Uri url) : this(FlagdConfig.Builder(url).Build())
{
}

Expand Down
72 changes: 41 additions & 31 deletions test/OpenFeature.Contrib.Providers.Flagd.Test/FlagdConfigTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@ namespace OpenFeature.Contrib.Providers.Flagd.Test;

public class UnitTestFlagdConfig
{
public UnitTestFlagdConfig()
{
Utils.CleanEnvVars();
}

[Fact]
public void TestFlagdConfigDefault()
{
Utils.CleanEnvVars();
var config = new FlagdConfig();
var config = FlagdConfig.Builder().Build();

Assert.False(config.CacheEnabled);
Assert.Equal(new Uri("http://localhost:8013"), config.GetUri());
Expand All @@ -20,42 +24,50 @@ public void TestFlagdConfigDefault()
[Fact]
public void TestFlagdConfigDefaultLogger()
{
Utils.CleanEnvVars();
var config = new FlagdConfig();
var config = FlagdConfig.Builder().Build();

Assert.NotNull(config.Logger);
Assert.Equal(NullLogger.Instance, config.Logger);
}

[Theory]
[InlineData(ResolverType.RPC, 8013)]
[InlineData(ResolverType.IN_PROCESS, 8015)]
public void WithResolverType_DefaultsPortCorrectly(ResolverType resolverType, int expectedPort)
{
var config = FlagdConfig.Builder()
.WithResolverType(resolverType)
.Build();

Assert.Equal(expectedPort, config.Port);
}

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

var config = new FlagdConfig();
var config = FlagdConfig.Builder().Build();

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

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

var config = new FlagdConfig();
var config = FlagdConfig.Builder().Build();

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

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

var config = new FlagdConfig();
var config = FlagdConfig.Builder().Build();

Assert.True(config.CacheEnabled);
Assert.Equal(FlagdConfig.CacheSizeDefault, config.MaxCacheSize);
Expand All @@ -64,11 +76,10 @@ public void TestFlagdConfigEnabledCacheDefaultCacheSize()
[Fact]
public void TestFlagdConfigEnabledCacheApplyCacheSize()
{
Utils.CleanEnvVars();
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "20");

var config = new FlagdConfig();
var config = FlagdConfig.Builder().Build();

Assert.True(config.CacheEnabled);
Assert.Equal(20, config.MaxCacheSize);
Expand All @@ -77,17 +88,16 @@ public void TestFlagdConfigEnabledCacheApplyCacheSize()
[Fact]
public void TestFlagdConfigSetCertificatePath()
{
Utils.CleanEnvVars();
Environment.SetEnvironmentVariable(FlagdConfig.EnvCertPart, "/cert/path");

var config = new FlagdConfig();
var config = FlagdConfig.Builder().Build();

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

Utils.CleanEnvVars();

config = new FlagdConfig();
config = FlagdConfig.Builder().Build();

Assert.Equal("", config.CertificatePath);
Assert.False(config.UseCertificate);
Expand All @@ -96,8 +106,7 @@ public void TestFlagdConfigSetCertificatePath()
[Fact]
public void TestFlagdConfigFromUriHttp()
{
Utils.CleanEnvVars();
var config = new FlagdConfig(new Uri("http://domain:8123"));
var config = FlagdConfig.Builder(new Uri("http://domain:8123")).Build();

Assert.False(config.CacheEnabled);
Assert.Equal(new Uri("http://domain:8123"), config.GetUri());
Expand All @@ -106,8 +115,7 @@ public void TestFlagdConfigFromUriHttp()
[Fact]
public void TestFlagdConfigFromUriHttps()
{
Utils.CleanEnvVars();
var config = new FlagdConfig(new Uri("https://domain:8123"));
var config = FlagdConfig.Builder(new Uri("https://domain:8123")).Build();

Assert.False(config.CacheEnabled);
Assert.Equal(new Uri("https://domain:8123"), config.GetUri());
Expand All @@ -116,27 +124,33 @@ public void TestFlagdConfigFromUriHttps()
[Fact]
public void TestFlagdConfigFromUriUnix()
{
Utils.CleanEnvVars();
var config = new FlagdConfig(new Uri("unix:///var/run/tmp.sock"));
var config = FlagdConfig.Builder(new Uri("unix:///var/run/tmp.sock")).Build();

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

[Fact]
public void TestFlagdConfigWithNullUri_ThrowsArgumentNullException()
{
var ex = Assert.ThrowsAny<ArgumentNullException>(() => FlagdConfig.Builder(null).Build());

Assert.Equal("uri", ex.ParamName);
}

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

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

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

Utils.CleanEnvVars();

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

Assert.Equal("", config.CertificatePath);
Assert.False(config.UseCertificate);
Expand All @@ -148,7 +162,7 @@ public void TestFlagdConfigFromUriEnabledCacheDefaultCacheSize()
Utils.CleanEnvVars();
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");

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

Assert.True(config.CacheEnabled);
Assert.Equal(FlagdConfig.CacheSizeDefault, config.MaxCacheSize);
Expand All @@ -157,11 +171,10 @@ public void TestFlagdConfigFromUriEnabledCacheDefaultCacheSize()
[Fact]
public void TestFlagdConfigFromUriEnabledCacheApplyCacheSize()
{
Utils.CleanEnvVars();
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarCache, "LRU");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarMaxCacheSize, "20");

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

Assert.True(config.CacheEnabled);
Assert.Equal(20, config.MaxCacheSize);
Expand All @@ -170,11 +183,10 @@ public void TestFlagdConfigFromUriEnabledCacheApplyCacheSize()
[Fact]
public void TestFlagdConfigResolverType()
{
Utils.CleanEnvVars();
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarResolverType, "in-process");
Environment.SetEnvironmentVariable(FlagdConfig.EnvVarSourceSelector, "source-selector");

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

Assert.Equal(ResolverType.IN_PROCESS, config.ResolverType);
Assert.Equal("source-selector", config.SourceSelector);
Expand All @@ -183,8 +195,6 @@ public void TestFlagdConfigResolverType()
[Fact]
public void TestFlagdConfigBuilder()
{
Utils.CleanEnvVars();

var logger = new FakeLogger<UnitTestFlagdConfig>();
var config = new FlagdConfigBuilder()
.WithCache(true)
Expand Down
Loading