public void A_supervisor_hierarchy_must_Restart_Manager_And_Workers_In_AllForOne()
{
var countDown = new CountdownEvent(4);
SupervisorStrategy strategy = new OneForOneStrategy(_ => Directive.Restart);
var boss = ActorOf(Props.Create(() => new Supervisor(strategy)), "boss");
Func<Exception, Directive> decider = _ => { return Directive.Escalate; };
var managerProps = new PropsWithName(Props.Create(() => new CountDownActor(countDown, new AllForOneStrategy(decider))), "manager");
var manager = boss.Ask<IActorRef>(managerProps, TestKitSettings.DefaultTimeout).Result;
var workerProps = Props.Create(() => new CountDownActor(countDown, SupervisorStrategy.DefaultStrategy));
var worker1 = manager.Ask<IActorRef>(new PropsWithName(workerProps, "worker1"), TestKitSettings.DefaultTimeout).Result;
var worker2 = manager.Ask<IActorRef>(new PropsWithName(workerProps, "worker2"), TestKitSettings.DefaultTimeout).Result;
var worker3 = manager.Ask<IActorRef>(new PropsWithName(workerProps, "worker3"), TestKitSettings.DefaultTimeout).Result;
EventFilter.Exception<ActorKilledException>().ExpectOne(() =>
{
worker1.Tell(Kill.Instance);
// manager + all workers should be restarted by only killing a worker
// manager doesn't trap exits, so boss will restart manager
countDown.Wait(TimeSpan.FromSeconds(5)).ShouldBe(true);
});
}