diff --git a/core/modules/system/tests/src/Kernel/System/FloodTest.php b/core/modules/system/tests/src/Kernel/System/FloodTest.php index 913acabec4295d214addae95cbdd3a79fc38929f..3b682a8cd755eae154b86fafce814dcbf3dc0a62 100644 --- a/core/modules/system/tests/src/Kernel/System/FloodTest.php +++ b/core/modules/system/tests/src/Kernel/System/FloodTest.php @@ -46,46 +46,6 @@ public function testCleanUp() { $this->assertFalse($flood->isAllowed($name, $threshold)); } - /** - * Tests flood control memory backend. - */ - public function testMemoryBackend() { - $threshold = 1; - $window_expired = -1; - $name = 'flood_test_cleanup'; - - $request_stack = \Drupal::service('request_stack'); - $flood = new MemoryBackend($request_stack); - $this->assertTrue($flood->isAllowed($name, $threshold)); - // Register expired event. - $flood->register($name, $window_expired); - // Verify event is not allowed. - $this->assertFalse($flood->isAllowed($name, $threshold)); - // Run cron and verify event is now allowed. - $flood->garbageCollection(); - $this->assertTrue($flood->isAllowed($name, $threshold)); - - // Register unexpired event. - $flood->register($name); - // Verify event is not allowed. - $this->assertFalse($flood->isAllowed($name, $threshold)); - // Run cron and verify event is still not allowed. - $flood->garbageCollection(); - $this->assertFalse($flood->isAllowed($name, $threshold)); - } - - /** - * Tests memory backend records events to the nearest microsecond. - */ - public function testMemoryBackendThreshold() { - $request_stack = \Drupal::service('request_stack'); - $flood = new MemoryBackend($request_stack); - $flood->register('new event'); - $this->assertTrue($flood->isAllowed('new event', '2')); - $flood->register('new event'); - $this->assertFalse($flood->isAllowed('new event', '2')); - } - /** * Tests flood control database backend. */ diff --git a/core/tests/Drupal/Tests/Core/Flood/MemoryBackendTest.php b/core/tests/Drupal/Tests/Core/Flood/MemoryBackendTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6be982db837b4fd004eeea7bcc3e097d895d436b --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Flood/MemoryBackendTest.php @@ -0,0 +1,106 @@ +<?php + +namespace Drupal\Tests\Core\Flood; + +use Drupal\Core\Flood\MemoryBackend; +use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Request; +use Drupal\Tests\UnitTestCase; + +/** + * Tests the memory flood implementation. + * + * @group flood + * @coversDefaultClass \Drupal\Core\Flood\MemoryBackend + */ +class MemoryBackendTest extends UnitTestCase { + + /** + * The tested memory flood backend. + * + * @var \Drupal\Core\Flood\MemoryBackend + */ + protected $flood; + + protected function setUp(): void { + $request = new RequestStack(); + $request_mock = $this->getMockBuilder(Request::class) + ->onlyMethods(['getClientIp']) + ->getMock(); + $request->push($request_mock); + $this->flood = new MemoryBackend($request); + } + + /** + * Tests an allowed flood event. + */ + public function testAllowedProceeding() { + $threshold = 2; + $window_expired = -1; + + $this->flood->register('test_event', $window_expired); + $this->assertTrue($this->flood->isAllowed('test_event', $threshold)); + } + + /** + * Tests a flood event with more than the allowed calls. + */ + public function testNotAllowedProceeding() { + $threshold = 1; + $window_expired = -1; + + // Register the event twice, so it is not allowed to proceed. + $this->flood->register('test_event', $window_expired); + $this->flood->register('test_event', $window_expired, 1); + + $this->assertFalse($this->flood->isAllowed('test_event', $threshold)); + } + + /** + * Tests a flood event with expiring, so cron will allow to proceed. + * + * @medium + */ + public function testExpiring() { + $threshold = 1; + $window_expired = -1; + + $this->flood->register('test_event', $window_expired); + usleep(2); + $this->flood->register('test_event', $window_expired); + + $this->assertFalse($this->flood->isAllowed('test_event', $threshold)); + + // "Run cron", which clears the flood data and verify event is now allowed. + $this->flood->garbageCollection(); + $this->assertTrue($this->flood->isAllowed('test_event', $threshold)); + } + + /** + * Tests a flood event with no expiring, so cron will not allow to proceed. + */ + public function testNotExpiring() { + $threshold = 2; + + $this->flood->register('test_event', 1); + usleep(3); + $this->flood->register('test_event', 1); + + $this->assertFalse($this->flood->isAllowed('test_event', $threshold)); + + // "Run cron", which clears the flood data and verify event is not allowed. + $this->flood->garbageCollection(); + $this->assertFalse($this->flood->isAllowed('test_event', $threshold)); + } + + /** + * Tests memory backend records events to the nearest microsecond. + */ + public function testMemoryBackendThreshold() { + $this->flood->register('new event'); + $this->assertTrue($this->flood->isAllowed('new event', '2')); + $this->flood->register('new event'); + $this->assertFalse($this->flood->isAllowed('new event', '2')); + } + +}