Skip to content
Open
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
63 changes: 62 additions & 1 deletion DevCycle.SDK.Server.Local.MSTests/DevCycleTest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Threading.Tasks;
using DevCycle.SDK.Server.Local.Api;
using DevCycle.SDK.Server.Common.Model;
Expand Down Expand Up @@ -233,6 +233,67 @@ public void Variable_NullUser_ThrowsException()
});
}

[TestMethod]
public void Variable_NullKey_ThrowsArgumentException()
{
// Reaching the WASM bucketing engine with a null/empty flag key
// triggers an internal abort() and corrupts the WASM heap. Match
// the Java/Python SDKs (and Cloud client) by failing fast with a
// clear ArgumentException before we ever enter WASM.
using DevCycleLocalClient api = DevCycleTestClient.getTestClient();
var user = new DevCycleUser("test_user");

Assert.Throws<ArgumentException>(() => api.Variable(user, null, true).Result);
}

[TestMethod]
public void Variable_EmptyKey_ThrowsArgumentException()
{
using DevCycleLocalClient api = DevCycleTestClient.getTestClient();
var user = new DevCycleUser("test_user");

Assert.Throws<ArgumentException>(() => api.Variable(user, "", true).Result);
}

[TestMethod]
public async Task VariableAsync_NullKey_ThrowsArgumentException()
{
using DevCycleLocalClient api = DevCycleTestClient.getTestClient();
var user = new DevCycleUser("test_user");

await Assert.ThrowsExactlyAsync<ArgumentException>(async () =>
await api.VariableAsync(user, null, true));
}

[TestMethod]
public async Task VariableAsync_EmptyKey_ThrowsArgumentException()
{
using DevCycleLocalClient api = DevCycleTestClient.getTestClient();
var user = new DevCycleUser("test_user");

await Assert.ThrowsExactlyAsync<ArgumentException>(async () =>
await api.VariableAsync(user, "", true));
}

[TestMethod]
public void Variable_NullDefaultValue_ThrowsArgumentNullException()
{
using DevCycleLocalClient api = DevCycleTestClient.getTestClient();
var user = new DevCycleUser("test_user");

Assert.Throws<ArgumentNullException>(() => api.Variable<string>(user, "some_key", null).Result);
}

[TestMethod]
public async Task VariableAsync_NullDefaultValue_ThrowsArgumentNullException()
{
using DevCycleLocalClient api = DevCycleTestClient.getTestClient();
var user = new DevCycleUser("test_user");

await Assert.ThrowsExactlyAsync<ArgumentNullException>(async () =>
await api.VariableAsync<string>(user, "some_key", null));
}

[TestMethod]
public void User_NullUserId_ThrowsException()
{
Expand Down
20 changes: 20 additions & 0 deletions DevCycle.SDK.Server.Local/Api/DevCycleLocalClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@
ILoggerFactory loggerFactory,
EnvironmentConfigManager configManager,
ILocalBucketing localBucketing,
DevCycleRestClientOptions restClientOptions = null

Check warning on line 87 in DevCycle.SDK.Server.Local/Api/DevCycleLocalClient.cs

View workflow job for this annotation

GitHub Actions / run-example

Cannot convert null literal to non-nullable reference type.

Check warning on line 87 in DevCycle.SDK.Server.Local/Api/DevCycleLocalClient.cs

View workflow job for this annotation

GitHub Actions / run-example

Cannot convert null literal to non-nullable reference type.

Check warning on line 87 in DevCycle.SDK.Server.Local/Api/DevCycleLocalClient.cs

View workflow job for this annotation

GitHub Actions / build

Cannot convert null literal to non-nullable reference type.
)
{
ValidateSDKKey(sdkKey);
Expand Down Expand Up @@ -307,6 +307,16 @@
{
var requestUser = new DevCyclePopulatedUser(user);

if (string.IsNullOrEmpty(key))
{
throw new ArgumentException("key cannot be null or empty");
}

if (defaultValue == null)
{
throw new ArgumentNullException(nameof(defaultValue));
}

if (!configManager.Initialized)
{
logger.LogWarning("Variable called before DevCycleClient has initialized, returning default value");
Expand Down Expand Up @@ -366,6 +376,16 @@
{
var requestUser = new DevCyclePopulatedUser(user);

if (string.IsNullOrEmpty(key))
{
throw new ArgumentException("key cannot be null or empty");
}

if (defaultValue == null)
{
throw new ArgumentNullException(nameof(defaultValue));
}
Comment thread
jonathannorris marked this conversation as resolved.

if (!configManager.Initialized)
{
logger.LogWarning("Variable called before DevCycleClient has initialized, returning default value");
Expand Down
Loading