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);
        }
Example #4
0
        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);
        }