function SessionTestCase::testSessionWrite

7.x session.test SessionTestCase::testSessionWrite()

Test that sessions are only saved when necessary.

File

drupal-7.x/modules/simpletest/tests/session.test, line 184
Provides SimpleTests for core session handling functionality.

Class

SessionTestCase

Code

function testSessionWrite() {
  $user = $this->drupalCreateUser(array('access content'));
  $this->drupalLogin($user);

  $sql = 'SELECT u.access, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE u.uid = :uid';
  $times1 = db_query($sql, array(':uid' => $user->uid))->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->uid))->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->uid))->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->uid))->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.
  variable_set('session_write_interval', 0);
  $this->drupalGet('');
  $times5 = db_query($sql, array(':uid' => $user->uid))->fetchObject();
  $this->assertNotEqual($times5->access, $times4->access, 'Users table was updated.');
  $this->assertNotEqual($times5->timestamp, $times4->timestamp, 'Sessions table was updated.');
}