Merge branch 'wip-MDL-39525-m25' of git://github.com/samhemelryk/moodle

This commit is contained in:
Eloy Lafuente (stronk7) 2013-05-07 21:28:09 +02:00
commit 52933ab087
3 changed files with 65 additions and 1 deletions

10
cache/admin.php vendored
View File

@ -210,7 +210,15 @@ if (!empty($action) && confirm_sesskey()) {
case 'purgedefinition': // Purge a specific definition.
$definition = required_param('definition', PARAM_SAFEPATH);
list($component, $area) = explode('/', $definition, 2);
cache_helper::purge_by_definition($component, $area);
$factory = cache_factory::instance();
$definition = $factory->create_definition($component, $area);
if ($definition->has_required_identifiers()) {
// We will have to purge the stores used by this definition.
cache_helper::purge_stores_used_by_definition($component, $area);
} else {
// Alrighty we can purge just the data belonging to this definition.
cache_helper::purge_by_definition($component, $area);
}
redirect($PAGE->url, get_string('purgedefinitionsuccess', 'cache'), 5);
break;

View File

@ -907,4 +907,13 @@ class cache_definition {
}
return join('/', $identifiers);
}
/**
* Returns true if this definition requires identifiers.
*
* @param bool
*/
public function has_required_identifiers() {
return (count($this->requireidentifiers) > 0);
}
}

View File

@ -1327,4 +1327,51 @@ class cache_phpunit_tests extends advanced_testcase {
$this->assertInstanceOf('cache_application', $cache);
$this->assertFalse($cache->get('test'));
}
/**
* Test purge routines.
*/
public function test_purge_routines() {
$instance = cache_config_phpunittest::instance(true);
$instance->phpunit_add_definition('phpunit/purge1', array(
'mode' => cache_store::MODE_APPLICATION,
'component' => 'phpunit',
'area' => 'purge1'
));
$instance->phpunit_add_definition('phpunit/purge2', array(
'mode' => cache_store::MODE_APPLICATION,
'component' => 'phpunit',
'area' => 'purge2',
'requireidentifiers' => array(
'id'
)
));
$factory = cache_factory::instance();
$definition = $factory->create_definition('phpunit', 'purge1');
$this->assertFalse($definition->has_required_identifiers());
$cache = $factory->create_cache($definition);
$this->assertInstanceOf('cache_application', $cache);
$this->assertTrue($cache->set('test', 'test'));
$this->assertTrue($cache->has('test'));
cache_helper::purge_by_definition('phpunit', 'purge1');
$this->assertFalse($cache->has('test'));
$factory = cache_factory::instance();
$definition = $factory->create_definition('phpunit', 'purge2');
$this->assertTrue($definition->has_required_identifiers());
$cache = $factory->create_cache($definition);
$this->assertInstanceOf('cache_application', $cache);
$this->assertTrue($cache->set('test', 'test'));
$this->assertTrue($cache->has('test'));
cache_helper::purge_stores_used_by_definition('phpunit', 'purge2');
$this->assertFalse($cache->has('test'));
try {
cache_helper::purge_by_definition('phpunit', 'purge2');
$this->fail('Should not be able to purge a definition required identifiers without providing them.');
} catch (coding_exception $ex) {
$this->assertContains('Identifier required for cache has not been provided', $ex->getMessage());
}
}
}