MDL-46208 cachestore_mongo: fixed invalid collection name use
authorSam Hemelryk <sam@moodle.com>
Tue, 1 Jul 2014 03:40:28 +0000 (15:40 +1200)
committerSam Hemelryk <sam@moodle.com>
Thu, 3 Jul 2014 20:11:27 +0000 (08:11 +1200)
cache/classes/store.php
cache/stores/mongodb/lib.php
cache/stores/mongodb/tests/mongodb_test.php
cache/tests/fixtures/stores.php

index 22c20db..b5cfcc1 100644 (file)
@@ -356,13 +356,13 @@ abstract class cache_store implements cache_store_interface {
      * 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 compatability.
+     * 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 self::initialise_test_instance($definition);
+        return static::initialise_test_instance($definition);
     }
 }
index db8653f..4405da4 100644 (file)
@@ -204,7 +204,7 @@ class cachestore_mongodb extends cache_store implements cache_is_configurable {
             throw new coding_exception('This mongodb instance has already been initialised.');
         }
         $this->database = $this->connection->selectDB($this->databasename);
-        $this->definitionhash = $definition->generate_definition_hash();
+        $this->definitionhash = 'm'.$definition->generate_definition_hash();
         $this->collection = $this->database->selectCollection($this->definitionhash);
 
         $options = array('name' => 'idx_key');
@@ -578,6 +578,7 @@ class cachestore_mongodb extends cache_store implements cache_is_configurable {
 
         $configuration = array();
         $configuration['servers'] = explode("\n", TEST_CACHESTORE_MONGODB_TESTSERVER);
+        $configuration['usesafe'] = 1;
 
         $store = new cachestore_mongodb('Test mongodb', $configuration);
         $store->initialise($definition);
index 97bfb9d..5186175 100644 (file)
@@ -49,4 +49,26 @@ class cachestore_mongodb_test extends cachestore_tests {
     protected function get_class_name() {
         return 'cachestore_mongodb';
     }
+
+    /**
+     * A small additional test to make sure definitions that hash a hash starting with a number work OK
+     */
+    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);
+
+        if (!$instance) {
+            $this->markTestSkipped();
+        }
+
+        $this->assertTrue($instance->set(1, 'alpha'));
+        $this->assertTrue($instance->set(2, 'beta'));
+        $this->assertEquals('alpha', $instance->get(1));
+        $this->assertEquals('beta', $instance->get(2));
+        $this->assertEquals(array(
+            1 => 'alpha',
+            2 => 'beta'
+        ), $instance->get_many(array(1, 2)));
+    }
 }
\ No newline at end of file
index a350f6d..ee5f373 100644 (file)
@@ -54,7 +54,7 @@ abstract class cachestore_tests extends advanced_testcase {
         $modes = $class::get_supported_modes();
         if ($modes & cache_store::MODE_APPLICATION) {
             $definition = cache_definition::load_adhoc(cache_store::MODE_APPLICATION, $class, 'phpunit_test');
-            $instance = $class::initialise_test_instance($definition);
+            $instance = $class::initialise_unit_test_instance($definition);
             if (!$instance) {
                 $this->markTestSkipped('Could not test '.$class.'. No test instance configured for application caches.');
             } else {
@@ -63,7 +63,7 @@ abstract class cachestore_tests extends advanced_testcase {
         }
         if ($modes & cache_store::MODE_SESSION) {
             $definition = cache_definition::load_adhoc(cache_store::MODE_SESSION, $class, 'phpunit_test');
-            $instance = $class::initialise_test_instance($definition);
+            $instance = $class::initialise_unit_test_instance($definition);
             if (!$instance) {
                 $this->markTestSkipped('Could not test '.$class.'. No test instance configured for session caches.');
             } else {
@@ -72,7 +72,7 @@ abstract class cachestore_tests extends advanced_testcase {
         }
         if ($modes & cache_store::MODE_REQUEST) {
             $definition = cache_definition::load_adhoc(cache_store::MODE_REQUEST, $class, 'phpunit_test');
-            $instance = $class::initialise_test_instance($definition);
+            $instance = $class::initialise_unit_test_instance($definition);
             if (!$instance) {
                 $this->markTestSkipped('Could not test '.$class.'. No test instance configured for request caches.');
             } else {