OpenTelemetryNodePagePerformanceTest.php

Same filename in other branches
  1. 10 core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php

Namespace

Drupal\Tests\demo_umami\FunctionalJavascript

File

core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\demo_umami\FunctionalJavascript;

use Drupal\Core\Cache\Cache;
use Drupal\FunctionalJavascriptTests\PerformanceTestBase;

/**
 * Tests demo_umami profile performance.
 *
 * @group OpenTelemetry
 * @group #slow
 * @requires extension apcu
 */
class OpenTelemetryNodePagePerformanceTest extends PerformanceTestBase {
    
    /**
     * {@inheritdoc}
     */
    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.
     */
    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
        $this->drupalGet('user/login');
        $this->rebuildAll();
        $this->collectPerformanceData(function () {
            $this->drupalGet('node/1');
        }, 'umamiNodePageColdCache');
        $this->assertSession()
            ->pageTextContains('quiche');
    }
    
    /**
     * Logs node page tracing data with a hot cache.
     *
     * Hot here means that all possible caches are warmed.
     */
    protected function testNodePageHotCache() : void {
        // Request the page twice so that asset aggregates are definitely cached in
        // the browser cache.
        $this->drupalGet('node/1');
        $this->drupalGet('node/1');
        $performance_data = $this->collectPerformanceData(function () {
            $this->drupalGet('node/1');
        }, 'umamiNodePageHotCache');
        $this->assertSession()
            ->pageTextContains('quiche');
        $expected_queries = [];
        $recorded_queries = $performance_data->getQueries();
        $this->assertSame($expected_queries, $recorded_queries);
        $this->assertSame($performance_data->getQueryCount(), 0);
        $this->assertSame($performance_data->getCacheGetCount(), 1);
        $this->assertSame($performance_data->getCacheSetCount(), 0);
        $this->assertSame($performance_data->getCacheDeleteCount(), 0);
        $this->assertSame(0, $performance_data->getCacheTagChecksumCount());
        $this->assertSame(1, $performance_data->getCacheTagIsValidCount());
        $this->assertSame(0, $performance_data->getCacheTagInvalidationCount());
        $this->assertSame(1, $performance_data->getScriptCount());
        $this->assertCountBetween(7000, 8000, $performance_data->getScriptBytes());
        $this->assertSame(2, $performance_data->getStylesheetCount());
        $this->assertCountBetween(41500, 42500, $performance_data->getStylesheetBytes());
    }
    
    /**
     * Logs node/1 tracing data with a cool cache.
     *
     * Cool here means that 'global' site caches are warm but anything
     * specific to the route or path is cold.
     */
    protected function testNodePageCoolCache() : void {
        // First of all visit the node page to ensure the image style exists.
        $this->drupalGet('node/1');
        $this->clearCaches();
        // Now visit a non-node page to warm non-route-specific caches.
        $this->drupalGet('user/login');
        $this->collectPerformanceData(function () {
            $this->drupalGet('node/1');
        }, 'umamiNodePageCoolCache');
        $this->assertSession()
            ->pageTextContains('quiche');
    }
    
    /**
     * Log node/1 tracing data with a warm cache.
     *
     * Warm here means that 'global' site caches and route-specific caches are
     * warm but caches specific to this particular node/path are not.
     */
    protected function testNodePageWarmCache() : void {
        // First of all visit the node page to ensure the image style exists.
        $this->drupalGet('node/1');
        $this->clearCaches();
        // Now visit a different node page to warm non-path-specific caches.
        $this->drupalGet('node/2');
        $this->collectPerformanceData(function () {
            $this->drupalGet('node/1');
        }, 'umamiNodePageWarmCache');
        $this->assertSession()
            ->pageTextContains('quiche');
    }
    
    /**
     * Clear caches.
     */
    protected function clearCaches() : void {
        foreach (Cache::getBins() as $bin) {
            $bin->deleteAll();
        }
    }

}

Classes

Title Deprecated Summary
OpenTelemetryNodePagePerformanceTest Tests demo_umami profile performance.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.