Example #1
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();
        }
Example #2
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);
    }
Example #3
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);
    }
Example #4
0
 public void NotOkayAlwaysReturnsMaxValueDelay()
 {
     // arrange 
     var clock = new FakeSystemClock();
     var reservation = new Reservation(
         clock: clock,
         limiter: default,
Example #5
0
        public async Task ZeroDelayAddsInline()
        {
            // arrange
            var state = "setup";
            var added = new List <(string state, string item)>();
            var fake  = new FakeQueue <string>
            {
                OnAdd = item => added.Add((state, item)),
            };
            var clock = new FakeSystemClock();
            IDelayingQueue <string> delayingQueue = new DelayingQueue <string>(clock, fake);

            // act
            state = "before-one";
            delayingQueue.AddAfter("one", TimeSpan.FromMilliseconds(1));
            state = "after-one";
            await Task.Delay(TimeSpan.FromMilliseconds(40));

            state = "before-two";
            delayingQueue.AddAfter("two", TimeSpan.FromMilliseconds(0));
            state = "after-two";
            await Task.Delay(TimeSpan.FromMilliseconds(40));

            state = "before-three";
            delayingQueue.AddAfter("three", TimeSpan.FromMilliseconds(1));
            state = "after-three";
            await Task.Delay(TimeSpan.FromMilliseconds(40));

            // assert
            added.ShouldHaveSingleItem().ShouldBe(("before-two", "two"));
        }
Example #6
0
    public void FirstTokenIsAvailable()
    {
        var clock   = new FakeSystemClock();
        var limiter = new Limiter(new Limit(10), 1, clock);

        var allowed = limiter.Allow();

        Assert.True(allowed);
    }
Example #7
0
        public void FirstTokenIsAvailable()
        {
            // arrange
            var clock   = new FakeSystemClock();
            var limiter = new Limiter(new Limit(10), 1, clock);

            // act
            var allowed = limiter.Allow();

            // assert
            allowed.ShouldBe(true);
        }
Example #8
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);
        }
Example #9
0
    public void AsManyAsBurstTokensAreAvailableRightAway(int burst)
    {
        var clock   = new FakeSystemClock();
        var limiter = new Limiter(new Limit(10), burst, clock);

        var allowed = new List <bool>();

        foreach (var index in Enumerable.Range(1, burst))
        {
            allowed.Add(limiter.Allow());
        }
        var notAllowed = limiter.Allow();

        Assert.All(allowed, item => Assert.True(item));
        Assert.False(notAllowed);
    }
Example #10
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);
    }
Example #11
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);
    }
Example #12
0
        public void AsManyAsBurstTokensAreAvailableRightAway(int burst)
        {
            // arrange
            var clock   = new FakeSystemClock();
            var limiter = new Limiter(new Limit(10), burst, clock);

            // act
            var allowed = new List <bool>();

            foreach (var index in Enumerable.Range(1, burst))
            {
                allowed.Add(limiter.Allow());
            }
            var notAllowed = limiter.Allow();

            // assert
            allowed.ShouldAllBe(item => item == true);
            notAllowed.ShouldBeFalse();
        }
Example #13
0
    public void DelayingQueuePassesCallsThrough()
    {
        var added = new List <string>();
        var doned = new List <string>();
        var fake  = new FakeQueue <string>
        {
            OnAdd  = added.Add,
            OnDone = doned.Add,
            OnLen  = () => 42,
        };
        var clock = new FakeSystemClock();
        IDelayingQueue <string> delayingQueue = new DelayingQueue <string>(clock, fake);

        delayingQueue.Add("one");
        delayingQueue.Done("two");
        var len = delayingQueue.Len();

        Assert.Equal("one", Assert.Single(added));
        Assert.Equal("two", Assert.Single(doned));
        Assert.Equal(42, len);
    }
Example #14
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));
        }
Example #15
0
        public void DelayingQueuePassesCallsThrough()
        {
            // arrange
            var added = new List <string>();
            var doned = new List <string>();
            var fake  = new FakeQueue <string>
            {
                OnAdd  = added.Add,
                OnDone = doned.Add,
                OnLen  = () => 42,
            };
            var clock = new FakeSystemClock();
            IDelayingQueue <string> delayingQueue = new DelayingQueue <string>(clock, fake);

            // act
            delayingQueue.Add("one");
            delayingQueue.Done("two");
            var len = delayingQueue.Len();

            // assert
            added.ShouldHaveSingleItem().ShouldBe("one");
            doned.ShouldHaveSingleItem().ShouldBe("two");
            len.ShouldBe(42);
        }
