TrafficLimiterTest.php 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <?php
  2. use PrivateBin\Data\Filesystem;
  3. use PrivateBin\Persistence\ServerSalt;
  4. use PrivateBin\Persistence\TrafficLimiter;
  5. class TrafficLimiterTest extends PHPUnit_Framework_TestCase
  6. {
  7. private $_path;
  8. public function setUp()
  9. {
  10. /* Setup Routine */
  11. $this->_path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'trafficlimit';
  12. $store = Filesystem::getInstance(array('dir' => $this->_path));
  13. ServerSalt::setStore($store);
  14. TrafficLimiter::setStore($store);
  15. }
  16. public function tearDown()
  17. {
  18. /* Tear Down Routine */
  19. Helper::rmDir($this->_path . DIRECTORY_SEPARATOR);
  20. }
  21. public function testHtaccess()
  22. {
  23. $htaccess = $this->_path . DIRECTORY_SEPARATOR . '.htaccess';
  24. @unlink($htaccess);
  25. $_SERVER['REMOTE_ADDR'] = 'foobar';
  26. TrafficLimiter::canPass();
  27. $this->assertFileExists($htaccess, 'htaccess recreated');
  28. }
  29. public function testTrafficGetsLimited()
  30. {
  31. TrafficLimiter::setLimit(4);
  32. $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
  33. $this->assertTrue(TrafficLimiter::canPass(), 'first request may pass');
  34. sleep(1);
  35. $this->assertFalse(TrafficLimiter::canPass(), 'second request is to fast, may not pass');
  36. sleep(4);
  37. $this->assertTrue(TrafficLimiter::canPass(), 'third request waited long enough and may pass');
  38. $_SERVER['REMOTE_ADDR'] = '2001:1620:2057:dead:beef::cafe:babe';
  39. $this->assertTrue(TrafficLimiter::canPass(), 'fourth request has different ip and may pass');
  40. $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
  41. $this->assertFalse(TrafficLimiter::canPass(), 'fifth request is to fast, may not pass');
  42. // exempted IPs configuration
  43. TrafficLimiter::setExemptedIp('1.2.3.4,10.10.10.0/24,2001:1620:2057::/48');
  44. $this->assertFalse(TrafficLimiter::canPass(), 'still too fast and not exempted');
  45. $_SERVER['REMOTE_ADDR'] = '10.10.10.10';
  46. $this->assertTrue(TrafficLimiter::canPass(), 'IPv4 in exempted range');
  47. $this->assertTrue(TrafficLimiter::canPass(), 'request is to fast, but IPv4 in exempted range');
  48. $_SERVER['REMOTE_ADDR'] = '2001:1620:2057:dead:beef::cafe:babe';
  49. $this->assertTrue(TrafficLimiter::canPass(), 'IPv6 in exempted range');
  50. $this->assertTrue(TrafficLimiter::canPass(), 'request is to fast, but IPv6 in exempted range');
  51. TrafficLimiter::setExemptedIp('127.*,foobar');
  52. $this->assertFalse(TrafficLimiter::canPass(), 'request is to fast, invalid range');
  53. $_SERVER['REMOTE_ADDR'] = 'foobar';
  54. $this->assertTrue(TrafficLimiter::canPass(), 'non-IP address');
  55. $this->assertTrue(TrafficLimiter::canPass(), 'request is to fast, but non-IP address matches exempted range');
  56. }
  57. }