public void ClearAllHits() { Func <string> keyGenerator = () => { return("ClearAllHits" + GetRandomKey()); }; var keys = new List <string>(); var random = new Random((int)DateTime.Now.Ticks); var startTime = DateTime.Now; Parallel.For(0, 10, hit => { var key = keyGenerator(); keys.Add(key); var hits = 1 + random.Next(Hacker.Config.MaxHitsPerKey - 1); for (var i = 0; i < hits; i++) { Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(key, GetRandomIP()).Run(), "Request must be allowed for a hit on a key"); } Assert.AreEqual(hits, Hacker.GetHitsForKey(key).Run(), "Number of hits must be " + hits + " for key: " + key); }); Hacker.ClearAllHitsAsync().Run(); foreach (var key in keys) { Assert.AreEqual(0, Hacker.GetHitsForKey(key).Run(), "After clearing hits Number of hits must be 0 for key: " + key); } }
public void TestMaxHitsOnKeyPerOrigin() { Hacker.Config.MaxHitsPerKey = 20; Hacker.Config.MaxHitsPerOrigin = 20; Hacker.Config.MaxHitsPerKeyPerOrigin = 10; Func <string> keyGenerator = () => { return("TestMaxHitsOnKeyPerOrigin" + GetRandomKey()); }; var key = keyGenerator(); var ip = GetRandomIP(); var startTime = DateTime.Now; Parallel.For(0, Hacker.Config.MaxHitsPerKeyPerOrigin, hit => { Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(key, ip).Run(), "Allow hits on same key and IP"); }); Assert.AreEqual( Hacker.Config.MaxHitsPerKeyPerOrigin, Hacker.GetHitsForKey(key).Run(), "Number of hits recorded must match"); // No more requests from same key and IP Assert.AreEqual( Hacker.Result.TooManyHitsOnKeyFromOrigin, Hacker.DefendAsync(key, ip).Run()); Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(keyGenerator(), ip).Run(), "From different key, same IP, allow"); Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(key, GetRandomIP()).Run(), "From different IP, same key, allow"); WaitForIntervalToElapse(Hacker.Config.MaxHitsPerOriginInterval, startTime); Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(key, ip).Run(), "Allow hits on same key and IP after expiration"); }
public void TestMaxHitsPerKey() { Hacker.Config.MaxHitsPerKey = 10; Hacker.Config.MaxHitsPerOrigin = 20; Hacker.Config.MaxHitsPerKeyPerOrigin = 20; Func <string> keyGenerator = () => { return("TestMaxHitsPerKey" + GetRandomKey()); }; var fixedKey = keyGenerator(); var startTime = DateTime.Now; Parallel.For(0, Hacker.Config.MaxHitsPerKey, hit => { Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(fixedKey, GetRandomIP()).Run()); }); Assert.AreEqual( Hacker.Config.MaxHitsPerKey, Hacker.GetHitsForKey(fixedKey).Run(), "Number of hits recorded must match"); Assert.AreEqual( Hacker.Result.TooManyHitsOnKey, Hacker.DefendAsync(fixedKey, GetRandomIP()).Run()); var ip = GetRandomIP(); Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(keyGenerator(), ip).Run(), "Allow traffic from aonther key on same IP"); WaitForIntervalToElapse(Hacker.Config.MaxHitsPerKeyInterval, startTime); // Hit from another IP using same key should be allowed Assert.AreEqual( Hacker.Result.Allowed, Hacker.DefendAsync(fixedKey, GetRandomIP()).Run(), "After expiration time, key must be unblocked"); }