You are here

autologout.test in Automated Logout 7.4

Same filename and directory in other branches
  1. 6.4 tests/autologout.test

Simpletest tests for autologout.

File

tests/autologout.test
View source
<?php

/**
 * @file
 * Simpletest tests for autologout.
 */

/**
 * Test session cleanup on login.
 */
class AutologoutTestSessionCleanupOnLogin extends DrupalWebTestCase {

  /**
   * A store references to different sessions.
   */
  protected $curlHandles = array();
  protected $loggedInUsers = array();

  /**
   * getInfo() returns properties that are displayed in the test selection form.
   */
  public static function getInfo() {
    return array(
      'name' => 'Autologout Session Cleanup Tests',
      'description' => 'Ensure that the autologout module cleans up stale sessions at login',
      'group' => 'Autologout',
    );
  }

  /**
   * setUp() performs any pre-requisite tasks that need to happen.
   */
  public function setUp() {

    // Enable any modules required for the test.
    parent::setUp('autologout');

    // Create and log in our privileged user.
    $this->privileged_user = $this
      ->drupalCreateUser(array(
      'access content',
      'administer site configuration',
      'access site reports',
      'access administration pages',
      'bypass node access',
      'administer content types',
      'administer nodes',
      'administer autologout',
      'change own logout threshold',
    ));
  }

  /**
   * Test that stale sessions are cleaned up at login.
   */
  public function testSessionCleanupAtLogin() {

    // For the purposes of the test, set the timeout periods to 5 seconds.
    variable_set('autologout_timeout', 5);
    variable_set('autologout_padding', 0);

    // Login in session 1.
    $this
      ->drupalLogin($this->privileged_user);

    // Check one active session.
    $sessions = $this
      ->getSessions($this->privileged_user);
    $this
      ->assertEqual(1, count($sessions), t('After initial login there is one active session'));

    // Switch sessions.
    $session1 = $this
      ->stashSession();

    // Login to session 2.
    $this
      ->drupalLogin($this->privileged_user);

    // Check two active sessions.
    $sessions = $this
      ->getSessions($this->privileged_user);
    $this
      ->assertEqual(2, count($sessions), t('After second login there is now two active session'));

    // Switch sessions.
    $session2 = $this
      ->stashSession();

    // Wait for sessions to expire.
    sleep(6);

    // Login to session 3.
    $this
      ->drupalLogin($this->privileged_user);

    // Check one active session.
    $sessions = $this
      ->getSessions($this->privileged_user);
    $this
      ->assertEqual(1, count($sessions), t('After third login, there is 1 active session, two stale sessions were cleaned up.'));

    // Switch back to session 1 and check no longer logged in.
    $this
      ->restoreSession($session1);
    $this
      ->drupalGet('node');
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in on session 1.'));
    $this
      ->closeAllSessions();
  }

  /**
   * Get active sessions for given user.
   */
  public function getSessions($account) {

    // Check there is one session in the sessions table.
    $result = db_select('sessions', 's')
      ->fields('s')
      ->condition('uid', $account->uid)
      ->orderBy('timestamp', 'DESC')
      ->execute();
    $sessions = array();
    foreach ($result as $session) {
      $sessions[] = $session;
    }
    return $sessions;
  }

  /**
   * Initialise a new unique session.
   *
   * @return string
   *   Unique identifier for the session just stored.
   *   It is the cookiefile name.
   */
  public function stashSession() {
    if (empty($this->cookieFile)) {

      // No session to stash.
      return;
    }

    // The session_id is the current cookieFile.
    $session_id = $this->cookieFile;
    $this->curlHandles[$session_id] = $this->curlHandle;
    $this->loggedInUsers[$session_id] = $this->loggedInUser;

    // Reset Curl.
    unset($this->curlHandle);
    $this->loggedInUser = FALSE;

    // Set a new unique cookie filename.
    do {
      $this->cookieFile = $this->public_files_directory . '/' . $this
        ->randomName() . '.jar';
    } while (isset($this->curlHandles[$this->cookieFile]));
    return $session_id;
  }

  /**
   * Restore a previously stashed session.
   *
   * @param string $session_id
   *   The session to restore as returned by stashSession();
   *   This is also the path to the cookie file.
   *
   * @return string
   *   The old session id that was replaced.
   */
  public function restoreSession($session_id) {
    $old_session_id = NULL;
    if (isset($this->curlHandle)) {
      $old_session_id = $this
        ->stashSession();
    }

    // Restore the specified session.
    $this->curlHandle = $this->curlHandles[$session_id];
    $this->cookieFile = $session_id;
    $this->loggedInUser = $this->loggedInUsers[$session_id];
    return $old_session_id;
  }

