Newer
Older

Dries Buytaert
committed
<?php
// $Id$
/**
* @file
* Provides SimpleTests for core session handling functionality.
*/
class SessionTestCase extends DrupalWebTestCase {

Dries Buytaert
committed
protected $saved_cookie;

Dries Buytaert
committed
function getInfo() {
return array(
'name' => t('Session tests'),
'description' => t('Drupal session handling tests.'),
'group' => t('Session')
);
}
function setUp() {
parent::setUp('session_test');
}

Dries Buytaert
committed
/**
* Implementation of curlHeaderCallback().
*/
protected function curlHeaderCallback($ch, $header) {
// Look for a Set-Cookie header.
if (preg_match('/^Set-Cookie.+$/i', $header, $matches)) {
$this->saved_cookie = $header;
}
return parent::curlHeaderCallback($ch, $header);
}

Dries Buytaert
committed
/**

Dries Buytaert
committed
* Tests for drupal_save_session() and drupal_session_regenerate().

Dries Buytaert
committed
*/

Dries Buytaert
committed
function testSessionSaveRegenerate() {

Dries Buytaert
committed
$this->assertTrue(drupal_save_session(), t('drupal_save_session() correctly returns TRUE when initially called with no arguments.'), t('Session'));
$this->assertFalse(drupal_save_session(FALSE), t('drupal_save_session() correctly returns FALSE when called with FALSE.'), t('Session'));
$this->assertFalse(drupal_save_session(), t('drupal_save_session() correctly returns FALSE when saving has been disabled.'), t('Session'));
$this->assertTrue(drupal_save_session(TRUE), t('drupal_save_session() correctly returns TRUE when called with TRUE.'), t('Session'));
$this->assertTrue(drupal_save_session(), t('drupal_save_session() correctly returns TRUE when saving has been enabled.'), t('Session'));

Dries Buytaert
committed
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Test session hardening code from SA-2008-044.
$user = $this->drupalCreateUser(array('access content'));
// Enable sessions.
$this->sessionReset($user->uid);
// Make sure the session cookie is set as HttpOnly.
$this->drupalLogin($user);
$this->assertTrue(preg_match('/HttpOnly/i', $this->saved_cookie), t('Session cookie is set as HttpOnly.'));
$this->drupalLogout();
// Verify that the session is regenerated if a module calls exit
// in hook_user_login().
user_save($user, array('name' => 'session_test_user'));
$user->name = 'session_test_user';
$this->drupalGet('session-test/id');
$matches = array();
preg_match('/\s*session_id:(.*)\n/', $this->drupalGetContent(), $matches);
$this->assertTrue(!empty($matches[1]) , t('Found session ID before logging in.'));
$original_session = $matches[1];
// We cannot use $this->drupalLogin($user); because we exit in
// session_test_user_login() which breaks a normal assertion.
$edit = array(
'name' => $user->name,
'pass' => $user->pass_raw
);
$this->drupalPost('user', $edit, t('Log in'));
$this->drupalGet('node');
$pass = $this->assertText($user->name, t('Found name: %name', array('%name' => $user->name)), t('User login'));
$this->_logged_in = $pass;
$this->drupalGet('session-test/id');
$matches = array();
preg_match('/\s*session_id:(.*)\n/', $this->drupalGetContent(), $matches);
$this->assertTrue(!empty($matches[1]) , t('Found session ID after logging in.'));
$this->assertTrue($matches[1] != $original_session, t('Session ID changed after login.'));

Dries Buytaert
committed
}
/**
* Test data persistence via the session_test module callbacks. Also tests

Dries Buytaert
committed
* drupal_session_count() since session data is already generated here.

Dries Buytaert
committed
*/
function testDataPersistence() {
$user = $this->drupalCreateUser(array('access content'));
// Enable sessions.
$this->sessionReset($user->uid);
$this->drupalLogin($user);
$this->session_count_authenticated = $this->session_count++;
$value_1 = $this->randomName();
$this->drupalGet('session-test/set/' . $value_1);
$this->assertText($value_1, t('The session value was stored.'), t('Session'));
$this->drupalGet('session-test/get');
$this->assertText($value_1, t('Session correctly returned the stored data for an authenticated user.'), t('Session'));

Dries Buytaert
committed
// Attempt to write over val_1. If drupal_save_session(FALSE) is working.

Dries Buytaert
committed
// properly, val_1 will still be set.
$value_2 = $this->randomName();
$this->drupalGet('session-test/no-set/' . $value_2);
$this->assertText($value_2, t('The session value was correctly passed to session-test/no-set.'), t('Session'));
$this->drupalGet('session-test/get');

Dries Buytaert
committed
$this->assertText($value_1, t('Session data is not saved for drupal_save_session(FALSE).'), t('Session'));

Dries Buytaert
committed
// Switch browser cookie to anonymous user, then back to user 1.
$this->sessionReset();
$this->sessionReset($user->uid);
$this->assertText($value_1, t('Session data persists through browser close.'), t('Session'));
// Logout the user and make sure the stored value no longer persists.
$this->drupalLogout();
$this->sessionReset();
$this->drupalGet('session-test/get');
// Session count should go up since we're accessing anonymously now.
$this->session_count_anonymous = $this->session_count++;
$this->assertNoText($value_1, t("After logout, previous user's session data is not available."), t('Session'));
$value_3 = $this->randomName();
$this->drupalGet('session-test/set/' . $value_3);
$this->assertText($value_3, t('Session data stored for anonymous user.'), t('Session'));
$this->drupalGet('session-test/get');
$this->assertText($value_3, t('Session correctly returned the stored data for an anonymous user.'), t('Session'));
$value_4 = $this->randomName();
$this->drupalGet('session-test/no-set/' . $value_4);
$this->assertText($value_4, t('The session value was correctly passed to session-test/no-set.'), t('Session'));
$this->drupalGet('session-test/get');

Dries Buytaert
committed
$this->assertText($value_3, t('Session data is not saved for drupal_save_session(FALSE).'), t('Session'));

Dries Buytaert
committed
// Logout and get first user back in. Sessions shouldn't persist through
// logout, so the data won't be on the page.
$this->drupalLogin($user);
$this->sessionReset($user->uid);
$this->drupalGet('session-test/get');
$this->assertNoText($value_1, t('Session has persisted for an authenticated user after logging out and then back in.'), t('Session'));
// Logout and create another user.
$user2 = $this->drupalCreateUser(array('access content'));
$this->sessionReset($user2->uid);
$this->drupalLogin($user2);
$this->session_count_authenticated = $this->session_count++;

Dries Buytaert
committed
// Perform drupal_session_count tests here in order to use the session data already generated.

Dries Buytaert
committed
// Test absolute count.

Dries Buytaert
committed
$anonymous = drupal_session_count(0, TRUE);
$authenticated = drupal_session_count(0, FALSE);

Dries Buytaert
committed
$this->assertEqual($anonymous + $authenticated, $this->session_count, t('Correctly counted @count total sessions.', array('@count' => $this->session_count)), t('Session'));
// Test anonymous count.
$this->assertEqual($anonymous, $this->session_count_anonymous, t('Correctly counted @count anonymous sessions.', array('@count' => $anonymous)), t('Session'));
// Test authenticated count.
$this->assertEqual($authenticated, $this->session_count_authenticated, t('Correctly counted @count authenticated sessions.', array('@count' => $authenticated)), t('Session'));
// Should return 0 sessions from 1 second from now.

Dries Buytaert
committed
$this->assertEqual(drupal_session_count(time() + 1), 0, t('Correctly returned 0 sessions newer than the current time.'), t('Session'));

Dries Buytaert
committed
}
/**
* Reset the cookie file so that it refers to the specified user.
*
* @param $uid User id to set as the active session.
*/
function sessionReset($uid = 0) {
// Close the internal browser.
$this->curlClose();
// Change cookie file for user.
$this->cookie_file = file_directory_temp() . '/cookie.' . $uid . '.txt';
$this->curl_options[CURLOPT_COOKIEFILE] = $this->cookie_file;
$this->curl_options[CURLOPT_COOKIESESSION] = TRUE;
$this->drupalGet('session-test/get');
$this->assertResponse(200, t('Session test module is correctly enabled.'), t('Session'));
}
}