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'));
+  }
+
+}