You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
290 lines
12 KiB
290 lines
12 KiB
<?php
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* PHPunit tests for the cache API and in particular things in locallib.php
|
|
*
|
|
* This file is part of Moodle's cache API, affectionately called MUC.
|
|
* It contains the components that are requried in order to use caching.
|
|
*
|
|
* @package core
|
|
* @category cache
|
|
* @copyright 2012 Sam Hemelryk
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
// Include the necessary evils.
|
|
global $CFG;
|
|
require_once($CFG->dirroot.'/cache/locallib.php');
|
|
require_once($CFG->dirroot.'/cache/tests/fixtures/lib.php');
|
|
|
|
/**
|
|
* PHPunit tests for the cache API and in particular the cache config writer.
|
|
*
|
|
* @copyright 2012 Sam Hemelryk
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class core_cache_config_writer_testcase extends advanced_testcase {
|
|
|
|
/**
|
|
* Set things back to the default before each test.
|
|
*/
|
|
public function setUp() {
|
|
parent::setUp();
|
|
cache_factory::reset();
|
|
cache_config_testing::create_default_configuration();
|
|
}
|
|
|
|
/**
|
|
* Final task is to reset the cache system
|
|
*/
|
|
public static function tearDownAfterClass() {
|
|
parent::tearDownAfterClass();
|
|
cache_factory::reset();
|
|
}
|
|
|
|
/**
|
|
* Test getting an instance. Pretty basic.
|
|
*/
|
|
public function test_instance() {
|
|
$config = cache_config_writer::instance();
|
|
$this->assertInstanceOf('cache_config_writer', $config);
|
|
}
|
|
|
|
/**
|
|
* Test the default configuration.
|
|
*/
|
|
public function test_default_configuration() {
|
|
$config = cache_config_writer::instance();
|
|
|
|
// First check stores.
|
|
$stores = $config->get_all_stores();
|
|
$hasapplication = false;
|
|
$hassession = false;
|
|
$hasrequest = false;
|
|
foreach ($stores as $store) {
|
|
// Check the required keys.
|
|
$this->assertArrayHasKey('name', $store);
|
|
$this->assertArrayHasKey('plugin', $store);
|
|
$this->assertArrayHasKey('modes', $store);
|
|
$this->assertArrayHasKey('default', $store);
|
|
// Check the mode, we need at least one default store of each mode.
|
|
if (!empty($store['default'])) {
|
|
if ($store['modes'] & cache_store::MODE_APPLICATION) {
|
|
$hasapplication = true;
|
|
}
|
|
if ($store['modes'] & cache_store::MODE_SESSION) {
|
|
$hassession = true;
|
|
}
|
|
if ($store['modes'] & cache_store::MODE_REQUEST) {
|
|
$hasrequest = true;
|
|
}
|
|
}
|
|
}
|
|
$this->assertTrue($hasapplication, 'There is no default application cache store.');
|
|
$this->assertTrue($hassession, 'There is no default session cache store.');
|
|
$this->assertTrue($hasrequest, 'There is no default request cache store.');
|
|
|
|
// Next check the definitions.
|
|
$definitions = $config->get_definitions();
|
|
$eventinvalidation = false;
|
|
foreach ($definitions as $definition) {
|
|
// Check the required keys.
|
|
$this->assertArrayHasKey('mode', $definition);
|
|
$this->assertArrayHasKey('component', $definition);
|
|
$this->assertArrayHasKey('area', $definition);
|
|
if ($definition['component'] === 'core' && $definition['area'] === 'eventinvalidation') {
|
|
$eventinvalidation = true;
|
|
}
|
|
}
|
|
$this->assertTrue($eventinvalidation, 'Missing the event invalidation definition.');
|
|
|
|
// Next mode mappings
|
|
$mappings = $config->get_mode_mappings();
|
|
$hasapplication = false;
|
|
$hassession = false;
|
|
$hasrequest = false;
|
|
foreach ($mappings as $mode) {
|
|
// Check the required keys.
|
|
$this->assertArrayHasKey('mode', $mode);
|
|
$this->assertArrayHasKey('store', $mode);
|
|
|
|
if ($mode['mode'] === cache_store::MODE_APPLICATION) {
|
|
$hasapplication = true;
|
|
}
|
|
if ($mode['mode'] === cache_store::MODE_SESSION) {
|
|
$hassession = true;
|
|
}
|
|
if ($mode['mode'] === cache_store::MODE_REQUEST) {
|
|
$hasrequest = true;
|
|
}
|
|
}
|
|
$this->assertTrue($hasapplication, 'There is no mapping for the application mode.');
|
|
$this->assertTrue($hassession, 'There is no mapping for the session mode.');
|
|
$this->assertTrue($hasrequest, 'There is no mapping for the request mode.');
|
|
|
|
// Finally check config locks
|
|
$locks = $config->get_locks();
|
|
foreach ($locks as $lock) {
|
|
$this->assertArrayHasKey('name', $lock);
|
|
$this->assertArrayHasKey('type', $lock);
|
|
$this->assertArrayHasKey('default', $lock);
|
|
}
|
|
// There has to be at least the default lock.
|
|
$this->assertTrue(count($locks) > 0);
|
|
}
|
|
|
|
/**
|
|
* Test updating the definitions.
|
|
*/
|
|
public function test_update_definitions() {
|
|
$config = cache_config_writer::instance();
|
|
// Remove the definition.
|
|
$config->phpunit_remove_definition('core/string');
|
|
$definitions = $config->get_definitions();
|
|
// Check it is gone.
|
|
$this->assertFalse(array_key_exists('core/string', $definitions));
|
|
// Update definitions. This should re-add it.
|
|
cache_config_writer::update_definitions();
|
|
$definitions = $config->get_definitions();
|
|
// Check it is back again.
|
|
$this->assertTrue(array_key_exists('core/string', $definitions));
|
|
}
|
|
|
|
/**
|
|
* Test adding/editing/deleting store instances.
|
|
*/
|
|
public function test_add_edit_delete_plugin_instance() {
|
|
$config = cache_config_writer::instance();
|
|
$this->assertArrayNotHasKey('addplugintest', $config->get_all_stores());
|
|
$this->assertArrayNotHasKey('addplugintestwlock', $config->get_all_stores());
|
|
// Add a default file instance.
|
|
$config->add_store_instance('addplugintest', 'file');
|
|
|
|
cache_factory::reset();
|
|
$config = cache_config_writer::instance();
|
|
$this->assertArrayHasKey('addplugintest', $config->get_all_stores());
|
|
|
|
// Add a store with a lock described.
|
|
$config->add_store_instance('addplugintestwlock', 'file', array('lock' => 'default_file_lock'));
|
|
$this->assertArrayHasKey('addplugintestwlock', $config->get_all_stores());
|
|
|
|
$config->delete_store_instance('addplugintest');
|
|
$this->assertArrayNotHasKey('addplugintest', $config->get_all_stores());
|
|
$this->assertArrayHasKey('addplugintestwlock', $config->get_all_stores());
|
|
|
|
$config->delete_store_instance('addplugintestwlock');
|
|
$this->assertArrayNotHasKey('addplugintest', $config->get_all_stores());
|
|
$this->assertArrayNotHasKey('addplugintestwlock', $config->get_all_stores());
|
|
|
|
// Add a default file instance.
|
|
$config->add_store_instance('storeconfigtest', 'file', array('test' => 'a', 'one' => 'two'));
|
|
$stores = $config->get_all_stores();
|
|
$this->assertArrayHasKey('storeconfigtest', $stores);
|
|
$this->assertArrayHasKey('configuration', $stores['storeconfigtest']);
|
|
$this->assertArrayHasKey('test', $stores['storeconfigtest']['configuration']);
|
|
$this->assertArrayHasKey('one', $stores['storeconfigtest']['configuration']);
|
|
$this->assertEquals('a', $stores['storeconfigtest']['configuration']['test']);
|
|
$this->assertEquals('two', $stores['storeconfigtest']['configuration']['one']);
|
|
|
|
$config->edit_store_instance('storeconfigtest', 'file', array('test' => 'b', 'one' => 'three'));
|
|
$stores = $config->get_all_stores();
|
|
$this->assertArrayHasKey('storeconfigtest', $stores);
|
|
$this->assertArrayHasKey('configuration', $stores['storeconfigtest']);
|
|
$this->assertArrayHasKey('test', $stores['storeconfigtest']['configuration']);
|
|
$this->assertArrayHasKey('one', $stores['storeconfigtest']['configuration']);
|
|
$this->assertEquals('b', $stores['storeconfigtest']['configuration']['test']);
|
|
$this->assertEquals('three', $stores['storeconfigtest']['configuration']['one']);
|
|
|
|
$config->delete_store_instance('storeconfigtest');
|
|
|
|
try {
|
|
$config->delete_store_instance('default_application');
|
|
$this->fail('Default store deleted. This should not be possible!');
|
|
} catch (Exception $e) {
|
|
$this->assertInstanceOf('cache_exception', $e);
|
|
}
|
|
|
|
try {
|
|
$config->delete_store_instance('some_crazy_store');
|
|
$this->fail('You should not be able to delete a store that does not exist.');
|
|
} catch (Exception $e) {
|
|
$this->assertInstanceOf('cache_exception', $e);
|
|
}
|
|
|
|
try {
|
|
// Try with a plugin that does not exist.
|
|
$config->add_store_instance('storeconfigtest', 'shallowfail', array('test' => 'a', 'one' => 'two'));
|
|
$this->fail('You should not be able to add an instance of a store that does not exist.');
|
|
} catch (Exception $e) {
|
|
$this->assertInstanceOf('cache_exception', $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test setting some mode mappings.
|
|
*/
|
|
public function test_set_mode_mappings() {
|
|
$config = cache_config_writer::instance();
|
|
$this->assertTrue($config->add_store_instance('setmodetest', 'file'));
|
|
$this->assertTrue($config->set_mode_mappings(array(
|
|
cache_store::MODE_APPLICATION => array('setmodetest', 'default_application'),
|
|
cache_store::MODE_SESSION => array('default_session'),
|
|
cache_store::MODE_REQUEST => array('default_request'),
|
|
)));
|
|
$mappings = $config->get_mode_mappings();
|
|
$setmodetestfound = false;
|
|
foreach ($mappings as $mapping) {
|
|
if ($mapping['store'] == 'setmodetest' && $mapping['mode'] == cache_store::MODE_APPLICATION) {
|
|
$setmodetestfound = true;
|
|
}
|
|
}
|
|
$this->assertTrue($setmodetestfound, 'Set mapping did not work as expected.');
|
|
}
|
|
|
|
/**
|
|
* Test setting some definition mappings.
|
|
*/
|
|
public function test_set_definition_mappings() {
|
|
$config = cache_config_testing::instance(true);
|
|
$config->phpunit_add_definition('phpunit/testdefinition', array(
|
|
'mode' => cache_store::MODE_APPLICATION,
|
|
'component' => 'phpunit',
|
|
'area' => 'testdefinition'
|
|
));
|
|
|
|
$config = cache_config_writer::instance();
|
|
$this->assertTrue($config->add_store_instance('setdefinitiontest', 'file'));
|
|
$this->assertInternalType('array', $config->get_definition_by_id('phpunit/testdefinition'));
|
|
$config->set_definition_mappings('phpunit/testdefinition', array('setdefinitiontest', 'default_application'));
|
|
|
|
try {
|
|
$config->set_definition_mappings('phpunit/testdefinition', array('something that does not exist'));
|
|
$this->fail('You should not be able to set a mapping for a store that does not exist.');
|
|
} catch (Exception $e) {
|
|
$this->assertInstanceOf('coding_exception', $e);
|
|
}
|
|
|
|
try {
|
|
$config->set_definition_mappings('something/crazy', array('setdefinitiontest'));
|
|
$this->fail('You should not be able to set a mapping for a definition that does not exist.');
|
|
} catch (Exception $e) {
|
|
$this->assertInstanceOf('coding_exception', $e);
|
|
}
|
|
}
|
|
}
|
|
|