From fd1bcbe5aa7e220943b00744a50c5f7e1876e630 Mon Sep 17 00:00:00 2001
From: nod_ <nod_@598310.no-reply.drupal.org>
Date: Thu, 25 Jul 2024 21:55:11 +0200
Subject: [PATCH] Issue #3463351 by catch, heddn: Consolidate Umami performance
 tests

(cherry picked from commit 27fcad90d9a14053ddd16a917a8e0e1cd32cf8f7)
---
 .../OpenTelemetryFrontPagePerformanceTest.php | 27 ++++++++--
 .../OpenTelemetryNodePagePerformanceTest.php  | 32 ++++++++---
 .../FunctionalJavascript/PerformanceTest.php  | 53 -------------------
 .../StandardPerformanceTest.php               |  1 +
 .../Drupal/Tests/PerformanceTestTrait.php     |  1 -
 5 files changed, 50 insertions(+), 64 deletions(-)
 delete mode 100644 core/profiles/demo_umami/tests/src/FunctionalJavascript/PerformanceTest.php

diff --git a/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryFrontPagePerformanceTest.php b/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryFrontPagePerformanceTest.php
index 9cdf35039f78..a0a7c558e8a9 100644
--- a/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryFrontPagePerformanceTest.php
+++ b/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryFrontPagePerformanceTest.php
@@ -4,6 +4,7 @@
 
 namespace Drupal\Tests\demo_umami\FunctionalJavascript;
 
+use Drupal\Core\Cache\Cache;
 use Drupal\FunctionalJavascriptTests\PerformanceTestBase;
 
 /**
@@ -20,10 +21,19 @@ class OpenTelemetryFrontPagePerformanceTest extends PerformanceTestBase {
    */
   protected $profile = 'demo_umami';
 
+  /**
+   * Tests performance of the Umami demo front page.
+   */
+  public function testFrontPagePerformance(): void {
+    $this->testFrontPageColdCache();
+    $this->testFrontPageCoolCache();
+    $this->testFrontPageHotCache();
+  }
+
   /**
    * Logs front page tracing data with a cold cache.
    */
