Skip to content

Commit b0fd5cb

Browse files
SNOW-1902246 Feature flag for experimental authentication (#1172)
1 parent 055efb2 commit b0fd5cb

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using System;
2+
using NUnit.Framework;
3+
using Moq;
4+
using Snowflake.Data.Configuration;
5+
using Snowflake.Data.Core.Tools;
6+
7+
namespace Snowflake.Data.Tests.UnitTests.Configuration
8+
{
9+
[TestFixture]
10+
public class ClientFeatureFlagsTest
11+
{
12+
[Test]
13+
[TestCase(ClientFeatureFlags.EnabledExperimentalAuthenticationVariableName, "true", true)]
14+
[TestCase(ClientFeatureFlags.EnabledExperimentalAuthenticationVariableName, "TRUE", true)]
15+
[TestCase(ClientFeatureFlags.EnabledExperimentalAuthenticationVariableName, "false", false)]
16+
[TestCase(ClientFeatureFlags.EnabledExperimentalAuthenticationVariableName, "", false)]
17+
[TestCase(ClientFeatureFlags.EnabledExperimentalAuthenticationVariableName, null, false)]
18+
[TestCase(ClientFeatureFlags.EnabledExperimentalAuthenticationVariableName, "not a bool value", false)]
19+
[TestCase("OTHER_VARIABLE_NAME", "true", false)]
20+
public void TestEnabledExperimentalAuthentication(string variableName, string variableValue, bool expectedValue) {
21+
// arrange
22+
var environmentOperations = new Mock<EnvironmentOperations>();
23+
environmentOperations
24+
.Setup(e => e.GetEnvironmentVariable(variableName))
25+
.Returns(variableValue);
26+
27+
// act
28+
var clientFeatures = new ClientFeatureFlags(environmentOperations.Object);
29+
30+
// assert
31+
Assert.AreEqual(expectedValue, clientFeatures.IsEnabledExperimentalAuthentication);
32+
}
33+
34+
[Test]
35+
public void TestDisabledExperimentalAuthenticationWhenCouldNotReadEnvVariable()
36+
{
37+
// arrange
38+
var environmentOperations = new Mock<EnvironmentOperations>();
39+
environmentOperations
40+
.Setup(e => e.GetEnvironmentVariable(ClientFeatureFlags.EnabledExperimentalAuthenticationVariableName))
41+
.Throws(() => new Exception("Could not read environmental variable"));
42+
43+
// act
44+
var clientFeatures = new ClientFeatureFlags(environmentOperations.Object);
45+
46+
// assert
47+
Assert.IsFalse(clientFeatures.IsEnabledExperimentalAuthentication);
48+
}
49+
}
50+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System;
2+
using Snowflake.Data.Core.Tools;
3+
using Snowflake.Data.Log;
4+
5+
namespace Snowflake.Data.Configuration
6+
{
7+
internal class ClientFeatureFlags
8+
{
9+
private static readonly SFLogger s_logger = SFLoggerFactory.GetLogger<ClientFeatureFlags>();
10+
public bool IsEnabledExperimentalAuthentication { get; set; }
11+
12+
public static readonly ClientFeatureFlags Instance = new ClientFeatureFlags(EnvironmentOperations.Instance);
13+
14+
internal const string EnabledExperimentalAuthenticationVariableName = "SF_ENABLE_EXPERIMENTAL_AUTHENTICATION";
15+
private const bool EnabledExperimentalAuthenticationDefaultValue = false;
16+
17+
internal ClientFeatureFlags(EnvironmentOperations environmentOperations)
18+
{
19+
IsEnabledExperimentalAuthentication = ReadEnabledExperimentalAuthentication(environmentOperations);
20+
}
21+
22+
private bool ReadEnabledExperimentalAuthentication(EnvironmentOperations environmentOperations)
23+
{
24+
try
25+
{
26+
var isEnabledString = environmentOperations.GetEnvironmentVariable(EnabledExperimentalAuthenticationVariableName);
27+
if (string.IsNullOrEmpty(isEnabledString))
28+
{
29+
s_logger.Debug($"Variable '{EnabledExperimentalAuthenticationVariableName}' not set. Using the default value: {EnabledExperimentalAuthenticationDefaultValue}");
30+
return EnabledExperimentalAuthenticationDefaultValue;
31+
}
32+
var isEnabled = bool.Parse(isEnabledString);
33+
s_logger.Debug($"Variable '{EnabledExperimentalAuthenticationVariableName}' was read as: {isEnabled}");
34+
return isEnabled;
35+
}
36+
catch (Exception exception)
37+
{
38+
s_logger.Error($"Could not get or parse '{EnabledExperimentalAuthenticationVariableName}' variable. Used the default value: {EnabledExperimentalAuthenticationDefaultValue}.", exception);
39+
return EnabledExperimentalAuthenticationDefaultValue;
40+
}
41+
}
42+
}
43+
}

0 commit comments

Comments
 (0)