function AliasTest::testWhitelistCacheDeletionMidRequest

Same name in other branches
  1. 9 core/modules/path_alias/tests/src/Kernel/AliasTest.php \Drupal\Tests\path_alias\Kernel\AliasTest::testWhitelistCacheDeletionMidRequest()
  2. 8.9.x core/modules/path_alias/tests/src/Kernel/AliasTest.php \Drupal\Tests\path_alias\Kernel\AliasTest::testWhitelistCacheDeletionMidRequest()

Tests situation where the whitelist cache is deleted mid-request.

File

core/modules/path_alias/tests/src/Kernel/AliasTest.php, line 424

Class

AliasTest
Tests path alias CRUD and lookup functionality.

Namespace

Drupal\Tests\path_alias\Kernel

Code

public function testWhitelistCacheDeletionMidRequest() : void {
    $memoryCounterBackend = new MemoryCounterBackend(\Drupal::service(TimeInterface::class));
    // Create AliasManager and Path object.
    $whitelist = new AliasWhitelist('path_alias_whitelist', $memoryCounterBackend, $this->container
        ->get('lock'), $this->container
        ->get('state'), $this->container
        ->get('path_alias.repository'));
    // Whitelist cache should not exist at all yet.
    $this->assertFalse($memoryCounterBackend->get('path_alias_whitelist'));
    // Add some aliases for both menu routes we have.
    $this->createPathAlias('/admin/something', '/' . $this->randomMachineName());
    $this->createPathAlias('/user/something', '/' . $this->randomMachineName());
    // Lookup admin path in whitelist. It will query the DB and figure out
    // that it indeed has an alias, and add it to the internal whitelist and
    // flag it to be persisted to cache.
    $this->assertTrue($whitelist->get('admin'));
    // Destruct the whitelist so it persists its cache.
    $whitelist->destruct();
    $this->assertEquals(1, $memoryCounterBackend->getCounter('set', 'path_alias_whitelist'));
    // Cache data should have data for 'user' and 'admin', even though just
    // 'admin' was looked up. This is because the cache is primed with all
    // menu router base paths.
    $this->assertEquals([
        'user' => FALSE,
        'admin' => TRUE,
    ], $memoryCounterBackend->get('path_alias_whitelist')->data);
    $memoryCounterBackend->resetCounter();
    // Re-initialize the whitelist and lookup an alias for the 'user' path.
    // Whitelist should load data from its cache, see that it hasn't done a
    // check for 'user' yet, perform the check, then mark the result to be
    // persisted to cache.
    $whitelist = new AliasWhitelist('path_alias_whitelist', $memoryCounterBackend, $this->container
        ->get('lock'), $this->container
        ->get('state'), $this->container
        ->get('path_alias.repository'));
    $this->assertTrue($whitelist->get('user'));
    // Delete the whitelist cache. This could happen from an outside process,
    // like a code deployment that performs a cache rebuild.
    $memoryCounterBackend->delete('path_alias_whitelist');
    // Destruct whitelist so it attempts to save the whitelist data to cache.
    // However it should recognize that the previous cache entry was deleted
    // from underneath it and not save anything to cache, to protect from
    // cache corruption.
    $whitelist->destruct();
    $this->assertEquals(0, $memoryCounterBackend->getCounter('set', 'path_alias_whitelist'));
    $this->assertFalse($memoryCounterBackend->get('path_alias_whitelist'));
    $memoryCounterBackend->resetCounter();
}

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