-  public function testFrontPageColdCache(): void {
+  protected function testFrontPageColdCache(): void {
     // @todo Chromedriver doesn't collect tracing performance logs for the very
     //   first request in a test, so warm it up.
     //   https://www.drupal.org/project/drupal/issues/3379750
@@ -40,7 +50,7 @@ public function testFrontPageColdCache(): void {
    *
    * Hot here means that all possible caches are warmed.
    */
-  public function testFrontPageHotCache(): void {
+  protected function testFrontPageHotCache(): void {
     // Request the page twice so that asset aggregates and image derivatives are
     // definitely cached in the browser cache. The first response builds the
     // file and serves from PHP with private, no-store headers. The second
@@ -76,10 +86,10 @@ public function testFrontPageHotCache(): void {
    * Cool here means that 'global' site caches are warm but anything
    * specific to the front page is cold.
    */
-  public function testFrontPageCoolCache(): void {
+  protected function testFrontPageCoolCache(): void {
     // First of all visit the front page to ensure the image style exists.
     $this->drupalGet('<front>');
-    $this->rebuildAll();
+    $this->clearCaches();
     // Now visit a different page to warm non-route-specific caches.
     $this->drupalGet('user/login');
     $this->collectPerformanceData(function () {
@@ -87,4 +97,13 @@ public function testFrontPageCoolCache(): void {
     }, 'umamiFrontPageCoolCache');
   }
 
+  /**
+   * Clear caches.
+   */
+  protected function clearCaches(): void {
+    foreach (Cache::getBins() as $bin) {
+      $bin->deleteAll();
+    }
+  }
+
 }
diff --git a/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php b/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php
index 2e3597ea7294..8b9c5df083b1 100644
--- a/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php
+++ b/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php
@@ -4,6 +4,7 @@
 
 namespace Drupal\Tests\demo_umami\FunctionalJavascript;
 
+use Drupal\Core\Cache\Cache;
 use Drupal\FunctionalJavascriptTests\PerformanceTestBase;
 
 /**
@@ -20,10 +21,20 @@ class OpenTelemetryNodePagePerformanceTest extends PerformanceTestBase {
    */
   protected $profile = 'demo_umami';
 
+  /**
+   * Test canonical node page performance with various cache permutations.
+   */
+  public function testNodePage(): void {
+    $this->testNodePageColdCache();
+    $this->testNodePageCoolCache();
+    $this->testNodePageWarmCache();
+    $this->testNodePageHotCache();
+  }
+
   /**
    * Logs node page tracing data with a cold cache.
    */
-  public function testNodePageColdCache(): void {
+  protected function testNodePageColdCache(): void {
     // @todo Chromedriver doesn't collect tracing performance logs for the very
     //   first request in a test, so warm it up.
     //   https://www.drupal.org/project/drupal/issues/3379750
@@ -40,7 +51,7 @@ public function testNodePageColdCache(): void {
    *
    * Hot here means that all possible caches are warmed.
    */
-  public function testNodePageHotCache(): void {
+  protected function testNodePageHotCache(): void {
     // Request the page twice so that asset aggregates are definitely cached in
     // the browser cache.
     $this->drupalGet('node/1');
@@ -64,10 +75,10 @@ public function testNodePageHotCache(): void {
    * Cool here means that 'global' site caches are warm but anything
    * specific to the route or path is cold.
    */
-  public function testNodePageCoolCache(): void {
+  protected function testNodePageCoolCache(): void {
     // First of all visit the node page to ensure the image style exists.
     $this->drupalGet('node/1');
-    $this->rebuildAll();
+    $this->clearCaches();
     // Now visit a non-node page to warm non-route-specific caches.
     $this->drupalGet('user/login');
     $this->collectPerformanceData(function () {
@@ -82,10 +93,10 @@ public function testNodePageCoolCache(): void {
    * Warm here means that 'global' site caches and route-specific caches are
    * warm but caches specific to this particular node/path are not.
    */
-  public function testNodePageWarmCache(): void {
+  protected function testNodePageWarmCache(): void {
     // First of all visit the node page to ensure the image style exists.
     $this->drupalGet('node/1');
-    $this->rebuildAll();
+    $this->clearCaches();
     // Now visit a different node page to warm non-path-specific caches.
     $this->drupalGet('node/2');
     $this->collectPerformanceData(function () {
@@ -94,4 +105,13 @@ public function testNodePageWarmCache(): void {
     $this->assertSession()->pageTextContains('quiche');
   }
 
+  /**
+   * Clear caches.
+   */
+  protected function clearCaches(): void {
+    foreach (Cache::getBins() as $bin) {
+      $bin->deleteAll();
+    }
+  }
+
 }
diff --git a/core/profiles/demo_umami/tests/src/FunctionalJavascript/PerformanceTest.php b/core/profiles/demo_umami/tests/src/FunctionalJavascript/PerformanceTest.php
deleted file mode 100644
index aec2ec911522..000000000000
--- a/core/profiles/demo_umami/tests/src/FunctionalJavascript/PerformanceTest.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Tests\demo_umami\FunctionalJavascript;
-
-use Drupal\FunctionalJavascriptTests\PerformanceTestBase;
-
-/**
- * Tests demo_umami profile performance.
- *
- * @group Performance
- */
-class PerformanceTest extends PerformanceTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $profile = 'demo_umami';
-
-  /**
-   * Just load the front page.
-   */
-  public function testPagesAnonymous(): void {
-    $performance_data = $this->collectPerformanceData(function () {
-      $this->drupalGet('<front>');
-    });
-    $this->assertSession()->pageTextContains('Umami');
-    $this->assertSame(2, $performance_data->getStylesheetCount());
-    $this->assertSame(1, $performance_data->getScriptCount());
-
-    $performance_data = $this->collectPerformanceData(function () {
-      $this->drupalGet('node/1');
-    });
-    $this->assertSame(2, $performance_data->getStylesheetCount());
-    $this->assertSame(1, $performance_data->getScriptCount());
-  }
-
-  /**
-   * Load the front page as a user with access to Toolbar.
-   */
-  public function testFrontPagePerformance(): void {
-    $admin_user = $this->drupalCreateUser(['access toolbar']);
-    $this->drupalLogin($admin_user);
-    $performance_data = $this->collectPerformanceData(function () {
-      $this->drupalGet('<front>');
-    });
-    $this->assertSession()->pageTextContains('Umami');
-    $this->assertSame(2, $performance_data->getStylesheetCount());
-    $this->assertSame(2, $performance_data->getScriptCount());
-  }
-
-}
diff --git a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
index 4aadd45d5f4f..543540dbc84a 100644
--- a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
+++ b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
@@ -16,6 +16,7 @@
  * Stark is used as the default theme so that this test is not Olivero specific.
  *
  * @group Common
+ * @group #slow
  * @requires extension apcu
  */
 class StandardPerformanceTest extends PerformanceTestBase {
diff --git a/core/tests/Drupal/Tests/PerformanceTestTrait.php b/core/tests/Drupal/Tests/PerformanceTestTrait.php
index 014fac12d5fa..ed85aafb78d0 100644
--- a/core/tests/Drupal/Tests/PerformanceTestTrait.php
+++ b/core/tests/Drupal/Tests/PerformanceTestTrait.php
@@ -111,7 +111,6 @@ public function collectPerformanceData(callable $callable, ?string $service_name
 
     $session = $this->getSession();
     $session->getDriver()->getWebDriverSession()->log('performance');
-    $collection = \Drupal::keyValue('performance_test');
     $collection->deleteAll();
     $return = $callable();
     $performance_data = $this->processChromeDriverPerformanceLogs($service_name);
-- 
GitLab