Skip to content

Commit 7c698f1

Browse files
authored
test: cover always restart supervision (#2201)
1 parent 8c2b056 commit 7c698f1

File tree

3 files changed

+110
-19
lines changed

3 files changed

+110
-19
lines changed

tests/Proto.Actor.Tests/SupervisionTests_AllForOne.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public async Task AllForOneStrategy_Should_ResumeChildOnFailure()
3434

3535
context.Send(parent, "hello");
3636

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

50-
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
51-
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
50+
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stop);
51+
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stop);
5252
var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Stop, 1, null);
5353

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

6565
context.Send(parent, "hello");
6666

67-
child1MailboxStats.Reset.Wait(1000);
68-
child2MailboxStats.Reset.Wait(1000);
67+
Assert.True(child1MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
68+
Assert.True(child2MailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
6969
Assert.Contains(Stop.Instance, child1MailboxStats.Posted);
7070
Assert.Contains(Stop.Instance, child1MailboxStats.Received);
7171
Assert.Contains(Stop.Instance, child2MailboxStats.Posted);
@@ -78,8 +78,8 @@ public async Task AllForOneStrategy_Should_RestartAllChildrenOnFailure()
7878
await using var system = new ActorSystem();
7979
var context = system.Root;
8080

81-
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
82-
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
81+
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Restart);
82+
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Restart);
8383
var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Restart, 1, null);
8484

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

9696
context.Send(parent, "hello");
9797

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

112-
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
113-
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped);
112+
var child1MailboxStats = new TestMailboxStatistics(msg => msg is Restart);
113+
var child2MailboxStats = new TestMailboxStatistics(msg => msg is Restart);
114114
var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Restart, 1, null);
115115

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

127127
context.Send(parent, "hello");
128128

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

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

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

153153
context.Send(parent, "hello");
154154

155-
parentMailboxStats.Reset.Wait(1000);
155+
Assert.True(parentMailboxStats.Reset.Wait(TimeSpan.FromSeconds(5)));
156156
var failure = parentMailboxStats.Received.OfType<Failure>().Single();
157157
Assert.IsType<Exception>(failure.Reason);
158158
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using System;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using Proto.Mailbox;
5+
using Proto.TestFixtures;
6+
using Xunit;
7+
8+
namespace Proto.Tests;
9+
10+
public class SupervisionTestsAlwaysRestart
11+
{
12+
private static readonly Exception Exception = new("boom");
13+
14+
[Fact]
15+
public async Task AlwaysRestartStrategy_Should_RestartChildOnEveryFailure()
16+
{
17+
await using var system = new ActorSystem();
18+
var context = system.Root;
19+
20+
var restartCount = 0;
21+
var childMailboxStats = new TestMailboxStatistics(msg =>
22+
{
23+
if (msg is Restart)
24+
{
25+
restartCount++;
26+
return restartCount == 3;
27+
}
28+
29+
return false;
30+
});
31+
32+
var childProps = Props.FromProducer(() => new ChildActor())
33+
.WithMailbox(() => UnboundedMailbox.Create(childMailboxStats));
34+
35+
var parentProps = Props.FromProducer(() => new ParentActor(childProps))
36+
.WithChildSupervisorStrategy(Supervision.AlwaysRestartStrategy);
37+
38+
var parent = context.Spawn(parentProps);
39+
40+
context.Send(parent, "1");
41+
context.Send(parent, "2");
42+
context.Send(parent, "3");
43+
44+
Assert.True(childMailboxStats.Reset.Wait(TimeSpan.FromSeconds(2)));
45+
Assert.Equal(3, childMailboxStats.Received.OfType<Restart>().Count());
46+
Assert.DoesNotContain(childMailboxStats.Posted, msg => msg is Stop);
47+
}
48+
49+
private class ParentActor : IActor
50+
{
51+
private readonly Props _childProps;
52+
53+
public ParentActor(Props childProps)
54+
{
55+
_childProps = childProps;
56+
}
57+
58+
private PID? _child;
59+
60+
public Task ReceiveAsync(IContext context)
61+
{
62+
switch (context.Message)
63+
{
64+
case Started:
65+
_child = context.Spawn(_childProps);
66+
break;
67+
default:
68+
if (_child != null)
69+
{
70+
context.Forward(_child);
71+
}
72+
break;
73+
}
74+
75+
return Task.CompletedTask;
76+
}
77+
}
78+
79+
private class ChildActor : IActor
80+
{
81+
public Task ReceiveAsync(IContext context)
82+
{
83+
if (context.Message is string)
84+
{
85+
throw Exception;
86+
}
87+
88+
return Task.CompletedTask;
89+
}
90+
}
91+
}

tests/Proto.Actor.Tests/SupervisionTests_OneForOne.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public async Task OneForOneStrategy_Should_ResumeChildOnFailure()
3030

3131
context.Send(parent, "hello");
3232

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

5656
context.Send(parent, "hello");
5757

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

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

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

8080
context.Send(parent, "hello");
8181

82-
childMailboxStats.Reset.Wait(2000);
82+
Assert.True(childMailboxStats.Reset.Wait(TimeSpan.FromSeconds(2)));
8383
Assert.Contains(childMailboxStats.Posted, msg => msg is Restart);
8484
Assert.Contains(childMailboxStats.Received, msg => msg is Restart);
8585
}

0 commit comments

Comments
 (0)