Skip to content

Commit

Permalink
Merge branch 'MDL-64452-master-cachesession' of git://github.com/mudr…
Browse files Browse the repository at this point in the history
…d8mz/moodle
  • Loading branch information
abgreeve committed Feb 18, 2019
2 parents 45dc542 + ea43f6c commit 33f070f
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 4 deletions.
5 changes: 1 addition & 4 deletions cache/classes/loaders.php
Expand Up @@ -1712,6 +1712,7 @@ class cache_session extends cache {
public function __construct(cache_definition $definition, cache_store $store, $loader = null) {
// First up copy the loadeduserid to the current user id.
$this->currentuserid = self::$loadeduserid;
$this->set_session_id();
parent::__construct($definition, $store, $loader);

// This will trigger check tracked user. If this gets removed a call to that will need to be added here in its place.
Expand Down Expand Up @@ -1771,17 +1772,13 @@ protected function check_tracked_user() {
// Purge the data we have for the old user.
// This way we don't bloat the session.
$this->purge();
// Update the session id just in case!
$this->set_session_id();
}
self::$loadeduserid = $new;
$this->currentuserid = $new;
} else if ($new !== $this->currentuserid) {
// The current user matches the loaded user but not the user last used by this cache.
$this->purge_current_user();
$this->currentuserid = $new;
// Update the session id just in case!
$this->set_session_id();
}
}

Expand Down
47 changes: 47 additions & 0 deletions cache/tests/cache_test.php
Expand Up @@ -2327,4 +2327,51 @@ public function test_session_event_purge_same_second() {
$this->assertEquals('test data 2', $cache->get('testkey1'));
}

/**
* Test that values set in different sessions are stored with different key prefixes.
*/
public function test_session_distinct_storage_key() {
$this->resetAfterTest();

// Prepare a dummy session cache configuration.
$config = cache_config_testing::instance();
$config->phpunit_add_definition('phpunit/test_session_distinct_storage_key', array(
'mode' => cache_store::MODE_SESSION,
'component' => 'phpunit',
'area' => 'test_session_distinct_storage_key'
));

// First anonymous user's session cache.
cache_phpunit_session::phpunit_mockup_session_id('foo');
$this->setUser(0);
$cache1 = cache::make('phpunit', 'test_session_distinct_storage_key');

// Reset cache instances to emulate a new request.
cache_factory::instance()->reset_cache_instances();

// Another anonymous user's session cache.
cache_phpunit_session::phpunit_mockup_session_id('bar');
$this->setUser(0);
$cache2 = cache::make('phpunit', 'test_session_distinct_storage_key');

cache_factory::instance()->reset_cache_instances();

// Guest user's session cache.
cache_phpunit_session::phpunit_mockup_session_id('baz');
$this->setGuestUser();
$cache3 = cache::make('phpunit', 'test_session_distinct_storage_key');

cache_factory::instance()->reset_cache_instances();

// Same guest user's session cache but in another browser window.
cache_phpunit_session::phpunit_mockup_session_id('baz');
$this->setGuestUser();
$cache4 = cache::make('phpunit', 'test_session_distinct_storage_key');

// Assert that different PHP session implies different key prefix for storing values.
$this->assertNotEquals($cache1->phpunit_get_key_prefix(), $cache2->phpunit_get_key_prefix());

// Assert that same PHP session implies same key prefix for storing values.
$this->assertEquals($cache3->phpunit_get_key_prefix(), $cache4->phpunit_get_key_prefix());
}
}
28 changes: 28 additions & 0 deletions cache/tests/fixtures/lib.php
Expand Up @@ -465,6 +465,9 @@ public function phpunit_static_acceleration_purge() {
*/
class cache_phpunit_session extends cache_session {

/** @var Static member used for emulating the behaviour of session_id() during the tests. */
protected static $sessionidmockup = 'phpunitmockupsessionid';

/**
* Returns the class of the store immediately associated with this cache.
* @return string
Expand All @@ -480,6 +483,31 @@ public function phpunit_get_store_class() {
public function phpunit_get_store_implements() {
return class_implements($this->get_store());
}

/**
* Provide access to the {@link cache_session::get_key_prefix()} method.
*
* @return string
*/
public function phpunit_get_key_prefix() {
return $this->get_key_prefix();
}

/**
* Allows to inject the session identifier.
*
* @param string $sessionid
*/
public static function phpunit_mockup_session_id($sessionid) {
static::$sessionidmockup = $sessionid;
}

/**
* Override the parent behaviour so that it does not need the actual session_id() call.
*/
protected function set_session_id() {
$this->sessionid = static::$sessionidmockup;
}
}

/**
Expand Down

0 comments on commit 33f070f

Please sign in to comment.