public void DefaultResizer_must_grow_as_needed_under_pressure()
{
var resizer = new DefaultResizer(3, 5, pressureThreshold: 1, rampupRate: 0.1d, backoffRate: 0.0d,
messagesPerResize: 1, backoffThreshold: 0.0d);
var router = Sys.ActorOf(Props.Create<PressureActor>().WithRouter(new RoundRobinPool(0, resizer)));
//first message should create the minimum number of routees
router.Tell("echo", TestActor);
ExpectMsg("reply");
(RouteeSize(router)).ShouldBe(resizer.LowerBound);
Action<int, TimeSpan, int?> loopTillAppropriateSize = (loops, span, expectedBound) =>
{
for (var i = 0; i < loops; i++)
{
router.Tell(span, TestActor);
if (expectedBound.HasValue && RouteeSize(router) >= expectedBound.Value)
{
return;
}
//sending too quickly will result in skipped resize due to many resizeInProgress conflicts
Thread.Sleep(TimeSpan.FromMilliseconds(20));
}
};
// 2 more should go through without triggering more
loopTillAppropriateSize(2, TimeSpan.FromMilliseconds(200), null);
RouteeSize(router).ShouldBe(resizer.LowerBound);
// a whole bunch should max it out
loopTillAppropriateSize(200, TimeSpan.FromMilliseconds(500), resizer.UpperBound);
RouteeSize(router).ShouldBe(resizer.UpperBound);
}