Example #16
0
        public void SimpleAutoSyncTrackingCancelledCycle()
        {
            // arrange identifiers
            var scopeId    = Guid.NewGuid();
            var scopeName  = Guid.NewGuid().ToString();
            var trackingId = Guid.NewGuid();

            // arrange a stopwatch that tracks a known interval
            var elapsed = TimeSpan.FromSeconds(123);
            var watch   = new FakeTrackerStopwatch
            {
                TargetElapsed = elapsed
            };
            var factory = Mock.Of <ITrackerStopwatchFactory>(x => x.Create() == watch);

            // arrange a test sink
            var sink = new FakeSink();

            // arrange a system clock
            var now   = DateTimeOffset.Now;
            var clock = new FakeSystemClock {
                Now = now
            };

            // act - build host
            using (var host = Host
                              .CreateDefaultBuilder()
                              .UseChronoscope(chrono =>
            {
                chrono.ConfigureServices(services =>
                {
                    services.AddSingleton(factory);
                    services.AddSingleton <ITrackingSink>(sink);
                    services.AddSingleton <ISystemClock>(clock);
                });
            })
                              .Build())
            {
                // act - request services
                var chrono  = host.Services.GetRequiredService <IChronoscope>();
                var scope   = chrono.CreateScope(scopeId, scopeName);
                var tracker = scope.CreateAutoTracker(trackingId);

                // assert - elapsed is zero
                Assert.Equal(TimeSpan.Zero, tracker.Elapsed);

                // act - do tracking
                int result = -1;
                try
                {
                    var token = new CancellationToken(true);
                    result = tracker.Track((scope, token) =>
                    {
                        token.ThrowIfCancellationRequested();
                        return(1);
                    }, token);
                }
                catch (OperationCanceledException)
                {
                    /* noop */
                }

                // assert - the result is correct
                Assert.Equal(-1, result);

                // assert - elapsed time is correct
                Assert.Equal(elapsed, tracker.Elapsed);

                // assert - events were generated
                Assert.Collection(sink.Events,
                                  e =>
                {
                    var x = Assert.IsAssignableFrom <IScopeCreatedEvent>(e);
                    Assert.Equal(scopeId, x.ScopeId);
                    Assert.Equal(scopeName, x.Name);
                    Assert.Null(x.ParentScopeId);
                    Assert.Equal(now, x.Timestamp);
                },
                                  e =>
                {
                    var x = Assert.IsAssignableFrom <ITrackerCreatedEvent>(e);
                    Assert.Equal(scopeId, x.ScopeId);
                    Assert.Equal(trackingId, x.TrackerId);
                    Assert.Equal(now, x.Timestamp);
                    Assert.Equal(TimeSpan.Zero, x.Elapsed);
                },
                                  e =>
                {
                    var x = Assert.IsAssignableFrom <ITrackerStartedEvent>(e);
                    Assert.Equal(scopeId, x.ScopeId);
                    Assert.Equal(trackingId, x.TrackerId);
                    Assert.Equal(now, x.Timestamp);
                    Assert.Equal(TimeSpan.Zero, x.Elapsed);
                },
                                  e =>
                {
                    var x = Assert.IsAssignableFrom <ITrackerStoppedEvent>(e);
                    Assert.Equal(scopeId, x.ScopeId);
                    Assert.Equal(trackingId, x.TrackerId);
                    Assert.Equal(now, x.Timestamp);
                    Assert.Equal(elapsed, x.Elapsed);
                },
                                  e =>
                {
                    var x = Assert.IsAssignableFrom <ITrackerCancelledEvent>(e);
                    Assert.Equal(scopeId, x.ScopeId);
                    Assert.Equal(trackingId, x.TrackerId);
                    Assert.Equal(now, x.Timestamp);
                    Assert.Equal(elapsed, x.Elapsed);
                    Assert.IsAssignableFrom <OperationCanceledException>(x.Exception);
                });
            }
        }
 private static FakeClaimsAuthenticationService2 Authentication(
     FakeHttpContextAccessor httpContextAccessor = null,
     FakeUserStore userStore = null, ClaimOptions options = null,
     FakeSystemClock clock   = null) =>
 new FakeClaimsAuthenticationService2(httpContextAccessor ?? HttpContextAccessor(),
                                      userStore ?? UserStore(), options ?? Options(), clock ?? Clock());
Example #18
0
 private static UserClaimsConverter <User> Converter(ClaimOptions options  = null,
                                                     FakeSystemClock clock = null) =>
 new UserClaimsConverter <User>(options ?? Options(), clock ?? Clock());
 private static FakeClaimsAuthenticationServiceBase Authentication(
     FakeUserStore userStore = null, ClaimOptions options = null,
     FakeSystemClock clock   = null) =>
 new FakeClaimsAuthenticationServiceBase(userStore ?? UserStore(),
                                         options ?? Options(), clock ?? Clock());
 private static ClaimsPrincipal Principal(bool hasUserKey       = true,
                                          bool hasSecurityStamp = true, bool hasSecurityStampValidated = true,
                                          FakeSystemClock clock = null) =>
 FakeClaimsAuthenticationServiceBase.Principal(hasUserKey, hasSecurityStamp,
                                               hasSecurityStampValidated, clock);