class GenericCacheBackendUnitTestBase

Same name in this branch
  1. 8.9.x core/tests/Drupal/KernelTests/Core/Cache/GenericCacheBackendUnitTestBase.php \Drupal\KernelTests\Core\Cache\GenericCacheBackendUnitTestBase
Same name in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Cache/GenericCacheBackendUnitTestBase.php \Drupal\KernelTests\Core\Cache\GenericCacheBackendUnitTestBase
  2. 10 core/tests/Drupal/KernelTests/Core/Cache/GenericCacheBackendUnitTestBase.php \Drupal\KernelTests\Core\Cache\GenericCacheBackendUnitTestBase
  3. 11.x core/tests/Drupal/KernelTests/Core/Cache/GenericCacheBackendUnitTestBase.php \Drupal\KernelTests\Core\Cache\GenericCacheBackendUnitTestBase

Tests any cache backend.

Full generic unit test suite for any cache backend. In order to use it for a cache backend implementation, extend this class and override the createBackendInstance() method to return an object.

Hierarchy

Expanded class hierarchy of GenericCacheBackendUnitTestBase

Deprecated

in drupal:8.2.0 and is removed from drupal:9.0.0. Use \Drupal\KernelTests\Core\Cache\GenericCacheBackendUnitTestBase instead.

See also

DatabaseBackendUnitTestCase For a full working implementation.

File

core/modules/system/src/Tests/Cache/GenericCacheBackendUnitTestBase.php, line 24

Namespace

Drupal\system\Tests\Cache
View source
abstract class GenericCacheBackendUnitTestBase extends KernelTestBase {
    
    /**
     * Array of objects implementing Drupal\Core\Cache\CacheBackendInterface.
     *
     * @var array
     */
    protected $cachebackends;
    
    /**
     * Cache bin to use for testing.
     *
     * @var string
     */
    protected $testBin;
    
    /**
     * Random value to use in tests.
     *
     * @var string
     */
    protected $defaultValue;
    
    /**
     * Gets the testing bin.
     *
     * Override this method if you want to work on a different bin than the
     * default one.
     *
     * @return string
     *   Bin name.
     */
    protected function getTestBin() {
        if (!isset($this->testBin)) {
            $this->testBin = 'page';
        }
        return $this->testBin;
    }
    
    /**
     * Creates a cache backend to test.
     *
     * Override this method to test a CacheBackend.
     *
     * @param string $bin
     *   Bin name to use for this backend instance.
     *
     * @return \Drupal\Core\Cache\CacheBackendInterface
     *   Cache backend to test.
     */
    protected abstract function createCacheBackend($bin);
    
    /**
     * Allows specific implementation to change the environment before a test run.
     */
    public function setUpCacheBackend() {
    }
    
    /**
     * Allows alteration of environment after a test run but before tear down.
     *
     * Used before the real tear down because the tear down will change things
     * such as the database prefix.
     */
    public function tearDownCacheBackend() {
    }
    
    /**
     * Gets a backend to test; this will get a shared instance set in the object.
     *
     * @return \Drupal\Core\Cache\CacheBackendInterface
     *   Cache backend to test.
     */
    protected function getCacheBackend($bin = NULL) {
        if (!isset($bin)) {
            $bin = $this->getTestBin();
        }
        if (!isset($this->cachebackends[$bin])) {
            $this->cachebackends[$bin] = $this->createCacheBackend($bin);
            // Ensure the backend is empty.
            $this->cachebackends[$bin]
                ->deleteAll();
        }
        return $this->cachebackends[$bin];
    }
    protected function setUp() {
        $this->cachebackends = [];
        $this->defaultValue = $this->randomMachineName(10);
        parent::setUp();
        $this->setUpCacheBackend();
    }
    protected function tearDown() {
        // Destruct the registered backend, each test will get a fresh instance,
        // properly emptying it here ensure that on persistent data backends they
        // will come up empty the next test.
        foreach ($this->cachebackends as $bin => $cachebackend) {
            $this->cachebackends[$bin]
                ->deleteAll();
        }
        unset($this->cachebackends);
        $this->tearDownCacheBackend();
        parent::tearDown();
    }
    