  /**
   * Close all stashed sessions and the current session.
   */
  public function closeAllSessions() {
    foreach ($this->curlHandles as $cookie_file => $curl_handle) {
      if (isset($curl_handle)) {
        curl_close($curl_handle);
      }
    }

    // Make the server forget all sessions.
    db_truncate('sessions')
      ->execute();
    $this->curlHandles = array();
    $this->loggedInUsers = array();
    $this->loggedInUser = FALSE;
    $this->cookieFile = $this->public_files_directory . '/' . $this
      ->randomName() . '.jar';
    unset($this->curlHandle);
  }

}

/**
 * Tests the autologout's features.
 */
class AutologoutTestCase extends DrupalWebTestCase {

  /**
   * User with admin rights.
   */
  protected $privileged_user;

  /**
   * getInfo() returns properties that are displayed in the test selection form.
   */
  public static function getInfo() {
    return array(
      'name' => 'Autologout Tests',
      'description' => 'Ensure that the autologout module functions as expected',
      'group' => 'Autologout',
    );
  }

  /**
   * setUp() performs any pre-requisite tasks that need to happen.
   */
  public function setUp() {

    // Enable any modules required for the test.
    parent::setUp('autologout');

    // Create and log in our privileged user.
    $this->privileged_user = $this
      ->drupalCreateUser(array(
      'access content',
      'administer site configuration',
      'access site reports',
      'access administration pages',
      'bypass node access',
      'administer content types',
      'administer nodes',
      'administer autologout',
      'change own logout threshold',
    ));
    $this
      ->drupalLogin($this->privileged_user);

    // For the purposes of the test, set the timeout periods to 10 seconds.
    variable_set('autologout_timeout', 10);
    variable_set('autologout_padding', 10);
  }

  /**
   * Test the precedence of the timeouts.
   *
   * This tests the following function:
   * _autologout_get_user_timeout();
   */
  public function testAutologoutTimeoutPrecedence() {
    $uid = $this->privileged_user->uid;

    // Default used if no role is specified.
    variable_set('autologout_timeout', 100);
    variable_set('autologout_role_logout', FALSE);
    variable_set('autologout_role_2', FALSE);
    variable_set('autologout_role_2_timeout', 200);
    $this
      ->assertAutotimeout($uid, 100, t('User timeout uses default if no other option set'));

    // Default used if role selected but no user's role is selected.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', FALSE);
    variable_set('autologout_role_2_timeout', 200);
    $this
      ->assertAutotimeout($uid, 100, t('User timeout uses default if  role timeouts are used but not one of the current user.'));

    // Role timeout is used if user's role is selected.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', TRUE);
    variable_set('autologout_role_2_timeout', 200);
    $this
      ->assertAutotimeout($uid, 200, t('User timeout uses role value'));

    // Role timeout is used if user's role is selected.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', TRUE);
    variable_set('autologout_role_2_timeout', 0);
    $this
      ->assertAutotimeout($uid, 0, t('User timeout uses role value of 0 if set for one of the user roles.'));

    // Role timeout used if personal timeout is empty string.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', TRUE);
    variable_set('autologout_role_2_timeout', 200);
    variable_set('autologout_user_' . $uid, '');
    $this
      ->assertAutotimeout($uid, 200, t('User timeout uses role value if personal value is the empty string.'));

    // Default timeout used if personal timeout is empty string.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', FALSE);
    variable_set('autologout_role_2_timeout', 200);
    variable_set('autologout_user_' . $uid, '');
    $this
      ->assertAutotimeout($uid, 100, t('User timeout uses default value if personal value is the empty string and no role timeout is specified.'));

    // Personal timeout used if set.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', TRUE);
    variable_set('autologout_role_2_timeout', 200);
    variable_set('autologout_user_' . $uid, 300);
    $this
      ->assertAutotimeout($uid, 300, t('User timeout uses default value if personal value is the empty string and no role timeout is specified.'));
  }

  /**
   * Test a user is logged out after the default timeout period.
   */
  public function testAutologoutDefaultTimeout() {

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for timeout period to elapse.
    sleep(20);

    // Check we are now logged out.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));
    $this
      ->assertText(t('You have been logged out due to inactivity.'), t('User sees inactivity message.'));
  }

