diff --git a/cache/disabledlib.php b/cache/disabledlib.php index 380a4748043..510d77a4fc4 100644 --- a/cache/disabledlib.php +++ b/cache/disabledlib.php @@ -294,8 +294,13 @@ class cache_factory_disabled extends cache_factory { $definition = $this->create_definition($component, $area); // The cachestore_static class returns true to all three 'SUPPORTS_' checks so it // can be used with all definitions. - $cache = new cachestore_static('TEMP:' . $component . '/' . $area); - $cache->initialise($definition); + $store = new cachestore_static('TEMP:' . $component . '/' . $area); + $store->initialise($definition); + // We need to use a cache loader wrapper rather than directly returning the store, + // or it wouldn't have support for versioning. The cache_application class is used + // (rather than cache_request which might make more sense logically) because it + // includes support for locking, which might be necessary for some caches. + $cache = new cache_application($definition, $store); self::$tempcaches[$key] = $cache; } return $cache; diff --git a/cache/tests/allow_temporary_caches_test.php b/cache/tests/allow_temporary_caches_test.php index 4fd950b9538..cd1879830f6 100644 --- a/cache/tests/allow_temporary_caches_test.php +++ b/cache/tests/allow_temporary_caches_test.php @@ -62,4 +62,38 @@ class allow_temporary_caches_test extends \advanced_testcase { $gecko = new allow_temporary_caches(); $this->assertTrue(allow_temporary_caches::is_allowed()); } + + /** + * Tests that the temporary caches actually work, including normal and versioned get and set. + */ + public function test_temporary_cache(): void { + $this->resetAfterTest(); + + // Disable the cache. + \cache_phpunit_factory::phpunit_disable(); + try { + // Try using the cache now - it returns false/null for everything. + $cache = \cache::make('core', 'coursemodinfo'); + $cache->set('frog', 'ribbit'); + $this->assertFalse($cache->get('frog')); + $cache->set_versioned('toad', 2, 'croak'); + $this->assertFalse($cache->get_versioned('toad', 2)); + + // But when we allow temporary caches, it should work as normal. + $allow = new allow_temporary_caches(); + $cache = \cache::make('core', 'coursemodinfo'); + $cache->set('frog', 'ribbit'); + $this->assertEquals('ribbit', $cache->get('frog')); + $cache->set_versioned('toad', 2, 'croak'); + $this->assertEquals('croak', $cache->get_versioned('toad', 2)); + + // Let's actually use modinfo, to check it works with locking too. + $course = $this->getDataGenerator()->create_course(); + get_fast_modinfo($course); + } finally { + // You have to do this after phpunit_disable or it breaks later tests. + \cache_factory::reset(); + \cache_factory::instance(true); + } + } }