public void AllForOneStrategy_Should_EscalateFailureToParent() { var parentMailboxStats = new TestMailboxStatistics(msg => msg is Stopped); var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Escalate, 1, null); var childProps = Props.FromProducer(() => new ChildActor()); var parentProps = Props.FromProducer(() => new ParentActor(childProps, childProps)) .WithChildSupervisorStrategy(strategy) .WithMailbox(() => UnboundedMailbox.Create(parentMailboxStats)); var parent = Context.Spawn(parentProps); Context.Send(parent, "hello"); parentMailboxStats.Reset.Wait(1000); var failure = parentMailboxStats.Received.OfType <Failure>().Single(); Assert.IsType <Exception>(failure.Reason); }
public void OneForOneStrategy_WhenRestartedMoreThanMaximumAllowedRetriesWithinSpecifiedTimePeriod_ShouldStopChild() { var childMailboxStats = new TestMailboxStatistics(msg => msg is Stopped); var strategy = new OneForOneStrategy((pid, reason) => SupervisorDirective.Restart, 3, TimeSpan.FromMilliseconds(100)); var childProps = Props.FromProducer(() => new ChildActor()) .WithMailbox(() => UnboundedMailbox.Create(childMailboxStats)); var parentProps = Props.FromProducer(() => new ParentActor(childProps)) .WithChildSupervisorStrategy(strategy); var parent = Context.Spawn(parentProps); Context.Send(parent, "1st restart"); Context.Send(parent, "2nd restart"); Context.Send(parent, "3rd restart"); Context.Send(parent, "4th restart"); childMailboxStats.Reset.Wait(1000); Assert.Contains(Stop.Instance, childMailboxStats.Posted); Assert.Contains(Stop.Instance, childMailboxStats.Received); }
public void AllForOneStrategy_Should_ResumeChildOnFailure() { var child1MailboxStats = new TestMailboxStatistics(msg => msg is ResumeMailbox); var child2MailboxStats = new TestMailboxStatistics(msg => msg is ResumeMailbox); var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Resume, 1, null); var child1Props = Actor.FromProducer(() => new ChildActor()) .WithMailbox(() => UnboundedMailbox.Create(child1MailboxStats)); var child2Props = Actor.FromProducer(() => new ChildActor()) .WithMailbox(() => UnboundedMailbox.Create(child2MailboxStats)); var parentProps = Actor.FromProducer(() => new ParentActor(child1Props, child2Props)) .WithChildSupervisorStrategy(strategy); var parent = Actor.Spawn(parentProps); parent.Tell("hello"); child1MailboxStats.Reset.Wait(1000); Assert.Contains(ResumeMailbox.Instance, child1MailboxStats.Posted); Assert.Contains(ResumeMailbox.Instance, child1MailboxStats.Received); Assert.DoesNotContain(ResumeMailbox.Instance, child2MailboxStats.Posted); Assert.DoesNotContain(ResumeMailbox.Instance, child2MailboxStats.Received); }
public void WhenActorWithChildrenStopped_DisposeIsCalledInEachChild() { bool child1Disposed = false; bool child2Disposed = false; var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped); var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped); var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Stop, 1, null); var child1Props = Actor.FromProducer(() => new DisposableActor(() => child1Disposed = true)) .WithMailbox(() => UnboundedMailbox.Create(child1MailboxStats)); var child2Props = Actor.FromProducer(() => new DisposableActor(() => child2Disposed = true)) .WithMailbox(() => UnboundedMailbox.Create(child2MailboxStats)); var parentProps = Actor.FromProducer(() => new ParentWithMultipleChildrenActor(child1Props, child2Props)) .WithChildSupervisorStrategy(strategy); var parent = Actor.Spawn(parentProps); parent.Tell("crash"); child1MailboxStats.Reset.Wait(1000); child2MailboxStats.Reset.Wait(1000); Assert.True(child1Disposed); Assert.True(child2Disposed); }
public void AllForOneStrategy_Should_PassExceptionOnRestart() { var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped); var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped); var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Restart, 1, null); var child1Props = Actor.FromProducer(() => new ChildActor()) .WithMailbox(() => UnboundedMailbox.Create(child1MailboxStats)); var child2Props = Actor.FromProducer(() => new ChildActor()) .WithMailbox(() => UnboundedMailbox.Create(child2MailboxStats)); var parentProps = Actor.FromProducer(() => new ParentActor(child1Props, child2Props)) .WithChildSupervisorStrategy(strategy); var parent = Actor.Spawn(parentProps); parent.Tell("hello"); child1MailboxStats.Reset.Wait(1000); child2MailboxStats.Reset.Wait(1000); 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); Assert.Contains(child2MailboxStats.Received, msg => (msg is Restart r) && r.Reason == Exception); }
public void AllForOneStrategy_Should_StopAllChildrenOnFailure() { var child1MailboxStats = new TestMailboxStatistics(msg => msg is Stopped); var child2MailboxStats = new TestMailboxStatistics(msg => msg is Stopped); var strategy = new AllForOneStrategy((pid, reason) => SupervisorDirective.Stop, 1, null); var child1Props = Props.FromProducer(() => new ChildActor()) .WithMailbox(() => UnboundedMailbox.Create(child1MailboxStats)); var child2Props = Props.FromProducer(() => new ChildActor()) .WithMailbox(() => UnboundedMailbox.Create(child2MailboxStats)); var parentProps = Props.FromProducer(() => new ParentActor(child1Props, child2Props)) .WithChildSupervisorStrategy(strategy); var parent = Context.Spawn(parentProps); Context.Send(parent, "hello"); child1MailboxStats.Reset.Wait(1000); child2MailboxStats.Reset.Wait(1000); Assert.Contains(Stop.Instance, child1MailboxStats.Posted); Assert.Contains(Stop.Instance, child1MailboxStats.Received); Assert.Contains(Stop.Instance, child2MailboxStats.Posted); Assert.Contains(Stop.Instance, child2MailboxStats.Received); }