  /**
   * Test a user is not logged out within the default timeout period.
   */
  public function testAutologoutNoLogoutInsideTimeout() {

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait within the timeout period.
    sleep(10);

    // Check we are still logged in.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));
    $this
      ->assertNoText(t('You have been logged out due to inactivity.'), t('User does not see inactivity message.'));
  }

  /**
   * Test the behaviour of the settings for submission.
   */
  public function testAutologoutSettingsForm() {
    $edit = array();

    // Set an initial (low) value of max_timeout.
    variable_set('autologout_max_timeout', 1000);

    // Test that it is possible to set a value above the max_timeout
    // threshold.
    $edit['autologout_timeout'] = 1500;
    $edit['autologout_max_timeout'] = 2000;
    $edit['autologout_padding'] = 60;
    $edit['autologout_role_logout'] = TRUE;
    $edit['autologout_role_2'] = TRUE;
    $edit['autologout_role_2_timeout'] = 1200;
    $edit['autologout_role_3'] = TRUE;
    $edit['autologout_role_3_timeout'] = 1200;
    $edit['autologout_role_4'] = TRUE;
    $edit['autologout_role_4_timeout'] = 1200;
    $edit['autologout_redirect_url'] = TRUE;
    $this
      ->drupalPost('admin/config/people/autologout', $edit, t('Save configuration'));
    $this
      ->assertText(t('The configuration options have been saved.'), t('Unable to save autologout config when modifying the max timeout.'));

    // Test that out of range values are picked up.
    $edit['autologout_timeout'] = 2500;
    $edit['autologout_max_timeout'] = 2000;
    $edit['autologout_padding'] = 60;
    $edit['autologout_role_logout'] = TRUE;
    $edit['autologout_role_2'] = TRUE;
    $edit['autologout_role_2_timeout'] = 1200;
    $edit['autologout_role_3'] = TRUE;
    $edit['autologout_role_3_timeout'] = 1200;
    $edit['autologout_role_4'] = TRUE;
    $edit['autologout_role_4_timeout'] = 1200;
    $edit['autologout_redirect_url'] = TRUE;
    $this
      ->drupalPost('admin/config/people/autologout', $edit, t('Save configuration'));
    $this
      ->assertNoText(t('The configuration options have been saved.'), t('Saved configuration despite the autologout_timeout being too large.'));

    // Test that out of range values are picked up.
    $edit['autologout_timeout'] = 1500;
    $edit['autologout_max_timeout'] = 2000;
    $edit['autologout_padding'] = 60;
    $edit['autologout_role_logout'] = TRUE;
    $edit['autologout_role_2'] = TRUE;
    $edit['autologout_role_2_timeout'] = 2500;
    $edit['autologout_role_3'] = TRUE;
    $edit['autologout_role_3_timeout'] = 1200;
    $edit['autologout_role_4'] = TRUE;
    $edit['autologout_role_4_timeout'] = 1200;
    $edit['autologout_redirect_url'] = TRUE;
    $this
      ->drupalPost('admin/config/people/autologout', $edit, t('Save configuration'));
    $this
      ->assertNoText(t('The configuration options have been saved.'), t('Saved configuration despite a role timeout being too large.'));

    // Test that role timeouts are not validated for
    // disabled roles.
    $edit['autologout_timeout'] = 1500;
    $edit['autologout_max_timeout'] = 2000;
    $edit['autologout_padding'] = 60;
    $edit['autologout_role_logout'] = TRUE;
    $edit['autologout_role_2'] = FALSE;
    $edit['autologout_role_2_timeout'] = 4000;
    $edit['autologout_role_3'] = TRUE;
    $edit['autologout_role_3_timeout'] = 1200;
    $edit['autologout_role_4'] = FALSE;
    $edit['autologout_role_4_timeout'] = 1200;
    $edit['autologout_redirect_url'] = TRUE;
    $this
      ->drupalPost('admin/config/people/autologout', $edit, t('Save configuration'));
    $this
      ->assertText(t('The configuration options have been saved.'), t('Unable to save autologout due to out of range role timeout for a role which is not enabled..'));
  }

  /**
   * Test enforce logout on admin page settings.
   */
  public function testAutlogoutOfAdminPages() {

    // Set an admin page path.
    $_GET['q'] = 'admin';

    // Check if user will be kept logged in on admin paths with enforce dsabled.
    variable_set('autologout_enforce_admin', FALSE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), TRUE, t('Autologout does logout of admin pages without enforce on admin checked.'));

