public void TestMaxHitsPerOrigin() { Hacker.Config.MaxHitsPerKey = 20; Hacker.Config.MaxHitsPerOrigin = 10; Hacker.Config.MaxHitsPerKeyPerOrigin = 20; var ip = GetRandomIP(); Func <string> keyGenerator = () => { return("TestMaxHitsPerOrigin" + GetRandomKey()); }; var startTime = DateTime.Now; var result = Parallel.For(0, Hacker.Config.MaxHitsPerOrigin, hit => { Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(keyGenerator(), ip).Run() ); }); while (!result.IsCompleted) { Thread.Sleep(100); } Assert.AreEqual( Hacker.Config.MaxHitsPerOrigin, Hacker.GetHitsFromOrigin(ip).Run(), "Number of hits recorded must match"); // No more requests from same IP Assert.AreEqual( Hacker.Result.TooManyHitsFromOrigin, Hacker.DefendAsync(keyGenerator(), ip).Run() ); // Allow requests from other IPs Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(keyGenerator(), GetRandomIP()).Run()); WaitForIntervalToElapse(Hacker.Config.MaxHitsPerOriginInterval, startTime); Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(keyGenerator(), ip).Run(), "Allow hits from same origin after expiration time." ); }