Skip to content

Commit

Permalink
Updated existing actor state manager tests
Browse files Browse the repository at this point in the history
Signed-off-by: Whit Waldo <whit.waldo@innovian.net>
  • Loading branch information
WhitWaldo committed Feb 23, 2025
1 parent 60cd82d commit 5055ef8
Showing 1 changed file with 67 additions and 48 deletions.
115 changes: 67 additions & 48 deletions test/Dapr.Actors.Test/ActorStateManagerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,33 @@ public async Task SetGet()
var host = ActorHost.CreateForTest<TestActor>();
host.StateProvider = new DaprStateProvider(interactor.Object, new JsonSerializerOptions());
var mngr = new ActorStateManager(new TestActor(host));
var token = new CancellationToken();
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));

interactor
.Setup(d => d.GetStateAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(new ActorStateResponse<string>("", null)));

await mngr.AddStateAsync("key1", "value1", token);
await mngr.AddStateAsync("key2", "value2", token);
Assert.Equal("value1", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value2", await mngr.GetStateAsync<string>("key2", token));

await Assert.ThrowsAsync<InvalidOperationException>(() => mngr.AddStateAsync("key1", "value3", token));
await Assert.ThrowsAsync<InvalidOperationException>(() => mngr.AddStateAsync("key2", "value4", token));

await mngr.SetStateAsync("key1", "value5", token);
await mngr.SetStateAsync("key2", "value6", token);
Assert.Equal("value5", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value6", await mngr.GetStateAsync<string>("key2", token));
const string key1 = "key1";
const string key2 = "key2";
const string val1 = "value1";
const string val2 = "value2";
const string val3 = "value3";
const string val4 = "value4";
const string val5 = "value5";
const string val6 = "value6";

await mngr.AddStateAsync(key1, val1, cts.Token);
await mngr.AddStateAsync(key2, val2, cts.Token);
Assert.Equal(val1, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val2, await mngr.GetStateAsync<string>(key2, cts.Token));

await Assert.ThrowsAsync<InvalidOperationException>(() => mngr.AddStateAsync(key1, val3, cts.Token));
await Assert.ThrowsAsync<InvalidOperationException>(() => mngr.AddStateAsync(key2, val4, cts.Token));

await mngr.SetStateAsync(key1, val5, cts.Token);
await mngr.SetStateAsync(key2, val6, cts.Token);
Assert.Equal(val5, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val6, await mngr.GetStateAsync<string>(key2, cts.Token));
}

[Fact]
Expand All @@ -62,30 +71,35 @@ public async Task StateWithTTL()
var host = ActorHost.CreateForTest<TestActor>();
host.StateProvider = new DaprStateProvider(interactor.Object, new JsonSerializerOptions());
var mngr = new ActorStateManager(new TestActor(host));
var token = new CancellationToken();
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));

interactor
.Setup(d => d.GetStateAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(new ActorStateResponse<string>("", null)));

await mngr.AddStateAsync("key1", "value1", TimeSpan.FromSeconds(1), token);
await mngr.AddStateAsync("key2", "value2", TimeSpan.FromSeconds(1), token);
Assert.Equal("value1", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value2", await mngr.GetStateAsync<string>("key2", token));
const string key1 = "key1";
const string key2 = "key2";
const string val1 = "value1";
const string val2 = "value2";

await mngr.AddStateAsync(key1, val1, TimeSpan.FromSeconds(1), cts.Token);
await mngr.AddStateAsync(key2, val2, TimeSpan.FromSeconds(1), cts.Token);
Assert.Equal(val1, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val2, await mngr.GetStateAsync<string>(key2, cts.Token));

await Task.Delay(TimeSpan.FromSeconds(1.5));
await Task.Delay(TimeSpan.FromSeconds(1.5), cts.Token);

await Assert.ThrowsAsync<KeyNotFoundException>(() => mngr.GetStateAsync<string>("key1", token));
await Assert.ThrowsAsync<KeyNotFoundException>(() => mngr.GetStateAsync<string>("key2", token));
await Assert.ThrowsAsync<KeyNotFoundException>(() => mngr.GetStateAsync<string>(key1, cts.Token));
await Assert.ThrowsAsync<KeyNotFoundException>(() => mngr.GetStateAsync<string>(key2, cts.Token));

// Should be able to add state again after expiry and should not expire.
await mngr.AddStateAsync("key1", "value1", token);
await mngr.AddStateAsync("key2", "value2", token);
Assert.Equal("value1", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value2", await mngr.GetStateAsync<string>("key2", token));
await Task.Delay(TimeSpan.FromSeconds(1.5));
Assert.Equal("value1", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value2", await mngr.GetStateAsync<string>("key2", token));
await mngr.AddStateAsync(key1, val1, cts.Token);
await mngr.AddStateAsync(key2, val2, cts.Token);
Assert.Equal(val1, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val2, await mngr.GetStateAsync<string>(key2, cts.Token));
await Task.Delay(TimeSpan.FromSeconds(1.5), cts.Token);
Assert.Equal(val1, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val2, await mngr.GetStateAsync<string>(key2, cts.Token));
}

[Fact]
Expand All @@ -95,39 +109,44 @@ public async Task StateRemoveAddTTL()
var host = ActorHost.CreateForTest<TestActor>();
host.StateProvider = new DaprStateProvider(interactor.Object, new JsonSerializerOptions());
var mngr = new ActorStateManager(new TestActor(host));
var token = new CancellationToken();
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60));