    // Check if user will not be kept logged in on admin paths if enforce enabled.
    variable_set('autologout_enforce_admin', TRUE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('Autologout does not logout of admin pages with enforce on admin not checked.'));

    // Set a non admin page path.
    $_GET['q'] = 'node';
    variable_set('autologout_enforce_admin', FALSE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('autologout_autologout_refresh_only() returns FALSE on non admin page when enforce is disabled.'));
    variable_set('autologout_enforce_admin', TRUE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('autologout_autologout_refresh_only() returns FALSE on non admin page when enforce is enabled.'));
  }

  /**
   * Test a user is logged out and denied access to admin pages.
   */
  public function testAutologoutDefaultTimeoutAccessDeniedToAdmin() {

    // Enforce auto logout of admin pages.
    variable_set('autologout_enforce_admin', TRUE);

    // Check that the user can access the page after login.
    $this
      ->drupalGet('admin/reports/status');
    $this
      ->assertResponse(200, t('Admin page is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));
    $this
      ->assertText(t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation."), t('User can access elements of the admin page.'));

    // Wait for timeout period to elapse.
    sleep(20);

    // Check we are now logged out.
    $this
      ->drupalGet('admin/reports/status');
    $this
      ->assertResponse(403, t('Admin page returns 403 access denied.'));
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));
    $this
      ->assertNoText(t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation."), t('User cannot access elements of the admin page.'));
    $this
      ->assertText(t('You have been logged out due to inactivity.'), t('User sees inactivity message.'));
  }

  /**
   * Test integration with the remember me module.
   *
   * Users who checked remember_me on login should never be logged out.
   */
  public function testNoAutologoutWithRememberMe() {

    // Set the remember_me module data bit to TRUE.
    $this->privileged_user->data['remember_me'] = TRUE;
    user_save($this->privileged_user);

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for timeout period to elapse.
    sleep(20);

    // Check we are still logged in.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in after timeout with remember_me on.'));
  }

  /**
   * Assert the timeout for a particular user.
   *
   * @param int $uid
   *   User uid to assert the timeout for.
   * @param int $expected_timeout
   *   The expected timeout.
   * @param string $message
   *   The test message
   * @param string $group
   *   The test grouping
   */
  public function assertAutotimeout($uid, $expected_timeout, $message = '', $group = '') {
    return $this
      ->assertEqual(_autologout_get_user_timeout($uid), $expected_timeout, $message, $group);
  }

}

/**
 * Test the Autologout ajax endpoints.
 */
class AutologoutAjaxTestCase extends DrupalWebTestCase {

  /**
   * User with admin rights.
   */
  protected $privileged_user;

  /**
   * getInfo() returns properties that are displayed in the test selection form.
   */
  public static function getInfo() {
    return array(
      'name' => 'Autologout Ajax Tests',
      'description' => 'Ensure the AJAX endpoints work as expected',
      'group' => 'Autologout',
    );
  }

  /**
   * setUp() performs any pre-requisite tasks that need to happen.
   */
  public function setUp() {

    // Enable any modules required for the test.
    parent::setUp('autologout');

    // Create and log in our privileged user.
    $this->privileged_user = $this
      ->drupalCreateUser(array(
      'access content',
      'administer site configuration',
      'access site reports',
      'access administration pages',
      'bypass node access',
      'administer content types',
      'administer nodes',
      'administer autologout',
      'change own logout threshold',
    ));
    $this
      ->drupalLogin($this->privileged_user);
  }

  /**
   * Test ajax logout callbacks work as expected.
   */
  public function testAutologoutByAjax() {
    variable_set('autologout_timeout', 100);
    variable_set('autologout_padding', 10);

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Test the time remaining callback works as expected.
    $result = $this
      ->drupalGet('autologout_ajax_get_time_left');
    $this
      ->assertResponse(200, t('autologout_ajax_get_time_left is accessible when logged in'));
    $result = json_decode($result);
    $this
      ->assertEqual('insert', $result[1]->command, t('autologout_ajax_get_time_left returns an insert command for adding the jstimer onto the page'));
    $this
      ->assertEqual('#timer', $result[1]->selector, t('autologout_ajax_get_time_left specifies the #timer selector.'));
    $this
      ->assert(!empty($result[2]->settings->time) && is_int($result[2]->settings->time) && $result[2]->settings->time > 0, t('autologout_ajax_get_time_left returns the remaining time as a positive integer'));

    // Test that ajax logout works as expected.
    $json_string = $this
      ->drupalGet('autologout_ahah_logout');
    $this
      ->assertResponse(200, t('autologout_ahah_logout is accessible when logged in'));

    // Check we are now logged out.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));

    // Check further get time remaining requests return access denied.
    $result = $this
      ->drupalGet('autologout_ajax_get_time_left');
    $result = json_decode($result);
    $this
      ->assertEqual($result[1]->command, 'alert', t('When logged out, autologout_ajax_get_time_left returns the normal Drupal ajax alert.'));

    // Check further logout requests result in access denied.
    $this
      ->drupalGet('autologout_ahah_logout');
    $this
      ->assertResponse(403, t('autologout_ahah logout is not accessible when logged out.'));
  }

  /**
   * Test ajax stay logged in callbacks work as expected.
   */
  public function testStayloggedInByAjax() {
    variable_set('autologout_timeout', 20);
    variable_set('autologout_padding', 5);

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Sleep for half the timeout.
    sleep(14);

    // Test that ajax stay logged in works.
    $result = $this
      ->drupalGet('autologout_ahah_set_last');
    $this
      ->assertResponse(200, t('autologout_ahah_set_last is accessible when logged in.'));
    $result = json_decode($result);
    $this
      ->assertEqual('insert', $result[1]->command, t('autologout_ajax_set_last returns an insert command for adding the jstimer onto the page'));
    $this
      ->assertEqual('#timer', $result[1]->selector, t('autologout_ajax_set_last specifies the #timer selector.'));

    // Sleep for half the timeout again.
    sleep(14);

    // Check we are still logged in.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Logout.
    $this
      ->drupalGet('autologout_ahah_logout');
    $this
      ->assertResponse(200, t('autologout_ahah_logout is accessible when logged in.'));

    // Check further requests to set last result in 403.
    $result = $this
      ->drupalGet('autologout_ahah_set_last');
    $result = json_decode($result);
    $this
      ->assertEqual($result[1]->command, 'alert', t('When logged out, autologout_ajax_set_last returns the normal Drupal ajax alert.'));
  }

}

/**
 * Tests the autologout's features.
 */
class AutoLogoutByRoleTestCase extends DrupalWebTestCase {

  /**
   * User with admin rights.
   */
  protected $user;

  /**
   * A role for the user.
   */
  protected $role;

  /**
   * getInfo() returns properties that are displayed in the test selection form.
   */
  public static function getInfo() {
    return array(
      'name' => 'Autologout Tests by role',
      'description' => 'Ensure that the auto logout module functions as expected for a normal (non admin) user with a role',
      'group' => 'Autologout',
    );
  }

  /**
   * setUp() performs any pre-requisite tasks that need to happen.
   */
  public function setUp() {

    // Enable any modules required for the test.
    parent::setUp('autologout');

    // Create and log in our privileged user.
    $this->user = $this
      ->drupalCreateUser(array(
      'access content',
    ));
    $this->role = (object) array(
      'name' => 'test user role',
    );
    user_role_save($this->role);
    $this->user->roles[$this->role->rid] = $this->role->name;
    user_save($this->user);
    $this
      ->drupalLogin($this->user);

    // Set the timeout period to 5 seconds.
    variable_set('autologout_padding', 5);
  }

  /**
   * Check the role timeout has precedence over the basic timeout.
   */
  public function testAutologoutTimeoutByRoleWhenRoleTimeoutIsLessThanStandard() {

    // Standard logout time is 60 seconds.
    variable_set("autologout_timeout", '60');

    // Enable role based logouts.
    variable_set("autologout_role_logout", '1');

    // Role logout time is set to 10 seconds.
    variable_set("autologout_role_{$this->role->rid}", '1');
    variable_set("autologout_role_{$this->role->rid}_timeout", '10');
    $user_timeout = _autologout_get_user_timeout($this->user->uid);
    $roles = _autologout_get_role_timeout();
    $this
      ->assertEqual($user_timeout, 10, "The users timeout {$user_timeout} is equal to their role timeout of 10");

    // Check that the user can access the page after login.
    $this
      ->drupalGet('/');
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for timeout period to elapse.
    sleep(16);

    // Check we are now logged out.
    $this
      ->drupalGet('/');
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));
    $this
      ->assertText(t('You have been logged out due to inactivity.'), t('User sees inactivity message.'));
  }

  /**
   * Check the role timeout has precedence over the basic timeout.
   */
  public function testAutoLogoutTimeoutByRoleWhenRoleTimeoutIsGreaterThanStandard() {

    // Standard logout time is 10 seconds.
    variable_set("autologout_timeout", '10');

    // Enable role based logouts.
    variable_set("autologout_role_logout", '1');

    // Role logout time is set to 15 seconds.
    variable_set("autologout_role_{$this->role->rid}", '1');
    variable_set("autologout_role_{$this->role->rid}_timeout", '15');
    $user_timeout = _autologout_get_user_timeout($this->user->uid);
    $this
      ->assertEqual($user_timeout, 15, "The users timeout {$user_timeout} is equal to their role timeout of 15");

    // Check that the user can access the page after initial login.
    $this
      ->drupalGet('/');
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for the standard timeout period to elapse.
    sleep(16);

    // Check that the user is still logged in.
    $this
      ->drupalGet('/');
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for the role timeout period to elapse.
    sleep(21);

    // Check we are now logged out.
    $this
      ->drupalGet('/');
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));
    $this
      ->assertText(t('You have been logged out due to inactivity.'), t('User sees inactivity message.'));
  }

  /**
   * Check the role timeout prescendence works when multiple roles have timeouts.
   */
  public function testAutoLogoutTimeoutByRoleWhenAuthenticatedRoleHasATimeoutAuthenticatedIsLargerThanRole() {

    // Standard logout time is 60 seconds.
    variable_set("autologout_timeout", '60');

    // Enable role based logouts.
    variable_set("autologout_role_logout", '1');

    // Role logout time is set to 10 seconds.
    variable_set("autologout_role_{$this->role->rid}", '1');
    variable_set("autologout_role_{$this->role->rid}_timeout", '10');

    // Authenticated role has its own logout at 20 seconds.
    $authenticated_role = user_role_load_by_name('authenticated user');
    variable_set("autologout_role_{$authenticated_role->rid}", '1');
    variable_set("autologout_role_{$authenticated_role->rid}_timeout", '20');
    $user_timeout = _autologout_get_user_timeout($this->user->uid);
    $this
      ->assertEqual($user_timeout, 10, "The users timeout {$user_timeout} is equal to their role timeout of 10");

    // Check that the user can access the page after initial login.
    $this
      ->drupalGet('/');
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for the role timeout period to elapse.
    sleep(16);

    // Check we are now logged out.
    $this
      ->drupalGet('/');
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));
    $this
      ->assertText(t('You have been logged out due to inactivity.'), t('User sees inactivity message.'));
  }

  /**
   * Check the role timeout prescendence works when multiple roles have timeouts.
   */
  public function testAutoLogoutTimeoutByRoleWhenAuthenticatedRoleHasATimeoutAuthenticatedIsSmallerThanRole() {

    // Standard logout time is 60 seconds.
    variable_set("autologout_timeout", '60');

    // Enable role based logouts.
    variable_set("autologout_role_logout", '1');

    // Role logout time is set to 20 seconds.
    variable_set("autologout_role_{$this->role->rid}", '1');
    variable_set("autologout_role_{$this->role->rid}_timeout", '20');

    // Authenticated role has its own logout at 10 seconds.
    $authenticated_role = user_role_load_by_name('authenticated user');
    variable_set("autologout_role_{$authenticated_role->rid}", '1');
    variable_set("autologout_role_{$authenticated_role->rid}_timeout", '10');
    $user_timeout = _autologout_get_user_timeout($this->user->uid);
    $this
      ->assertEqual($user_timeout, 10, "The users timeout {$user_timeout} is equal to the authenticated timeout of 10");

    // Check that the user can access the page after initial login.
    $this
      ->drupalGet('/');
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for the authenticated timeout period to elapse.
    sleep(16);

    // Check we are now logged out.
    $this
      ->drupalGet('/');
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));
    $this
      ->assertText(t('You have been logged out due to inactivity.'), t('User sees inactivity message.'));
  }

}

Classes

Namesort descending Description
AutologoutAjaxTestCase Test the Autologout ajax endpoints.
AutoLogoutByRoleTestCase Tests the autologout's features.
AutologoutTestCase Tests the autologout's features.
AutologoutTestSessionCleanupOnLogin Test session cleanup on login.