public function ViewsDataTest::testCacheRequests

Ensures that cache entries are only set and get when necessary.

File

drupal/core/modules/views/lib/Drupal/views/Tests/ViewsDataTest.php, line 135
Definition of Drupal\views\Tests\ViewsDataTest.

Class

ViewsDataTest
Tests the fetching of views data.

Namespace

Drupal\views\Tests

Code

public function testCacheRequests() {

  // Request the same table 5 times. The caches are empty at this point, so
  // what will happen is that it will first check for a cache entry for the
  // given table, get a cache miss, then try the cache entry for all tables,
  // which does not exist yet either. As a result, it rebuilds the information
  // and writes a cache entry for all tables and the requested table.
  $table_name = 'views_test_data';
  for ($i = 0; $i < 5; $i++) {
    $this->viewsData
      ->get($table_name);
  }

  // Assert cache set and get calls.
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:views_test_data:en'), 1, 'Requested the cache for the table-specific cache entry.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:en'), 1, 'Requested the cache for all tables.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:views_test_data:en'), 1, 'Wrote the cache for the requested once.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:en'), 1, 'Wrote the cache for the all tables once.');

  // Re-initialize the views data cache to simulate a new request and repeat.
  // We have a warm cache now, so this will only request the tables-specific
  // cache entry and return that.
  $this
    ->initViewsData();
  for ($i = 0; $i < 5; $i++) {
    $this->viewsData
      ->get($table_name);
  }

  // Assert cache set and get calls.
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:views_test_data:en'), 1, 'Requested the cache for the table-specific cache entry.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:en'), 0, 'Did not request to load the cache entry for all tables.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:views_test_data:en'), 0, 'Did not write the cache for the requested table.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:en'), 0, 'Did not write the cache for all tables.');

  // Re-initialize the views data cache to simulate a new request and request
  // a different table. This will fail to get a table specific cache entry,
  // load the cache entry for all tables and save a cache entry for this table
  // but not all.
  $this
    ->initViewsData();
  $another_table_name = 'views';
  for ($i = 0; $i < 5; $i++) {
    $this->viewsData
      ->get($another_table_name);
  }

  // Assert cache set and get calls.
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:views:en'), 1, 'Requested the cache for the table-specific cache entry.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:en'), 1, 'Requested the cache for all tables.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:views:en'), 1, 'Wrote the cache for the requested once.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:en'), 0, 'Did not write the cache for all tables.');

  // Re-initialize the views data cache to simulate a new request and request
  // a non-existing table. This will result in the same cache requests as we
  // explicitly write an empty cache entry for non-existing tables to avoid
  // unecessary requests in those situations. We do have to load the cache
  // entry for all tables to check if the table does exist or not.
  $this
    ->initViewsData();
  $non_existing_table = $this
    ->randomName();
  for ($i = 0; $i < 5; $i++) {
    $this->viewsData
      ->get($non_existing_table);
  }

  // Assert cache set and get calls.
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', "views_data:{$non_existing_table}:en"), 1, 'Requested the cache for the table-specific cache entry.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:en'), 1, 'Requested the cache for all tables.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', "views_data:{$non_existing_table}:en"), 1, 'Wrote the cache for the requested once.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:en'), 0, 'Did not write the cache for all tables.');

  // Re-initialize the views data cache to simulate a new request and request
  // the same non-existing table. This will load the table-specific cache
  // entry and return the stored empty array for that.
  $this
    ->initViewsData();
  for ($i = 0; $i < 5; $i++) {
    $this->viewsData
      ->get($non_existing_table);
  }

  // Assert cache set and get calls.
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', "views_data:{$non_existing_table}:en"), 1, 'Requested the cache for the table-specific cache entry.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:en'), 0, 'Did not request to load the cache entry for all tables.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', "views_data:{$non_existing_table}:en"), 0, 'Did not write the cache for the requested table.');
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:en'), 0, 'Did not write the cache for all tables.');

  // Re-initialize the views data cache and repeat with no specified table.
  // This should only load the cache entry for all tables.
  $this
    ->initViewsData();
  for ($i = 0; $i < 5; $i++) {
    $this->viewsData
      ->get();
  }

  // This only requested the full information. No other cache requests should
  // have been made.
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:views_test_data:en'), 0);
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('get', 'views_data:en'), 1);
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:views_test_data:en'), 0);
  $this
    ->assertEqual($this->memoryCounterBackend
    ->getCounter('set', 'views_data:en'), 0);
}