    /**
     * Tests the get and set methods of Drupal\Core\Cache\CacheBackendInterface.
     */
    public function testSetGet() {
        $backend = $this->getCacheBackend();
        $this->assertIdentical(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1.");
        $with_backslash = [
            'foo' => '\\Drupal\\foo\\Bar',
        ];
        $backend->set('test1', $with_backslash);
        $cached = $backend->get('test1');
        $this->assert(is_object($cached), "Backend returned an object for cache id test1.");
        $this->assertIdentical($with_backslash, $cached->data);
        $this->assertTrue($cached->valid, 'Item is marked as valid.');
        // We need to round because microtime may be rounded up in the backend.
        $this->assertTrue($cached->created >= REQUEST_TIME && $cached->created <= round(microtime(TRUE), 3), 'Created time is correct.');
        $this->assertEqual($cached->expire, Cache::PERMANENT, 'Expire time is correct.');
        $this->assertIdentical(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2.");
        $backend->set('test2', [
            'value' => 3,
        ], REQUEST_TIME + 3);
        $cached = $backend->get('test2');
        $this->assert(is_object($cached), "Backend returned an object for cache id test2.");
        $this->assertIdentical([
            'value' => 3,
        ], $cached->data);
        $this->assertTrue($cached->valid, 'Item is marked as valid.');
        $this->assertTrue($cached->created >= REQUEST_TIME && $cached->created <= round(microtime(TRUE), 3), 'Created time is correct.');
        $this->assertEqual($cached->expire, REQUEST_TIME + 3, 'Expire time is correct.');
        $backend->set('test3', 'foobar', REQUEST_TIME - 3);
        $this->assertFalse($backend->get('test3'), 'Invalid item not returned.');
        $cached = $backend->get('test3', TRUE);
        $this->assert(is_object($cached), 'Backend returned an object for cache id test3.');
        $this->assertFalse($cached->valid, 'Item is marked as valid.');
        $this->assertTrue($cached->created >= REQUEST_TIME && $cached->created <= round(microtime(TRUE), 3), 'Created time is correct.');
        $this->assertEqual($cached->expire, REQUEST_TIME - 3, 'Expire time is correct.');
        $this->assertIdentical(FALSE, $backend->get('test4'), "Backend does not contain data for cache id test4.");
        $with_eof = [
            'foo' => "\nEOF\ndata",
        ];
        $backend->set('test4', $with_eof);
        $cached = $backend->get('test4');
        $this->assert(is_object($cached), "Backend returned an object for cache id test4.");
        $this->assertIdentical($with_eof, $cached->data);
        $this->assertTrue($cached->valid, 'Item is marked as valid.');
        $this->assertTrue($cached->created >= REQUEST_TIME && $cached->created <= round(microtime(TRUE), 3), 'Created time is correct.');
        $this->assertEqual($cached->expire, Cache::PERMANENT, 'Expire time is correct.');
        $this->assertIdentical(FALSE, $backend->get('test5'), "Backend does not contain data for cache id test5.");
        $with_eof_and_semicolon = [
            'foo' => "\nEOF;\ndata",
        ];
        $backend->set('test5', $with_eof_and_semicolon);
        $cached = $backend->get('test5');
        $this->assert(is_object($cached), "Backend returned an object for cache id test5.");
        $this->assertIdentical($with_eof_and_semicolon, $cached->data);
        $this->assertTrue($cached->valid, 'Item is marked as valid.');
        $this->assertTrue($cached->created >= REQUEST_TIME && $cached->created <= round(microtime(TRUE), 3), 'Created time is correct.');
        $this->assertEqual($cached->expire, Cache::PERMANENT, 'Expire time is correct.');
        $with_variable = [
            'foo' => '$bar',
        ];
        $backend->set('test6', $with_variable);
        $cached = $backend->get('test6');
        $this->assert(is_object($cached), "Backend returned an object for cache id test6.");
        $this->assertIdentical($with_variable, $cached->data);
        // Make sure that a cached object is not affected by changing the original.
        $data = new \stdClass();
        $data->value = 1;
        $data->obj = new \stdClass();
        $data->obj->value = 2;
        $backend->set('test7', $data);
        $expected_data = clone $data;
        // Add a property to the original. It should not appear in the cached data.
        $data->this_should_not_be_in_the_cache = TRUE;
        $cached = $backend->get('test7');
        $this->assert(is_object($cached), "Backend returned an object for cache id test7.");
        $this->assertEqual($expected_data, $cached->data);
        $this->assertFalse(isset($cached->data->this_should_not_be_in_the_cache));
        // Add a property to the cache data. It should not appear when we fetch
        // the data from cache again.
        $cached->data->this_should_not_be_in_the_cache = TRUE;
        $fresh_cached = $backend->get('test7');
        $this->assertFalse(isset($fresh_cached->data->this_should_not_be_in_the_cache));
        // Check with a long key.
        $cid = str_repeat('a', 300);
        $backend->set($cid, 'test');
        $this->assertEqual('test', $backend->get($cid)->data);
        // Check that the cache key is case sensitive.
        $backend->set('TEST8', 'value');
        $this->assertEqual('value', $backend->get('TEST8')->data);
        $this->assertFalse($backend->get('test8'));
        // Calling ::set() with invalid cache tags. This should fail an assertion.
        try {
            $backend->set('assertion_test', 'value', Cache::PERMANENT, [
                'node' => [
                    3,
                    5,
                    7,
                ],
            ]);
            $this->fail('::set() was called with invalid cache tags, runtime assertion did not fail.');
        } catch (\AssertionError $e) {
            $this->pass('::set() was called with invalid cache tags, runtime assertion failed.');
        }
    }
    
    /**
     * Tests Drupal\Core\Cache\CacheBackendInterface::delete().
     */
    public function testDelete() {
        $backend = $this->getCacheBackend();
        $this->assertIdentical(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1.");
        $backend->set('test1', 7);
        $this->assert(is_object($backend->get('test1')), "Backend returned an object for cache id test1.");
        $this->assertIdentical(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2.");
        $backend->set('test2', 3);
        $this->assert(is_object($backend->get('test2')), "Backend returned an object for cache id %cid.");
        $backend->delete('test1');
        $this->assertIdentical(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1 after deletion.");
        $this->assert(is_object($backend->get('test2')), "Backend still has an object for cache id test2.");
        $backend->delete('test2');
        $this->assertIdentical(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2 after deletion.");
        $long_cid = str_repeat('a', 300);
        $backend->set($long_cid, 'test');
        $backend->delete($long_cid);
        $this->assertIdentical(FALSE, $backend->get($long_cid), "Backend does not contain data for long cache id after deletion.");
    }
    
    /**
     * Tests data type preservation.
     */
    public function testValueTypeIsKept() {
        $backend = $this->getCacheBackend();
        $variables = [
            'test1' => 1,
            'test2' => '0',
            'test3' => '',
            'test4' => 12.64,
            'test5' => FALSE,
            'test6' => [
                1,
                2,
                3,
            ],
        ];
        // Create cache entries.
        foreach ($variables as $cid => $data) {
            $backend->set($cid, $data);
        }
        // Retrieve and test cache objects.
        foreach ($variables as $cid => $value) {
            $object = $backend->get($cid);
            $this->assert(is_object($object), sprintf("Backend returned an object for cache id %s.", $cid));
            $this->assertIdentical($value, $object->data, sprintf("Data of cached id %s kept is identical in type and value", $cid));
        }
    }
    
    /**
     * Tests Drupal\Core\Cache\CacheBackendInterface::getMultiple().
     */
    public function testGetMultiple() {
        $backend = $this->getCacheBackend();
        // Set numerous testing keys.
        $long_cid = str_repeat('a', 300);
        $backend->set('test1', 1);
        $backend->set('test2', 3);
        $backend->set('test3', 5);
        $backend->set('test4', 7);
        $backend->set('test5', 11);
        $backend->set('test6', 13);
        $backend->set('test7', 17);
        $backend->set($long_cid, 300);
        // Mismatch order for harder testing.
        $reference = [
            'test3',
            'test7',
            // Cid does not exist.
'test21',
            'test6',
            // Cid does not exist until added before second getMultiple().
'test19',
            'test2',
        ];
        $cids = $reference;
        $ret = $backend->getMultiple($cids);
        // Test return - ensure it contains existing cache ids.
        $this->assert(isset($ret['test2']), "Existing cache id test2 is set.");
        $this->assert(isset($ret['test3']), "Existing cache id test3 is set.");
        $this->assert(isset($ret['test6']), "Existing cache id test6 is set.");
        $this->assert(isset($ret['test7']), "Existing cache id test7 is set.");
        // Test return - ensure that objects has expected properties.
        $this->assertTrue($ret['test2']->valid, 'Item is marked as valid.');
        $this->assertTrue($ret['test2']->created >= REQUEST_TIME && $ret['test2']->created <= round(microtime(TRUE), 3), 'Created time is correct.');
        $this->assertEqual($ret['test2']->expire, Cache::PERMANENT, 'Expire time is correct.');
        // Test return - ensure it does not contain nonexistent cache ids.
        $this->assertFalse(isset($ret['test19']), "Nonexistent cache id test19 is not set.");
        $this->assertFalse(isset($ret['test21']), "Nonexistent cache id test21 is not set.");
        // Test values.
        $this->assertIdentical($ret['test2']->data, 3, "Existing cache id test2 has the correct value.");
        $this->assertIdentical($ret['test3']->data, 5, "Existing cache id test3 has the correct value.");
        $this->assertIdentical($ret['test6']->data, 13, "Existing cache id test6 has the correct value.");
        $this->assertIdentical($ret['test7']->data, 17, "Existing cache id test7 has the correct value.");
        // Test $cids array - ensure it contains cache id's that do not exist.
        $this->assert(in_array('test19', $cids), "Nonexistent cache id test19 is in cids array.");
        $this->assert(in_array('test21', $cids), "Nonexistent cache id test21 is in cids array.");
        // Test $cids array - ensure it does not contain cache id's that exist.
        $this->assertFalse(in_array('test2', $cids), "Existing cache id test2 is not in cids array.");
        $this->assertFalse(in_array('test3', $cids), "Existing cache id test3 is not in cids array.");
        $this->assertFalse(in_array('test6', $cids), "Existing cache id test6 is not in cids array.");
        $this->assertFalse(in_array('test7', $cids), "Existing cache id test7 is not in cids array.");
        // Test a second time after deleting and setting new keys which ensures that
        // if the backend uses statics it does not cause unexpected results.
        $backend->delete('test3');
        $backend->delete('test6');
        $backend->set('test19', 57);
        $cids = $reference;
        $ret = $backend->getMultiple($cids);
        // Test return - ensure it contains existing cache ids.
        $this->assert(isset($ret['test2']), "Existing cache id test2 is set");
        $this->assert(isset($ret['test7']), "Existing cache id test7 is set");
        $this->assert(isset($ret['test19']), "Added cache id test19 is set");
        // Test return - ensure it does not contain nonexistent cache ids.
        $this->assertFalse(isset($ret['test3']), "Deleted cache id test3 is not set");
        $this->assertFalse(isset($ret['test6']), "Deleted cache id test6 is not set");
        $this->assertFalse(isset($ret['test21']), "Nonexistent cache id test21 is not set");
        // Test values.
        $this->assertIdentical($ret['test2']->data, 3, "Existing cache id test2 has the correct value.");
        $this->assertIdentical($ret['test7']->data, 17, "Existing cache id test7 has the correct value.");
        $this->assertIdentical($ret['test19']->data, 57, "Added cache id test19 has the correct value.");
        // Test $cids array - ensure it contains cache id's that do not exist.
        $this->assert(in_array('test3', $cids), "Deleted cache id test3 is in cids array.");
        $this->assert(in_array('test6', $cids), "Deleted cache id test6 is in cids array.");
        $this->assert(in_array('test21', $cids), "Nonexistent cache id test21 is in cids array.");
        // Test $cids array - ensure it does not contain cache id's that exist.
        $this->assertFalse(in_array('test2', $cids), "Existing cache id test2 is not in cids array.");
        $this->assertFalse(in_array('test7', $cids), "Existing cache id test7 is not in cids array.");
        $this->assertFalse(in_array('test19', $cids), "Added cache id test19 is not in cids array.");
        // Test with a long $cid and non-numeric array key.
        $cids = [
            'key:key' => $long_cid,
        ];
        $return = $backend->getMultiple($cids);
        $this->assertEqual(300, $return[$long_cid]->data);
        $this->assertTrue(empty($cids));
    }
    
    /**
     * Tests \Drupal\Core\Cache\CacheBackendInterface::setMultiple().
     */
    public function testSetMultiple() {
        $backend = $this->getCacheBackend();
        $future_expiration = REQUEST_TIME + 100;
        // Set multiple testing keys.
        $backend->set('cid_1', 'Some other value');
        $items = [
            'cid_1' => [
                'data' => 1,
            ],
            'cid_2' => [
                'data' => 2,
            ],
            'cid_3' => [
                'data' => [
                    1,
                    2,
                ],
            ],
            'cid_4' => [
                'data' => 1,
                'expire' => $future_expiration,
            ],
            'cid_5' => [
                'data' => 1,
                'tags' => [
                    'test:a',
                    'test:b',
                ],
            ],
        ];
        $backend->setMultiple($items);
        $cids = array_keys($items);
        $cached = $backend->getMultiple($cids);
        $this->assertEqual($cached['cid_1']->data, $items['cid_1']['data'], 'Over-written cache item set correctly.');
        $this->assertTrue($cached['cid_1']->valid, 'Item is marked as valid.');
        $this->assertTrue($cached['cid_1']->created >= REQUEST_TIME && $cached['cid_1']->created <= round(microtime(TRUE), 3), 'Created time is correct.');
        $this->assertEqual($cached['cid_1']->expire, CacheBackendInterface::CACHE_PERMANENT, 'Cache expiration defaults to permanent.');
        $this->assertEqual($cached['cid_2']->data, $items['cid_2']['data'], 'New cache item set correctly.');
        $this->assertEqual($cached['cid_2']->expire, CacheBackendInterface::CACHE_PERMANENT, 'Cache expiration defaults to permanent.');
        $this->assertEqual($cached['cid_3']->data, $items['cid_3']['data'], 'New cache item with serialized data set correctly.');
        $this->assertEqual($cached['cid_3']->expire, CacheBackendInterface::CACHE_PERMANENT, 'Cache expiration defaults to permanent.');
        $this->assertEqual($cached['cid_4']->data, $items['cid_4']['data'], 'New cache item set correctly.');
        $this->assertEqual($cached['cid_4']->expire, $future_expiration, 'Cache expiration has been correctly set.');
        $this->assertEqual($cached['cid_5']->data, $items['cid_5']['data'], 'New cache item set correctly.');
        // Calling ::setMultiple() with invalid cache tags. This should fail an
        // assertion.
        try {
            $items = [
                'exception_test_1' => [
                    'data' => 1,
                    'tags' => [],
                ],
                'exception_test_2' => [
                    'data' => 2,
                    'tags' => [
                        'valid',
                    ],
                ],
                'exception_test_3' => [
                    'data' => 3,
                    'tags' => [
                        'node' => [
                            3,
                            5,
                            7,
                        ],
                    ],
                ],
            ];
            $backend->setMultiple($items);
            $this->fail('::setMultiple() was called with invalid cache tags, runtime assertion did not fail.');
        } catch (\AssertionError $e) {
            $this->pass('::setMultiple() was called with invalid cache tags, runtime assertion failed.');
        }
    }
    
    /**
     * Test Drupal\Core\Cache\CacheBackendInterface::delete() and
     * Drupal\Core\Cache\CacheBackendInterface::deleteMultiple().
     */
    public function testDeleteMultiple() {
        $backend = $this->getCacheBackend();
        // Set numerous testing keys.
        $backend->set('test1', 1);
        $backend->set('test2', 3);
        $backend->set('test3', 5);
        $backend->set('test4', 7);
        $backend->set('test5', 11);
        $backend->set('test6', 13);
        $backend->set('test7', 17);
        $backend->delete('test1');
        // Nonexistent key should not cause an error.
        $backend->delete('test23');
        $backend->deleteMultiple([
            'test3',
            'test5',
            'test7',
            // Nonexistent key should not cause an error.
'test19',
            // Nonexistent key should not cause an error.
'test21',
        ]);
        // Test if expected keys have been deleted.
        $this->assertIdentical(FALSE, $backend->get('test1'), "Cache id test1 deleted.");
        $this->assertIdentical(FALSE, $backend->get('test3'), "Cache id test3 deleted.");
        $this->assertIdentical(FALSE, $backend->get('test5'), "Cache id test5 deleted.");
        $this->assertIdentical(FALSE, $backend->get('test7'), "Cache id test7 deleted.");
        // Test if expected keys exist.
        $this->assertNotIdentical(FALSE, $backend->get('test2'), "Cache id test2 exists.");
        $this->assertNotIdentical(FALSE, $backend->get('test4'), "Cache id test4 exists.");
        $this->assertNotIdentical(FALSE, $backend->get('test6'), "Cache id test6 exists.");
        // Test if that expected keys do not exist.
        $this->assertIdentical(FALSE, $backend->get('test19'), "Cache id test19 does not exist.");
        $this->assertIdentical(FALSE, $backend->get('test21'), "Cache id test21 does not exist.");
        // Calling deleteMultiple() with an empty array should not cause an error.
        $this->assertFalse($backend->deleteMultiple([]));
    }
    
    /**
     * Test Drupal\Core\Cache\CacheBackendInterface::deleteAll().
     */
    public function testDeleteAll() {
        $backend_a = $this->getCacheBackend();
        $backend_b = $this->getCacheBackend('bootstrap');
        // Set both expiring and permanent keys.
        $backend_a->set('test1', 1, Cache::PERMANENT);
        $backend_a->set('test2', 3, time() + 1000);
        $backend_b->set('test3', 4, Cache::PERMANENT);
        $backend_a->deleteAll();
        $this->assertFalse($backend_a->get('test1'), 'First key has been deleted.');
        $this->assertFalse($backend_a->get('test2'), 'Second key has been deleted.');
        $this->assertTrue($backend_b->get('test3'), 'Item in other bin is preserved.');
    }
    
    /**
     * Test Drupal\Core\Cache\CacheBackendInterface::invalidate() and
     * Drupal\Core\Cache\CacheBackendInterface::invalidateMultiple().
     */
    public function testInvalidate() {
        $backend = $this->getCacheBackend();
        $backend->set('test1', 1);
        $backend->set('test2', 2);
        $backend->set('test3', 2);
        $backend->set('test4', 2);
        $reference = [
            'test1',
            'test2',
            'test3',
            'test4',
        ];
        $cids = $reference;
        $ret = $backend->getMultiple($cids);
        $this->assertCount(4, $ret, 'Four items returned.');
        $backend->invalidate('test1');
        $backend->invalidateMultiple([
            'test2',
            'test3',
        ]);
        $cids = $reference;
        $ret = $backend->getMultiple($cids);
        $this->assertCount(1, $ret, 'Only one item element returned.');
        $cids = $reference;
        $ret = $backend->getMultiple($cids, TRUE);
        $this->assertCount(4, $ret, 'Four items returned.');
        // Calling invalidateMultiple() with an empty array should not cause an
        // error.
        $this->assertFalse($backend->invalidateMultiple([]));
    }
    
    /**
     * Tests Drupal\Core\Cache\CacheBackendInterface::invalidateTags().
     */
    public function testInvalidateTags() {
        $backend = $this->getCacheBackend();
        // Create two cache entries with the same tag and tag value.
        $backend->set('test_cid_invalidate1', $this->defaultValue, Cache::PERMANENT, [
            'test_tag:2',
        ]);
        $backend->set('test_cid_invalidate2', $this->defaultValue, Cache::PERMANENT, [
            'test_tag:2',
        ]);
        $this->assertTrue($backend->get('test_cid_invalidate1') && $backend->get('test_cid_invalidate2'), 'Two cache items were created.');
        // Invalidate test_tag of value 1. This should invalidate both entries.
        Cache::invalidateTags([
            'test_tag:2',
        ]);
        $this->assertFalse($backend->get('test_cid_invalidate1') || $backend->get('test_cid_invalidate2'), 'Two cache items invalidated after invalidating a cache tag.');
        $this->assertTrue($backend->get('test_cid_invalidate1', TRUE) && $backend->get('test_cid_invalidate2', TRUE), 'Cache items not deleted after invalidating a cache tag.');
        // Create two cache entries with the same tag and an array tag value.
        $backend->set('test_cid_invalidate1', $this->defaultValue, Cache::PERMANENT, [
            'test_tag:1',
        ]);
        $backend->set('test_cid_invalidate2', $this->defaultValue, Cache::PERMANENT, [
            'test_tag:1',
        ]);
        $this->assertTrue($backend->get('test_cid_invalidate1') && $backend->get('test_cid_invalidate2'), 'Two cache items were created.');
        // Invalidate test_tag of value 1. This should invalidate both entries.
        Cache::invalidateTags([
            'test_tag:1',
        ]);
        $this->assertFalse($backend->get('test_cid_invalidate1') || $backend->get('test_cid_invalidate2'), 'Two caches removed after invalidating a cache tag.');
        $this->assertTrue($backend->get('test_cid_invalidate1', TRUE) && $backend->get('test_cid_invalidate2', TRUE), 'Cache items not deleted after invalidating a cache tag.');
        // Create three cache entries with a mix of tags and tag values.
        $backend->set('test_cid_invalidate1', $this->defaultValue, Cache::PERMANENT, [
            'test_tag:1',
        ]);
        $backend->set('test_cid_invalidate2', $this->defaultValue, Cache::PERMANENT, [
            'test_tag:2',
        ]);
        $backend->set('test_cid_invalidate3', $this->defaultValue, Cache::PERMANENT, [
            'test_tag_foo:3',
        ]);
        $this->assertTrue($backend->get('test_cid_invalidate1') && $backend->get('test_cid_invalidate2') && $backend->get('test_cid_invalidate3'), 'Three cached items were created.');
        Cache::invalidateTags([
            'test_tag_foo:3',
        ]);
        $this->assertTrue($backend->get('test_cid_invalidate1') && $backend->get('test_cid_invalidate2'), 'Cache items not matching the tag were not invalidated.');
        $this->assertFalse($backend->get('test_cid_invalidated3'), 'Cached item matching the tag was removed.');
        // Create cache entry in multiple bins. Two cache entries
        // (test_cid_invalidate1 and test_cid_invalidate2) still exist from previous
        // tests.
        $tags = [
            'test_tag:1',
            'test_tag:2',
            'test_tag:3',
        ];
        $bins = [
            'path',
            'bootstrap',
            'page',
        ];
        foreach ($bins as $bin) {
            $this->getCacheBackend($bin)
                ->set('test', $this->defaultValue, Cache::PERMANENT, $tags);
            $this->assertTrue($this->getCacheBackend($bin)
                ->get('test'), 'Cache item was set in bin.');
        }
        Cache::invalidateTags([
            'test_tag:2',
        ]);
        // Test that the cache entry has been invalidated in multiple bins.
        foreach ($bins as $bin) {
            $this->assertFalse($this->getCacheBackend($bin)
                ->get('test'), 'Tag invalidation affected item in bin.');
        }
        // Test that the cache entry with a matching tag has been invalidated.
        $this->assertFalse($this->getCacheBackend($bin)
            ->get('test_cid_invalidate2'), 'Cache items matching tag were invalidated.');
        // Test that the cache entry with without a matching tag still exists.
        $this->assertTrue($this->getCacheBackend($bin)
            ->get('test_cid_invalidate1'), 'Cache items not matching tag were not invalidated.');
    }
    
    /**
     * Test Drupal\Core\Cache\CacheBackendInterface::invalidateAll().
     */
    public function testInvalidateAll() {
        $backend_a = $this->getCacheBackend();
        $backend_b = $this->getCacheBackend('bootstrap');
        // Set both expiring and permanent keys.
        $backend_a->set('test1', 1, Cache::PERMANENT);
        $backend_a->set('test2', 3, time() + 1000);
        $backend_b->set('test3', 4, Cache::PERMANENT);
        $backend_a->invalidateAll();
        $this->assertFalse($backend_a->get('test1'), 'First key has been invalidated.');
        $this->assertFalse($backend_a->get('test2'), 'Second key has been invalidated.');
        $this->assertTrue($backend_b->get('test3'), 'Item in other bin is preserved.');
        $this->assertTrue($backend_a->get('test1', TRUE), 'First key has not been deleted.');
        $this->assertTrue($backend_a->get('test2', TRUE), 'Second key has not been deleted.');
    }
    
    /**
     * Tests Drupal\Core\Cache\CacheBackendInterface::removeBin().
     */
    public function testRemoveBin() {
        $backend_a = $this->getCacheBackend();
        $backend_b = $this->getCacheBackend('bootstrap');
        // Set both expiring and permanent keys.
        $backend_a->set('test1', 1, Cache::PERMANENT);
        $backend_a->set('test2', 3, time() + 1000);
        $backend_b->set('test3', 4, Cache::PERMANENT);
        $backend_a->removeBin();
        $this->assertFalse($backend_a->get('test1'), 'First key has been deleted.');
        $this->assertFalse($backend_a->get('test2', TRUE), 'Second key has been deleted.');
        $this->assertTrue($backend_b->get('test3'), 'Item in other bin is preserved.');
    }

}

Members

Title Sort descending Deprecated Modifiers Object type Summary Overriden Title Overrides
AssertHelperTrait::castSafeStrings protected static function Casts MarkupInterface objects into strings.
ConfigTestTrait::configImporter protected function Returns a ConfigImporter object to import test configuration.
ConfigTestTrait::copyConfig protected function Copies configuration objects from source storage to target storage.
GeneratePermutationsTrait::generatePermutations public static function Converts a list of possible parameters into a stack of permutations.
GenericCacheBackendUnitTestBase::$cachebackends protected property Array of objects implementing Drupal\Core\Cache\CacheBackendInterface.
GenericCacheBackendUnitTestBase::$defaultValue protected property Random value to use in tests.
GenericCacheBackendUnitTestBase::$testBin protected property Cache bin to use for testing.
GenericCacheBackendUnitTestBase::createCacheBackend abstract protected function Creates a cache backend to test.
GenericCacheBackendUnitTestBase::getCacheBackend protected function Gets a backend to test; this will get a shared instance set in the object.
GenericCacheBackendUnitTestBase::getTestBin protected function Gets the testing bin.
GenericCacheBackendUnitTestBase::setUp protected function Performs setup tasks before each individual test method is run. Overrides KernelTestBase::setUp
GenericCacheBackendUnitTestBase::setUpCacheBackend public function Allows specific implementation to change the environment before a test run.
GenericCacheBackendUnitTestBase::tearDown protected function Performs cleanup tasks after each individual test method has been run. Overrides KernelTestBase::tearDown
GenericCacheBackendUnitTestBase::tearDownCacheBackend public function Allows alteration of environment after a test run but before tear down.
GenericCacheBackendUnitTestBase::testDelete public function Tests Drupal\Core\Cache\CacheBackendInterface::delete().
GenericCacheBackendUnitTestBase::testDeleteAll public function Test Drupal\Core\Cache\CacheBackendInterface::deleteAll().
GenericCacheBackendUnitTestBase::testDeleteMultiple public function Test Drupal\Core\Cache\CacheBackendInterface::delete() and
Drupal\Core\Cache\CacheBackendInterface::deleteMultiple().
GenericCacheBackendUnitTestBase::testGetMultiple public function Tests Drupal\Core\Cache\CacheBackendInterface::getMultiple().
GenericCacheBackendUnitTestBase::testInvalidate public function Test Drupal\Core\Cache\CacheBackendInterface::invalidate() and
Drupal\Core\Cache\CacheBackendInterface::invalidateMultiple().
GenericCacheBackendUnitTestBase::testInvalidateAll public function Test Drupal\Core\Cache\CacheBackendInterface::invalidateAll().
GenericCacheBackendUnitTestBase::testInvalidateTags public function Tests Drupal\Core\Cache\CacheBackendInterface::invalidateTags().
GenericCacheBackendUnitTestBase::testRemoveBin public function Tests Drupal\Core\Cache\CacheBackendInterface::removeBin().
GenericCacheBackendUnitTestBase::testSetGet public function Tests the get and set methods of Drupal\Core\Cache\CacheBackendInterface.
GenericCacheBackendUnitTestBase::testSetMultiple public function Tests \Drupal\Core\Cache\CacheBackendInterface::setMultiple().
GenericCacheBackendUnitTestBase::testValueTypeIsKept public function Tests data type preservation.
KernelTestBase::$configDirectories protected property The configuration directories for this test run.
KernelTestBase::$keyValueFactory protected property A KeyValueMemoryFactory instance to use when building the container.
KernelTestBase::$moduleFiles private property
KernelTestBase::$modules public static property Modules to enable. 3
KernelTestBase::$streamWrappers protected property Array of registered stream wrappers.
KernelTestBase::$themeFiles private property
KernelTestBase::beforePrepareEnvironment protected function Act on global state information before the environment is altered for a test. Overrides TestBase::beforePrepareEnvironment
KernelTestBase::containerBuild public function Sets up the base service container for this test.
KernelTestBase::defaultLanguageData protected function Provides the data for setting the default language on the container.
KernelTestBase::disableModules protected function Disables modules for this test.
KernelTestBase::enableModules protected function Enables modules for this test.
KernelTestBase::installConfig protected function Installs default configuration for a given list of modules.
KernelTestBase::installEntitySchema protected function Installs the storage schema for a specific entity type.
KernelTestBase::installSchema protected function Installs a specific table from a module schema definition.
KernelTestBase::prepareConfigDirectories protected function Create and set new configuration directories.
KernelTestBase::registerStreamWrapper protected function Registers a stream wrapper for this test.
KernelTestBase::render protected function Renders a render array.
KernelTestBase::__construct public function Constructor for Test. Overrides TestBase::__construct
RandomGeneratorTrait::$randomGenerator protected property The random generator.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers. 1
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
RandomGeneratorTrait::randomStringValidate public function Callback for random string validation.
StorageCopyTrait::replaceStorageContents protected static function Copy the configuration from one storage to another and remove stale items.
TestBase::$assertions protected property Assertions thrown in that test case.
TestBase::$configImporter protected property The config importer that can used in a test.
TestBase::$databasePrefix protected property The database prefix of this test run.
TestBase::$dieOnFail public property Whether to die in case any test assertion fails.
TestBase::$httpAuthCredentials protected property HTTP authentication credentials (&lt;username&gt;:&lt;password&gt;).
TestBase::$httpAuthMethod protected property HTTP authentication method (specified as a CURLAUTH_* constant).
TestBase::$originalConf protected property The original configuration (variables), if available.
TestBase::$originalConfig protected property The original configuration (variables).
TestBase::$originalConfigDirectories protected property The original configuration directories.
TestBase::$originalContainer protected property The original container.
TestBase::$originalFileDirectory protected property The original file directory, before it was changed for testing purposes.
TestBase::$originalLanguage protected property The original language.
TestBase::$originalPrefix protected property The original database prefix when running inside Simpletest.
TestBase::$originalSessionName protected property The name of the session cookie of the test-runner.
TestBase::$originalSettings protected property The settings array.
TestBase::$originalShutdownCallbacks protected property The original array of shutdown function callbacks. 1
TestBase::$originalUser protected property The original user, before testing began. 1
TestBase::$results public property Current results of this test case.
TestBase::$skipClasses protected property This class is skipped when looking for the source of an assertion.
TestBase::$timeLimit protected property Time limit for the test.
TestBase::$translationFilesDirectory protected property The translation file directory for the test environment.
TestBase::$verbose public property TRUE if verbose debugging is enabled.
TestBase::$verboseClassName protected property Safe class name for use in verbose output filenames.
TestBase::$verboseDirectory protected property Directory where verbose output files are put.
TestBase::$verboseDirectoryUrl protected property URL to the verbose output file directory.
TestBase::$verboseId protected property Incrementing identifier for verbose output filenames.
TestBase::assert protected function Internal helper: stores the assert.
TestBase::assertEqual protected function Check to see if two values are equal.
TestBase::assertErrorLogged protected function Asserts that a specific error has been logged to the PHP error log.
TestBase::assertFalse protected function Check to see if a value is false.
TestBase::assertIdentical protected function Check to see if two values are identical.
TestBase::assertIdenticalObject protected function Checks to see if two objects are identical.
TestBase::assertNoErrorsLogged protected function Asserts that no errors have been logged to the PHP error.log thus far.
TestBase::assertNotEqual protected function Check to see if two values are not equal.
TestBase::assertNotIdentical protected function Check to see if two values are not identical.
TestBase::assertNotNull protected function Check to see if a value is not NULL.
TestBase::assertNull protected function Check to see if a value is NULL.
TestBase::assertTrue protected function Check to see if a value is not false.
TestBase::checkRequirements protected function Checks the matching requirements for Test. 1
TestBase::checkTestHierarchyMismatch public function Fail the test if it belongs to a PHPUnit-based framework.
TestBase::config protected function Configuration accessor for tests. Returns non-overridden configuration.
TestBase::deleteAssert public static function Delete an assertion record by message ID.
TestBase::error protected function Fire an error assertion. 1
TestBase::errorHandler public function Handle errors during test runs.
TestBase::exceptionHandler protected function Handle exceptions.
TestBase::fail protected function Fire an assertion that is always negative.
TestBase::filePreDeleteCallback public static function Ensures test files are deletable.
TestBase::getAssertionCall protected function Cycles through backtrace until the first non-assertion method is found.
TestBase::getDatabasePrefix public function Gets the database prefix.
TestBase::getTempFilesDirectory public function Gets the temporary files directory.
TestBase::insertAssert Deprecated public static function Store an assertion from outside the testing context. 1
TestBase::pass protected function Fire an assertion that is always positive.
TestBase::prepareDatabasePrefix private function Generates a database prefix for running tests. Overrides TestSetupTrait::prepareDatabasePrefix
TestBase::prepareEnvironment private function Prepares the current environment for running the test.
TestBase::restoreEnvironment private function Cleans up the test environment and restores the original environment.
TestBase::run public function Run all tests in this class. 2
TestBase::settingsSet protected function Changes in memory settings.
TestBase::storeAssertion protected function Helper method to store an assertion record in the configured database. 1
TestBase::verbose protected function Logs a verbose message in a text file.
TestSetupTrait::$configSchemaCheckerExclusions protected static property An array of config object names that are excluded from schema checking.
TestSetupTrait::$container protected property The dependency injection container used in the test.
TestSetupTrait::$kernel protected property The DrupalKernel instance used in the test.
TestSetupTrait::$originalSite protected property The site directory of the original parent site.
TestSetupTrait::$privateFilesDirectory protected property The private file directory for the test environment.
TestSetupTrait::$publicFilesDirectory protected property The public file directory for the test environment.
TestSetupTrait::$siteDirectory protected property The site directory of this test run.
TestSetupTrait::$strictConfigSchema protected property Set to TRUE to strict check all configuration saved. 2
TestSetupTrait::$tempFilesDirectory protected property The temporary file directory for the test environment.
TestSetupTrait::$testId protected property The test run ID.
TestSetupTrait::changeDatabasePrefix protected function Changes the database connection to the prefixed one.
TestSetupTrait::getConfigSchemaExclusions protected function Gets the config schema exclusions for this test.
TestSetupTrait::getDatabaseConnection public static function Returns the database connection to the site running Simpletest.

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