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
30 changes: 15 additions & 15 deletions tests/Proto.Actor.Tests/SupervisionTests_AllForOne.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public async Task AllForOneStrategy_Should_ResumeChildOnFailure()

context.Send(parent, "hello");

child1MailboxStats.Reset.Wait(5000);
Assert.True(child1MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
Assert.Contains(ResumeMailbox.Instance, child1MailboxStats.Posted);
Assert.Contains(ResumeMailbox.Instance, child1MailboxStats.Received);
Assert.DoesNotContain(ResumeMailbox.Instance, child2MailboxStats.Posted);
Expand All @@ -47,8 +47,8 @@ public async Task AllForOneStrategy_Should_StopAllChildrenOnFailure()
await using var system = new ActorSystem();
var context = system.Root;

var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stop);
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stop);
var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Stop, 1, null);

var child1Props = Props.FromProducer(() => new ChildActor())
Expand All @@ -64,8 +64,8 @@ public async Task AllForOneStrategy_Should_StopAllChildrenOnFailure()

context.Send(parent, "hello");

child1MailboxStats.Reset.Wait(1000);
child2MailboxStats.Reset.Wait(1000);
Assert.True(child1MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
Assert.True(child2MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
Assert.Contains(Stop.Instance, child1MailboxStats.Posted);
Assert.Contains(Stop.Instance, child1MailboxStats.Received);
Assert.Contains(Stop.Instance, child2MailboxStats.Posted);
Expand All @@ -78,8 +78,8 @@ public async Task AllForOneStrategy_Should_RestartAllChildrenOnFailure()
await using var system = new ActorSystem();
var context = system.Root;

var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Restart);
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Restart);
var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Restart, 1, null);

var child1Props = Props.FromProducer(() => new ChildActor())
Expand All @@ -95,8 +95,8 @@ public async Task AllForOneStrategy_Should_RestartAllChildrenOnFailure()

context.Send(parent, "hello");

child1MailboxStats.Reset.Wait(1000);
child2MailboxStats.Reset.Wait(1000);
Assert.True(child1MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
Assert.True(child2MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
Assert.Contains(child1MailboxStats.Posted, msg => msg is Restart);
Assert.Contains(child1MailboxStats.Received, msg => msg is Restart);
Assert.Contains(child2MailboxStats.Posted, msg => msg is Restart);
Expand All @@ -109,8 +109,8 @@ public async Task AllForOneStrategy_Should_PassExceptionOnRestart()
await using var system = new ActorSystem();
var context = system.Root;

var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Restart);
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Restart);
var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Restart, 1, null);

var child1Props = Props.FromProducer(() => new ChildActor())
Expand All @@ -126,8 +126,8 @@ public async Task AllForOneStrategy_Should_PassExceptionOnRestart()

context.Send(parent, "hello");