interactor
.Setup(d => d.GetStateAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(new ActorStateResponse<string>("", null)));

await mngr.AddStateAsync("key1", "value1", TimeSpan.FromSeconds(1), token);
await mngr.AddStateAsync("key2", "value2", TimeSpan.FromSeconds(1), token);
Assert.Equal("value1", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value2", await mngr.GetStateAsync<string>("key2", token));
const string key1 = "key1";
const string key2 = "key2";
const string val1 = "value1";
const string val2 = "value2";

await mngr.AddStateAsync(key1, val1, TimeSpan.FromSeconds(1), cts.Token);
await mngr.AddStateAsync(key2, val2, TimeSpan.FromSeconds(1), cts.Token);
Assert.Equal(val1, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val2, await mngr.GetStateAsync<string>(key2, cts.Token));

await mngr.SetStateAsync("key1", "value1", token);
await mngr.SetStateAsync("key2", "value2", token);
Assert.Equal("value1", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value2", await mngr.GetStateAsync<string>("key2", token));
await mngr.SetStateAsync(key1, val1, cts.Token);
await mngr.SetStateAsync(key2, val2, cts.Token);
Assert.Equal(val1, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val2, await mngr.GetStateAsync<string>(key2, cts.Token));

// TTL is removed so state should not expire.
await Task.Delay(TimeSpan.FromSeconds(1.5));
Assert.Equal("value1", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value2", await mngr.GetStateAsync<string>("key2", token));
await Task.Delay(TimeSpan.FromSeconds(1.5), cts.Token);
Assert.Equal(val1, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val2, await mngr.GetStateAsync<string>(key2, cts.Token));

// Adding TTL back should expire state.
await mngr.SetStateAsync("key1", "value1", TimeSpan.FromSeconds(1), token);
await mngr.SetStateAsync("key2", "value2", TimeSpan.FromSeconds(1), token);
Assert.Equal("value1", await mngr.GetStateAsync<string>("key1", token));
Assert.Equal("value2", await mngr.GetStateAsync<string>("key2", token));
await Task.Delay(TimeSpan.FromSeconds(1.5));
await Assert.ThrowsAsync<KeyNotFoundException>(() => mngr.GetStateAsync<string>("key1", token));
await Assert.ThrowsAsync<KeyNotFoundException>(() => mngr.GetStateAsync<string>("key2", token));
await mngr.SetStateAsync(key1, val1, TimeSpan.FromSeconds(1), cts.Token);
await mngr.SetStateAsync(key2, val2, TimeSpan.FromSeconds(1), cts.Token);
Assert.Equal(val1, await mngr.GetStateAsync<string>(key1, cts.Token));
Assert.Equal(val2, await mngr.GetStateAsync<string>(key2, cts.Token));
await Task.Delay(TimeSpan.FromSeconds(1.5), cts.Token);
await Assert.ThrowsAsync<KeyNotFoundException>(() => mngr.GetStateAsync<string>(key1, cts.Token));
await Assert.ThrowsAsync<KeyNotFoundException>(() => mngr.GetStateAsync<string>(key2, cts.Token));
}

[Fact]
public async Task StateDaprdExpireTime()
public async Task ValidateStateExpirationAndExceptions()
{
var interactor = new Mock<TestDaprInteractor>();
var host = ActorHost.CreateForTest<TestActor>();
Expand Down

0 comments on commit 5055ef8

Please sign in to comment.