예제 #1
0
    public void TokensBecomeAvailableAtLimitPerSecondRate()
    {
        var clock   = new FakeSystemClock();
        var limiter = new Limiter(new Limit(10), 50, clock);

        var initiallyAllowed = limiter.AllowN(clock.UtcNow, 50);
        var thenNotAllowed1  = limiter.Allow();

        clock.Advance(TimeSpan.FromMilliseconds(100));
        var oneTokenAvailable = limiter.Allow();
        var thenNotAllowed2   = limiter.Allow();

        clock.Advance(TimeSpan.FromMilliseconds(200));
        var twoTokensAvailable1 = limiter.Allow();
        var twoTokensAvailable2 = limiter.Allow();
        var thenNotAllowed3     = limiter.Allow();

        Assert.True(initiallyAllowed);
        Assert.False(thenNotAllowed1);
        Assert.True(oneTokenAvailable);
        Assert.False(thenNotAllowed2);
        Assert.True(twoTokensAvailable1);
        Assert.True(twoTokensAvailable2);
        Assert.False(thenNotAllowed3);
    }
예제 #2
0
        public void TokensBecomeAvailableAtLimitPerSecondRate()
        {
            // arrange
            var clock   = new FakeSystemClock();
            var limiter = new Limiter(new Limit(10), 50, clock);

            // act
            var initiallyAllowed = limiter.AllowN(clock.UtcNow, 50);
            var thenNotAllowed1  = limiter.Allow();

            clock.Advance(TimeSpan.FromMilliseconds(100));
            var oneTokenAvailable = limiter.Allow();
            var thenNotAllowed2   = limiter.Allow();

            clock.Advance(TimeSpan.FromMilliseconds(200));
            var twoTokensAvailable1 = limiter.Allow();
            var twoTokensAvailable2 = limiter.Allow();
            var thenNotAllowed3     = limiter.Allow();

            // assert
            initiallyAllowed.ShouldBeTrue();
            thenNotAllowed1.ShouldBeFalse();
            oneTokenAvailable.ShouldBeTrue();
            thenNotAllowed2.ShouldBeFalse();
            twoTokensAvailable1.ShouldBeTrue();
            twoTokensAvailable2.ShouldBeTrue();
            thenNotAllowed3.ShouldBeFalse();
        }
예제 #3
0
        public async Task DelayingQueueAddsWhenTimePasses()
        {
            // arrange
            var added = new List <string>();
            var fake  = new FakeQueue <string>
            {
                OnAdd = added.Add,
            };
            var clock = new FakeSystemClock();
            IDelayingQueue <string> delayingQueue = new DelayingQueue <string>(clock, fake);

            // act
            delayingQueue.AddAfter("50ms", TimeSpan.FromMilliseconds(50));
            delayingQueue.AddAfter("100ms", TimeSpan.FromMilliseconds(100));
            clock.Advance(TimeSpan.FromMilliseconds(25));
            delayingQueue.AddAfter("75ms", TimeSpan.FromMilliseconds(50));
            delayingQueue.AddAfter("125ms", TimeSpan.FromMilliseconds(100));

            await Task.Delay(TimeSpan.FromMilliseconds(40));

            var countAfter25ms = added.Count;

            clock.Advance(TimeSpan.FromMilliseconds(30));
            await Task.Delay(TimeSpan.FromMilliseconds(40));

            var countAfter55ms = added.Count;

            clock.Advance(TimeSpan.FromMilliseconds(25));
            await Task.Delay(TimeSpan.FromMilliseconds(40));

            var countAfter80ms = added.Count;

            clock.Advance(TimeSpan.FromMilliseconds(25));
            await Task.Delay(TimeSpan.FromMilliseconds(40));

            var countAfter105ms = added.Count;

            clock.Advance(TimeSpan.FromMilliseconds(25));
            await Task.Delay(TimeSpan.FromMilliseconds(40));

            var countAfter135ms = added.Count;

            // assert
            countAfter25ms.ShouldBe(0);
            countAfter55ms.ShouldBe(1);
            countAfter80ms.ShouldBe(2);
            countAfter105ms.ShouldBe(3);
            countAfter135ms.ShouldBe(4);
            added.ShouldBe(new[] { "50ms", "75ms", "100ms", "125ms" }, ignoreOrder: false);
        }
예제 #4
0
    public void ReserveTellsYouHowLongToWait()
    {
        var clock   = new FakeSystemClock();
        var limiter = new Limiter(new Limit(10), 50, clock);

        var initiallyAllowed = limiter.AllowN(clock.UtcNow, 50);
        var thenNotAllowed1  = limiter.Allow();

        var reserveOne = limiter.Reserve();
        var delayOne   = reserveOne.Delay();

        var reserveTwoMore = limiter.Reserve(clock.UtcNow, 2);
        var delayTwoMore   = reserveTwoMore.Delay();

        clock.Advance(TimeSpan.FromMilliseconds(450));

        var reserveAlreadyAvailable = limiter.Reserve();
        var delayAlreadyAvailable   = reserveAlreadyAvailable.Delay();

        var reserveHalfAvailable = limiter.Reserve();
        var delayHalfAvailable   = reserveHalfAvailable.Delay();

        Assert.True(initiallyAllowed);
        Assert.False(thenNotAllowed1);
        Assert.True(reserveOne.Ok);
        Assert.Equal(TimeSpan.FromMilliseconds(100), delayOne);
        Assert.True(reserveTwoMore.Ok);
        Assert.Equal(TimeSpan.FromMilliseconds(300), delayTwoMore);
        Assert.True(reserveAlreadyAvailable.Ok);
        Assert.Equal(TimeSpan.Zero, delayAlreadyAvailable);
        Assert.True(reserveHalfAvailable.Ok);
        Assert.Equal(TimeSpan.FromMilliseconds(50), delayHalfAvailable);
    }
