You are here

function SessionTest::testSessionWrite in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/system/src/Tests/Session/SessionTest.php \Drupal\system\Tests\Session\SessionTest::testSessionWrite()

Test that sessions are only saved when necessary.

File

core/modules/system/src/Tests/Session/SessionTest.php, line 218
Contains \Drupal\system\Tests\Session\SessionTest.

Class

SessionTest
Drupal session handling tests.

Namespace

Drupal\system\Tests\Session

Code

function testSessionWrite() {
  $user = $this
    ->drupalCreateUser(array());
  $this
    ->drupalLogin($user);
  $sql = 'SELECT u.access, s.timestamp FROM {users_field_data} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE u.uid = :uid';
  $times1 = db_query($sql, array(
    ':uid' => $user
      ->id(),
  ))
    ->fetchObject();

  // Before every request we sleep one second to make sure that if the session
  // is saved, its timestamp will change.
  // Modify the session.
  sleep(1);
  $this
    ->drupalGet('session-test/set/foo');
  $times2 = db_query($sql, array(
    ':uid' => $user
      ->id(),
  ))
    ->fetchObject();
  $this
    ->assertEqual($times2->access, $times1->access, 'Users table was not updated.');
  $this
    ->assertNotEqual($times2->timestamp, $times1->timestamp, 'Sessions table was updated.');

  // Write the same value again, i.e. do not modify the session.
  sleep(1);
  $this
    ->drupalGet('session-test/set/foo');
  $times3 = db_query($sql, array(
    ':uid' => $user
      ->id(),
  ))
    ->fetchObject();
  $this
    ->assertEqual($times3->access, $times1->access, 'Users table was not updated.');
  $this
    ->assertEqual($times3->timestamp, $times2->timestamp, 'Sessions table was not updated.');

  // Do not change the session.
  sleep(1);
  $this
    ->drupalGet('');
  $times4 = db_query($sql, array(
    ':uid' => $user
      ->id(),
  ))
    ->fetchObject();
  $this
    ->assertEqual($times4->access, $times3->access, 'Users table was not updated.');
  $this
    ->assertEqual($times4->timestamp, $times3->timestamp, 'Sessions table was not updated.');

  // Force updating of users and sessions table once per second.
  $this
    ->settingsSet('session_write_interval', 0);

  // Write that value also into the test settings.php file.
  $settings['settings']['session_write_interval'] = (object) array(
    'value' => 0,
    'required' => TRUE,
  );
  $this
    ->writeSettings($settings);
  $this
    ->drupalGet('');
  $times5 = db_query($sql, array(
    ':uid' => $user
      ->id(),
  ))
    ->fetchObject();
  $this
    ->assertNotEqual($times5->access, $times4->access, 'Users table was updated.');
  $this
    ->assertNotEqual($times5->timestamp, $times4->timestamp, 'Sessions table was updated.');
}