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); }
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(); }
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); }
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); }
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); }
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); }
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)); }