예제 #5
0
    public async Task DelayingQueueAddsWhenTimePasses()
    {
        var added = new List <string>();
        var fake  = new FakeQueue <string>
        {
            OnAdd = added.Add,
        };
        var clock = new FakeSystemClock();
        IDelayingQueue <string> delayingQueue = new DelayingQueue <string>(clock, fake);

        delayingQueue.AddAfter("50ms", TimeSpan.FromMilliseconds(50));
        delayingQueue.AddAfter("100ms", TimeSpan.FromMilliseconds(100));
        clock.Advance(TimeSpan.FromMilliseconds(25));
        delayingQueue.AddAfter("75ms", TimeSpan.FromMilliseconds(50));
        delayingQueue.AddAfter("125ms", TimeSpan.FromMilliseconds(100));

        await Task.Delay(TimeSpan.FromMilliseconds(40));

        var countAfter25ms = added.Count;

        clock.Advance(TimeSpan.FromMilliseconds(30));
        await Task.Delay(TimeSpan.FromMilliseconds(40));

        var countAfter55ms = added.Count;

        clock.Advance(TimeSpan.FromMilliseconds(25));
        await Task.Delay(TimeSpan.FromMilliseconds(40));

        var countAfter80ms = added.Count;

        clock.Advance(TimeSpan.FromMilliseconds(25));
        await Task.Delay(TimeSpan.FromMilliseconds(40));

        var countAfter105ms = added.Count;

        clock.Advance(TimeSpan.FromMilliseconds(25));
        await Task.Delay(TimeSpan.FromMilliseconds(40));

        var countAfter135ms = added.Count;

        Assert.Equal(0, countAfter25ms);
        Assert.Equal(1, countAfter55ms);
        Assert.Equal(2, countAfter80ms);
        Assert.Equal(3, countAfter105ms);
        Assert.Equal(4, countAfter135ms);
        Assert.Equal(new[] { "50ms", "75ms", "100ms", "125ms" }, added);
    }
예제 #6
0
    public async Task NoAddingAfterShutdown()
    {
        var added = new List <string>();
        var fake  = new FakeQueue <string>
        {
            OnAdd = added.Add,
        };
        var clock = new FakeSystemClock();
        IDelayingQueue <string> delayingQueue = new DelayingQueue <string>(clock, fake);

        delayingQueue.AddAfter("one", TimeSpan.FromMilliseconds(10));
        delayingQueue.ShutDown();
        delayingQueue.AddAfter("two", TimeSpan.FromMilliseconds(10));
        clock.Advance(TimeSpan.FromMilliseconds(25));
        await Task.Delay(TimeSpan.FromMilliseconds(40));

        Assert.Empty(added);
    }
예제 #7
0
        public void ReserveTellsYouHowLongToWait()
        {
            // arrange
            var clock   = new FakeSystemClock();
            var limiter = new Limiter(new Limit(10), 50, clock);

            // act
            var initiallyAllowed = limiter.AllowN(clock.UtcNow, 50);
            var thenNotAllowed1  = limiter.Allow();

            var reserveOne = limiter.Reserve();
            var delayOne   = reserveOne.Delay();

            var reserveTwoMore = limiter.Reserve(clock.UtcNow, 2);
            var delayTwoMore   = reserveTwoMore.Delay();

            clock.Advance(TimeSpan.FromMilliseconds(450));

            var reserveAlreadyAvailable = limiter.Reserve();
            var delayAlreadyAvailable   = reserveAlreadyAvailable.Delay();

            var reserveHalfAvailable = limiter.Reserve();
            var delayHalfAvailable   = reserveHalfAvailable.Delay();

            // assert
            initiallyAllowed.ShouldBeTrue();
            thenNotAllowed1.ShouldBeFalse();
            reserveOne.Ok.ShouldBeTrue();
            delayOne.ShouldBe(TimeSpan.FromMilliseconds(100));
            reserveTwoMore.Ok.ShouldBeTrue();
            delayTwoMore.ShouldBe(TimeSpan.FromMilliseconds(300));
            reserveAlreadyAvailable.Ok.ShouldBeTrue();
            delayAlreadyAvailable.ShouldBe(TimeSpan.Zero);
            reserveHalfAvailable.Ok.ShouldBeTrue();
            delayHalfAvailable.ShouldBe(TimeSpan.FromMilliseconds(50));
        }