Skip to content

Commit

Permalink
Merge branch 'MDL-56273' of https://github.com/mr-russ/moodle
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewnicols committed Oct 31, 2016
2 parents 711e2ab + f9599c7 commit 42a372e
Show file tree
Hide file tree
Showing 21 changed files with 144 additions and 159 deletions.
9 changes: 9 additions & 0 deletions cache/classes/dummystore.php
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,15 @@ public static function initialise_test_instance(cache_definition $definition) {
return $cache;
}

/**
* Generates the appropriate configuration required for unit testing.
*
* @return array Array of unit test configuration data to be used by initialise().
*/
public static function unit_test_configuration() {
return [];
}

/**
* Returns the name of this instance.
* @return string
Expand Down
3 changes: 3 additions & 0 deletions cache/classes/factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,9 @@ public function create_store_from_config($name, array $details, cache_definition
if (!array_key_exists($name, $this->stores)) {
// Properties: name, plugin, configuration, class.
$class = $details['class'];
if (!$class::are_requirements_met()) {
return false;
}
$store = new $class($details['name'], $details['configuration']);
$this->stores[$name] = $store;
}
Expand Down
9 changes: 6 additions & 3 deletions cache/classes/helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -502,15 +502,18 @@ public static function purge_store($storename, cache_config $config = null) {
$store = $stores[$storename];
$class = $store['class'];


// We check are_requirements_met although we expect is_ready is going to check as well.
if (!$class::are_requirements_met()) {
return false;
}
// Found the store: is it ready?
/* @var cache_store $instance */
$instance = new $class($store['name'], $store['configuration']);
// We check are_requirements_met although we expect is_ready is going to check as well.
if (!$instance::are_requirements_met() || !$instance->is_ready()) {
if (!$instance->is_ready()) {
unset($instance);
return false;
}

foreach ($config->get_definitions_by_store($storename) as $id => $definition) {
$definition = cache_definition::load($id, $definition);
$definitioninstance = clone($instance);
Expand Down
24 changes: 3 additions & 21 deletions cache/classes/store.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,11 @@ public static function get_supported_modes(array $configuration = array());
public static function initialise_test_instance(cache_definition $definition);

/**
* Initialises a test instance for unit tests.
* Generates the appropriate configuration required for unit testing.
*
* This differs from initialise_test_instance in that it doesn't rely on interacting with the config table.
*
* @since 2.8
* @param cache_definition $definition
* @return cache_store|false
* @return array Array of unit test configuration data to be used by initialise().
*/
public static function initialise_unit_test_instance(cache_definition $definition);
public static function unit_test_configuration();
}

/**
Expand Down Expand Up @@ -369,20 +365,6 @@ public function create_clone(array $details = array()) {
return clone($this);
}

/**
* Initialises a test instance for unit tests.
*
* This differs from initialise_test_instance in that it doesn't rely on interacting with the config table.
* By default however it calls initialise_test_instance to support backwards compatibility.
*
* @since 2.8
* @param cache_definition $definition
* @return cache_store|false
*/
public static function initialise_unit_test_instance(cache_definition $definition) {
return static::initialise_test_instance($definition);
}

/**
* Can be overridden to return any warnings this store instance should make to the admin.
*
Expand Down
21 changes: 12 additions & 9 deletions cache/locallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -684,33 +684,36 @@ public static function get_store_instance_summaries() {
$locks = $instance->get_locks();
foreach ($stores as $name => $details) {
$class = $details['class'];
$store = new $class($details['name'], $details['configuration']);
$store = false;
if ($class::are_requirements_met()) {
$store = new $class($details['name'], $details['configuration']);
}
$lock = (isset($details['lock'])) ? $locks[$details['lock']] : $instance->get_default_lock();
$record = array(
'name' => $name,
'plugin' => $details['plugin'],
'default' => $details['default'],
'isready' => $store->is_ready(),
'isready' => $store ? $store->is_ready() : false,
'requirementsmet' => $class::are_requirements_met(),
'mappings' => 0,
'lock' => $lock,
'modes' => array(
cache_store::MODE_APPLICATION =>
($store->get_supported_modes($return) & cache_store::MODE_APPLICATION) == cache_store::MODE_APPLICATION,
($class::get_supported_modes($return) & cache_store::MODE_APPLICATION) == cache_store::MODE_APPLICATION,
cache_store::MODE_SESSION =>
($store->get_supported_modes($return) & cache_store::MODE_SESSION) == cache_store::MODE_SESSION,
($class::get_supported_modes($return) & cache_store::MODE_SESSION) == cache_store::MODE_SESSION,
cache_store::MODE_REQUEST =>
($store->get_supported_modes($return) & cache_store::MODE_REQUEST) == cache_store::MODE_REQUEST,
($class::get_supported_modes($return) & cache_store::MODE_REQUEST) == cache_store::MODE_REQUEST,
),
'supports' => array(
'multipleidentifiers' => $store->supports_multiple_identifiers(),
'dataguarantee' => $store->supports_data_guarantee(),
'nativettl' => $store->supports_native_ttl(),
'multipleidentifiers' => $store ? $store->supports_multiple_identifiers() : false,
'dataguarantee' => $store ? $store->supports_data_guarantee() : false,
'nativettl' => $store ? $store->supports_native_ttl() : false,
'nativelocking' => ($store instanceof cache_is_lockable),
'keyawareness' => ($store instanceof cache_is_key_aware),
'searchable' => ($store instanceof cache_is_searchable)
),
'warnings' => $store->get_warnings()
'warnings' => $store ? $store->get_warnings() : array()
);
if (empty($details['default'])) {
$return[$name] = $record;
Expand Down
31 changes: 16 additions & 15 deletions cache/stores/apcu/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -369,23 +369,12 @@ public function has_all(array $keys) {
}

/**
* Generates an instance of the cache store that can be used for testing.
* Generates the appropriate configuration required for unit testing.
*
* @param cache_definition $definition
* @return cachestore_apcu|false
* @return array Array of unit test configuration data to be used by initialise().
*/
public static function initialise_unit_test_instance(cache_definition $definition) {
if (!self::are_requirements_met()) {
return false;
}

$store = new cachestore_apcu('Test APCu', array('prefix' => 'phpunit'));
if (!$store->is_ready()) {
return false;
}
$store->initialise($definition);

return $store;
public static function unit_test_configuration() {
return array('prefix' => 'phpunit');
}

/**
Expand Down Expand Up @@ -416,4 +405,16 @@ public static function config_set_edit_form_data(moodleform $editform, array $co
}
$editform->set_data($data);
}

/**
* Returns true if this cache store instance is both suitable for testing, and ready for testing.
*
* Cache stores that support being used as the default store for unit and acceptance testing should
* override this function and return true if there requirements have been met.
*
* @return bool
*/
public static function ready_to_be_used_for_testing() {
return true;
}
}
10 changes: 7 additions & 3 deletions cache/stores/apcu/tests/apcu_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ public function setUp() {
*/
public function test_cross_application_interaction() {
$definition = cache_definition::load_adhoc(cache_store::MODE_APPLICATION, 'cachestore_apcu', 'phpunit_test');
$instance = cachestore_apcu::initialise_unit_test_instance($definition);
$instance = new cachestore_apcu('Test', cachestore_apcu::unit_test_configuration());
$instance->initialise($definition);

// Test purge with custom data.
$this->assertTrue($instance->set('test', 'monster'));
Expand All @@ -75,9 +76,12 @@ public function test_cross_application_interaction() {

public function test_different_caches_have_different_prefixes() {
$definition = cache_definition::load_adhoc(cache_store::MODE_APPLICATION, 'cachestore_apcu', 'phpunit_test');
$instance = cachestore_apcu::initialise_unit_test_instance($definition);
$instance = new cachestore_apcu('Test', cachestore_apcu::unit_test_configuration());
$instance->initialise($definition);

$definition2 = cache_definition::load_adhoc(cache_store::MODE_APPLICATION, 'cachestore_apcu', 'phpunit_test2');
$instance2 = cachestore_apcu::initialise_unit_test_instance($definition2);
$instance2 = new cachestore_apcu('Test', cachestore_apcu::unit_test_configuration());
$instance2->initialise($definition2);

$instance->set('test1', 1);
$this->assertFalse($instance2->get('test1'));
Expand Down
9 changes: 9 additions & 0 deletions cache/stores/file/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,15 @@ public static function initialise_test_instance(cache_definition $definition) {
return $cache;
}

/**
* Generates the appropriate configuration required for unit testing.
*
* @return array Array of unit test configuration data to be used by initialise().
*/
public static function unit_test_configuration() {
return array();
}

/**
* Writes your madness to a file.
*
Expand Down
22 changes: 7 additions & 15 deletions cache/stores/memcache/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -582,24 +582,16 @@ public static function initialise_test_instance(cache_definition $definition) {
}

/**
* Creates a test instance for unit tests if possible.
* @param cache_definition $definition
* @return bool|cachestore_memcache
* Generates the appropriate configuration required for unit testing.
*
* @return array Array of unit test configuration data to be used by initialise().
*/
public static function initialise_unit_test_instance(cache_definition $definition) {
if (!self::are_requirements_met()) {
return false;
}
public static function unit_test_configuration() {
// If the configuration is not defined correctly, return only the configuration know about.
if (!defined('TEST_CACHESTORE_MEMCACHE_TESTSERVERS')) {
return false;
return [];
}
$configuration = array();
$configuration['servers'] = explode("\n", TEST_CACHESTORE_MEMCACHE_TESTSERVERS);

$store = new cachestore_memcache('Test memcache', $configuration);
$store->initialise($definition);

return $store;
return ['servers' => explode("\n", TEST_CACHESTORE_MEMCACHE_TESTSERVERS)];
}

/**
Expand Down
3 changes: 2 additions & 1 deletion cache/stores/memcache/tests/memcache_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ public function test_valid_keys() {
$this->resetAfterTest(true);

$definition = cache_definition::load_adhoc(cache_store::MODE_APPLICATION, 'cachestore_memcache', 'phpunit_test');
$instance = cachestore_memcache::initialise_unit_test_instance($definition);
$instance = new cachestore_memcache('Memcache Test', cachestore_memcache::unit_test_configuration());
$instance->initialise($definition);

if (!$instance) { // Something prevented memcache store to be inited (extension, TEST_CACHESTORE_MEMCACHE_TESTSERVERS...).
$this->markTestSkipped();
Expand Down
23 changes: 7 additions & 16 deletions cache/stores/memcached/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -739,25 +739,16 @@ public static function initialise_test_instance(cache_definition $definition) {
}

/**
* Creates a test instance for unit tests if possible.
* @param cache_definition $definition
* @return bool|cachestore_memcached
* Generates the appropriate configuration required for unit testing.
*
* @return array Array of unit test configuration data to be used by initialise().
*/
public static function initialise_unit_test_instance(cache_definition $definition) {
if (!self::are_requirements_met()) {
return false;
}
public static function unit_test_configuration() {
// If the configuration is not defined correctly, return only the configuration know about.
if (!defined('TEST_CACHESTORE_MEMCACHED_TESTSERVERS')) {
return false;
return [];
}

$configuration = array();
$configuration['servers'] = explode("\n", TEST_CACHESTORE_MEMCACHED_TESTSERVERS);

$store = new cachestore_memcached('Test memcached', $configuration);
$store->initialise($definition);

return $store;
return ['servers' => explode("\n", TEST_CACHESTORE_MEMCACHED_TESTSERVERS)];
}

/**
Expand Down
6 changes: 4 additions & 2 deletions cache/stores/memcached/tests/memcached_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,11 @@ public function test_valid_keys() {
$this->resetAfterTest(true);

$definition = cache_definition::load_adhoc(cache_store::MODE_APPLICATION, 'cachestore_memcached', 'phpunit_test');
$instance = cachestore_memcached::initialise_unit_test_instance($definition);
$instance = new cachestore_memcached('Memcached Test', cachestore_memcached::unit_test_configuration());
$instance->initialise($definition);

if (!$instance) { // Something prevented memcached store to be inited (extension, TEST_CACHESTORE_MEMCACHED_TESTSERVERS...).
if (!$instance->is_ready()) {
// Something prevented memcached store to be inited (extension, TEST_CACHESTORE_MEMCACHED_TESTSERVERS...).
$this->markTestSkipped();
}

Expand Down
19 changes: 5 additions & 14 deletions cache/stores/mongodb/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -571,25 +571,16 @@ public static function initialise_test_instance(cache_definition $definition) {
* @param cache_definition $definition
* @return false
*/
public static function initialise_unit_test_instance(cache_definition $definition) {
if (!self::are_requirements_met()) {
return false;
}
if (!defined('TEST_CACHESTORE_MONGODB_TESTSERVER')) {
return false;
}

public static function unit_test_configuration() {
$configuration = array();
$configuration['servers'] = explode("\n", TEST_CACHESTORE_MONGODB_TESTSERVER);
$configuration['usesafe'] = 1;

$store = new cachestore_mongodb('Test mongodb', $configuration);
if (!$store->is_ready()) {
return false;
// If the configuration is not defined correctly, return only the configuration know about.
if (defined('TEST_CACHESTORE_MONGODB_TESTSERVER')) {
$configuration['servers'] = explode("\n", TEST_CACHESTORE_MONGODB_TESTSERVER);
}
$store->initialise($definition);

return $store;
return $configuration;
}

/**
Expand Down
5 changes: 3 additions & 2 deletions cache/stores/mongodb/tests/mongodb_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,10 @@ protected function get_class_name() {
public function test_collection_name() {
// This generates a definition that has a hash starting with a number. MDL-46208.
$definition = cache_definition::load_adhoc(cache_store::MODE_APPLICATION, 'cachestore_mongodb', 'abc');
$instance = cachestore_mongodb::initialise_unit_test_instance($definition);
$instance = new cachestore_mongodb('MongoDB_Test', cachestore_mongodb::unit_test_configuration());
$instance->initialise($definition);

if (!$instance) {
if (!$instance->is_ready()) {
$this->markTestSkipped();
}

Expand Down
8 changes: 8 additions & 0 deletions cache/stores/session/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,14 @@ public static function initialise_test_instance(cache_definition $definition) {
return $cache;
}

/**
* Generates the appropriate configuration required for unit testing.
*
* @return array Array of unit test configuration data to be used by initialise().
*/
public static function unit_test_configuration() {
return array();
}
/**
* Returns the name of this instance.
* @return string
Expand Down
9 changes: 9 additions & 0 deletions cache/stores/static/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,15 @@ public static function initialise_test_instance(cache_definition $definition) {
return $cache;
}

/**
* Generates the appropriate configuration required for unit testing.
*
* @return array Array of unit test configuration data to be used by initialise().
*/
public static function unit_test_configuration() {
return array();
}

/**
* Returns the name of this instance.
* @return string
Expand Down
6 changes: 4 additions & 2 deletions cache/tests/cache_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -1315,8 +1315,10 @@ public function test_disable() {

$configfile = $CFG->dataroot.'/muc/config.php';

// That's right, we're deleting the config file.
$this->assertTrue(@unlink($configfile));
// The config file will not exist yet as we've not done anything with the cache.
// reset_all_data removes the file and without a call to create a configuration it doesn't exist
// as yet.
$this->assertFileNotExists($configfile);

// Disable the cache
cache_phpunit_factory::phpunit_disable();
Expand Down
Loading

0 comments on commit 42a372e

Please sign in to comment.