Repository navigation
Expand file tree
/
Copy pathRuntimeJournalGraphCallerTests.cs
More file actions
63 lines (57 loc) · 3.05 KB
/
Copy pathRuntimeJournalGraphCallerTests.cs
File metadata and controls
63 lines (57 loc) · 3.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
namespace KeyLoad.UnitTests.OrleansExecution;
[RuntimeJournalDataSource]
[NotInParallel]
internal sealed class RuntimeJournalGraphCallerTests(RuntimeRuntimeJournalFixture fixture)
{
private const string JournalPrefix = "graph-caller";
private const int InitialFirstByte = 7;
private const int InitialSecondByte = 2;
private const int FollowUpFirstByte = 8;
private const int FollowUpSecondByte = 3;
[Test]
public async Task JournalCallerIsExactRestoredAndHealthyAfterDeniedCalls()
{
var cancellationToken = TestContext.Current!.Execution.CancellationToken;
cancellationToken.ThrowIfCancellationRequested();
var grainId = $"execution/{JournalPrefix}/{Guid.NewGuid():N}";
var grain = fixture.Grains.GetGrain<IRuntimeJournalReplayGrain>(grainId);
var original = new byte[] { InitialFirstByte, InitialSecondByte };
await grain.SetAsync(original);
await AssertStoredAsync(grain, original);
var probe = fixture.Grains.GetGrain<IRuntimeJournalGraphCallerProbeGrain>(Guid.NewGuid());
var observation = await probe.ExerciseAsync(cancellationToken);
await AssertCallerAndDenialOutcomes(observation);
await AssertStoredAsync(grain, original);
var followUp = new byte[] { FollowUpFirstByte, FollowUpSecondByte };
await grain.SetAsync(followUp);
var priorActivation = await grain.GetActivationTokenAsync();
await grain.DeactivateAsync();
await RuntimeJournalGraphCallerSupport.WaitForActivationChangeAsync(grain, priorActivation,
fixture.TimingOptions.Value);
var reopened = fixture.Grains.GetGrain<IRuntimeJournalReplayGrain>(grainId);
await AssertStoredAsync(reopened, followUp);
var beforeDeleteActivation = await reopened.GetActivationTokenAsync();
await reopened.DeleteAsync();
await reopened.DeactivateAsync();
await RuntimeJournalGraphCallerSupport.WaitForActivationChangeAsync(reopened,
beforeDeleteActivation, fixture.TimingOptions.Value);
await Assert.That(await fixture.Grains.GetGrain<IRuntimeJournalReplayGrain>(grainId).ReadAsync())
.IsNull();
}
private static async Task AssertStoredAsync(IRuntimeJournalReplayGrain grain, byte[] expected)
{
var actual = await grain.ReadAsync();
await Assert.That(actual).IsNotNull();
await Assert.That(actual!.SequenceEqual(expected)).IsTrue();
}
private static async Task AssertCallerAndDenialOutcomes(RuntimeJournalGraphCallerResult observation)
{
await Assert.That(observation.ProviderReadCompleted).IsTrue();
await Assert.That(observation.ProviderRestoredScopedCaller).IsTrue();
await Assert.That(observation.WrongMethodDenied).IsTrue();
await Assert.That(observation.WrongMethodRestoredScopedCaller).IsTrue();
await Assert.That(observation.WrongTargetDenied).IsTrue();
await Assert.That(observation.WrongTargetRestoredScopedCaller).IsTrue();
await Assert.That(observation.ProbeRestoredOriginalCaller).IsTrue();
}
}