public async Task If_triggers_critical_action_after_10_failures()
    {
        var criticalActionTriggered = false;
        var timer   = new FakeTimer();
        var cleaner = new TestableCleaner((time, token) => Task.FromResult(0),
                                          (m, e) => criticalActionTriggered = true, TimeSpan.FromDays(7), TimeSpan.Zero, timer);

        await cleaner.Start().ConfigureAwait(false);

        for (var i = 0; i < 9; i++)
        {
            timer.OnError(new Exception("Simulated!"));
        }

        Assert.IsFalse(criticalActionTriggered);

        //Trigger the 10th time
        timer.OnError(new Exception("Simulated!"));
        Assert.IsTrue(criticalActionTriggered);
        criticalActionTriggered = false;

        //Trigger again -- the counter should be reset
        timer.OnError(new Exception("Simulated!"));
        Assert.IsFalse(criticalActionTriggered);
    }
    public async Task It_uses_correct_cut_off_time()
    {
        var timer      = new FakeTimer();
        var cutOffTime = DateTime.MinValue;
        var cleaner    = new TestableCleaner((time, token) =>
        {
            cutOffTime = time;
            return(Task.FromResult(0));
        }, (m, e) => { }, TimeSpan.FromDays(7), TimeSpan.Zero, timer);

        await cleaner.Start().ConfigureAwait(false);

        var now = new DateTime(2017, 3, 31, 0, 0, 0);
        await timer.Tick(now, CancellationToken.None).ConfigureAwait(false);

        var expected = new DateTime(2017, 3, 24, 0, 0, 0);

        Assert.AreEqual(expected, cutOffTime);
    }
    public async Task It_resets_the_failure_counter_after_successful_attempt()
    {
        var criticalActionTriggered = false;
        var timer   = new FakeTimer();
        var cleaner = new TestableCleaner((time, token) => Task.FromResult(0),
                                          (m, e) => criticalActionTriggered = true, TimeSpan.FromDays(7), TimeSpan.Zero, timer);

        await cleaner.Start().ConfigureAwait(false);

        for (var i = 0; i < 100; i++)
        {
            if (i % 9 == 0) //Succeed every 9th attempt
            {
                await timer.Tick(DateTime.UtcNow, CancellationToken.None).ConfigureAwait(false);
            }
            else
            {
                timer.OnError(new Exception("Simulated!"));
            }
        }

        Assert.IsFalse(criticalActionTriggered);
    }