child1MailboxStats.Reset.Wait(1000);
child2MailboxStats.Reset.Wait(1000);
Assert.True(child1MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
Assert.True(child2MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
Assert.Contains(child1MailboxStats.Posted, msg => msg is Restart r && r.Reason == Exception);
Assert.Contains(child1MailboxStats.Received, msg => msg is Restart r && r.Reason == Exception);
Assert.Contains(child2MailboxStats.Posted, msg => msg is Restart r && r.Reason == Exception);
Expand All @@ -140,7 +140,7 @@ public async Task AllForOneStrategy_Should_EscalateFailureToParent()
await using var system = new ActorSystem();
var context = system.Root;

var parentMailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
var parentMailboxStats = new TestMailboxStatistics(msg => msg is Failure);
var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Escalate, 1, null);
var childProps = Props.FromProducer(() => new ChildActor());

Expand All @@ -152,7 +152,7 @@ public async Task AllForOneStrategy_Should_EscalateFailureToParent()

context.Send(parent, "hello");

parentMailboxStats.Reset.Wait(1000);
Assert.True(parentMailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
var failure = parentMailboxStats.Received.OfType<Failure>().Single();
Assert.IsType<Exception>(failure.Reason);
}
Expand Down
91 changes: 91 additions & 0 deletions tests/Proto.Actor.Tests/SupervisionTests_AlwaysRestart.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Proto.Mailbox;
using Proto.TestFixtures;
using Xunit;

namespace Proto.Tests;

public class SupervisionTestsAlwaysRestart
{
private static readonly Exception Exception = new("boom");

[Fact]
public async Task AlwaysRestartStrategy_Should_RestartChildOnEveryFailure()
{
await using var system = new ActorSystem();
var context = system.Root;

var restartCount = 0;
var childMailboxStats = new TestMailboxStatistics(msg =>
{
if (msg is Restart)
{
restartCount++;
return restartCount == 3;
}

return false;
});

var childProps = Props.FromProducer(() => new ChildActor())
.WithMailbox(() => UnboundedMailbox.Create(childMailboxStats));

var parentProps = Props.FromProducer(() => new ParentActor(childProps))
.WithChildSupervisorStrategy(Supervision.AlwaysRestartStrategy);

var parent = context.Spawn(parentProps);

context.Send(parent, "1");
context.Send(parent, "2");
context.Send(parent, "3");

Assert.True(childMailboxStats.Reset.Wait(TimeSpan.FromSeconds(2)));
Assert.Equal(3, childMailboxStats.Received.OfType<Restart>().Count());
Assert.DoesNotContain(childMailboxStats.Posted, msg => msg is Stop);
}

private class ParentActor : IActor
{
private readonly Props _childProps;

public ParentActor(Props childProps)
{
_childProps = childProps;
}

private PID? _child;

public Task ReceiveAsync(IContext context)
{
switch (context.Message)
{
case Started:
_child = context.Spawn(_childProps);
break;
default:
if (_child != null)
{
context.Forward(_child);
}
break;
}

return Task.CompletedTask;
}
}

private class ChildActor : IActor
{
public Task ReceiveAsync(IContext context)
{
if (context.Message is string)
{
throw Exception;
}

return Task.CompletedTask;
}
}
}
8 changes: 4 additions & 4 deletions tests/Proto.Actor.Tests/SupervisionTests_OneForOne.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public async Task OneForOneStrategy_Should_ResumeChildOnFailure()

context.Send(parent, "hello");

childMailboxStats.Reset.Wait(1000);
Assert.True(childMailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
Assert.Contains(ResumeMailbox.Instance, childMailboxStats.Posted);
Assert.Contains(ResumeMailbox.Instance, childMailboxStats.Received);
}
Expand All @@ -55,7 +55,7 @@ public async Task OneForOneStrategy_Should_StopChildOnFailure()

context.Send(parent, "hello");

childMailboxStats.Reset.Wait(1000);
Assert.True(childMailboxStats.Reset.Wait(TimeSpan.FromSeconds(2)));
Assert.Contains(Stop.Instance, childMailboxStats.Posted);
Assert.Contains(Stop.Instance, childMailboxStats.Received);
}
Expand All @@ -66,7 +66,7 @@ public async Task OneForOneStrategy_Should_RestartChildOnFailure()
await using var system = new ActorSystem();
var context = system.Root;

var childMailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
var childMailboxStats = new TestMailboxStatistics(msg => msg is Restart);
var strategy = new OneForOneStrategy((pid, reason) => SupervisorDirective.Restart, 1, null);

var childProps = Props.FromProducer(() => new ChildActor())
Expand All @@ -79,7 +79,7 @@ public async Task OneForOneStrategy_Should_RestartChildOnFailure()

context.Send(parent, "hello");

childMailboxStats.Reset.Wait(2000);
Assert.True(childMailboxStats.Reset.Wait(TimeSpan.FromSeconds(2)));
Assert.Contains(childMailboxStats.Posted, msg => msg is Restart);
Assert.Contains(childMailboxStats.Received, msg => msg is Restart);
}
Expand Down
Loading