You are here

public function AliasTest::testWhitelistCacheDeletionMidRequest in Drupal 9

Same name and namespace in other branches
  1. 8 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 177

Class

AliasTest
Tests path alias CRUD and lookup functionality.

Namespace

Drupal\Tests\path_alias\Kernel

Code

public function testWhitelistCacheDeletionMidRequest() {
  $memoryCounterBackend = new MemoryCounterBackend();

  // 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();
}