Index: modules/simpletest/tests/session.test
===================================================================
RCS file: modules/simpletest/tests/session.test
diff -N modules/simpletest/tests/session.test
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/tests/session.test	13 Aug 2008 18:06:25 -0000
@@ -0,0 +1,142 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Provides SimpleTests for core session handling functionality.
+ */
+
+class SessionTestCase extends DrupalWebTestCase {
+  /**
+   * Implementation of getInfo().
+   */
+  function getInfo() {
+    return array(
+      'name' => t('Session Tests'),
+      'description' => t('Drupal session handling tests.'),
+      'group' => t('Session')
+    );
+  }
+
+  /**
+   * Implementation of setUp().
+   */
+  function setUp() {
+    parent::setUp('session_test');
+  }
+
+  /**
+   * Implementation of tearDown().
+   */
+  function tearDown() {
+    parent::tearDown();
+  }
+
+  /**
+   * Tests for session_save_session().
+   */
+  function testSessionSaveSession() {
+    $this->assertTrue(session_save_session(), t('session_save_session() correctly returns TRUE when initially primed with a NULL argument.'));
+    $this->assertFalse(session_save_session(FALSE), t('session_save_session() correctly returns FALSE when disabling.'));
+    $this->assertFalse(session_save_session(), t('session_save_session() correctly returns FALSE when saving has been disabled.'));
+    $this->assertTrue(session_save_session(TRUE), t('session_save_session() correctly returns TRUE when enabling.'));
+    $this->assertTrue(session_save_session(), t('session_save_session() correctly returns TRUE when saving has been enabled.'));
+  }
+
+  /**
+   * Test data persistence via the session_test module callbacks. Also tests
+   * sess_count() since session data is already generated here.
+   */
+  function testDataPersistence() {
+    $user = $this->drupalCreateUser(array('access content'));
+    // Enable sessions
+    $this->_sessionReset($user->uid);
+
+    $this->drupalLogin($user);
+    $this->session_count_authenticated = $this->session_count ++;
+
+    $val_1 = $this->randomName();
+    $this->drupalGet('session-test/set/' . $val_1);
+    $this->assertText($val_1, t('The session value was stored.'));
+    $this->drupalGet('session-test/get');
+    $this->assertText($val_1, t('Session correctly returned the stored data for an authenticated user.'));
+
+    // Attempt to write over val_1. If session_save_session(FALSE) is working
+    // properly, val_1 will still be set.
+    $val_2 = $this->randomName();
+    $this->drupalGet('session-test/no-set/' . $val_2);
+    $this->assertText($val_2, t('The session value was correctly passed and not stored.'));
+    $this->drupalGet('session-test/get');
+    $this->assertText($val_1, t('Session data is not saved for session_save_session(FALSE).'));
+
+    // Switch browser cookie to anonymous user, then back to user 1
+    $this->_sessionReset();
+    $this->_sessionReset($user->uid);
+    $this->assertText($val_1, t('Session data persists through browser close.'));
+
+    // 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($val_1, t("After logout, previous user's session data is not available"));
+    
+
+    $val_3 = $this->randomName();
+    $this->drupalGet('session-test/set/' . $val_3);
+    $this->assertText($val_3, t('Session data stored for anonymous user.'));
+    $this->drupalGet('session-test/get');
+    $this->assertText($val_3, t('Session correctly returned the stored data for an anonymous user.'));
+
+    $val_4 = $this->randomName();
+    $this->drupalGet('session-test/no-set/' . $val_4);
+    $this->assertText($val_4, t('The session value was correctly passed and not stored.'));
+    $this->drupalGet('session-test/get');
+    $this->assertText($val_3, t('Session data is not saved for session_save_session(FALSE).'));
+
+    // 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($val_1, t('Session has persisted for an authenticated user after logging out and then back in.'));
+
+    // 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 ++;
+
+    // Perform sess_count tests here in order to use the session data already generated.
+    // test absolute count
+    $anonymous = sess_count(0, TRUE);
+    $authenticated = sess_count(0, FALSE);
+    $this->assertEqual($anonymous + $authenticated, $this->session_count, t('Correctly counted @count total sessions.', array('@count' => $this->session_count)));
+
+    // test anonymous count
+    $this->assertEqual($anonymous, $this->session_count_anonymous, t('Correctly counted @count anonymous sessions.', array('@count' => $anonymous)));
+
+    // test authenticated count
+    $this->assertEqual($authenticated, $this->session_count_authenticated, t('Correctly counted @count authenticated sessions.', array('@count' => $authenticated)));
+
+    // should return 0 sessions from 1 second from now
+    $this->assertEqual(sess_count(time() + 1), 0, t('Correctly returned 0 sessions newer than the current time.'));
+
+  }
+
+  /**
+   * Reset the cookie file to the proper user.
+   */
+  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.'));
+  }
+}
Index: modules/simpletest/tests/session_test.info
===================================================================
RCS file: modules/simpletest/tests/session_test.info
diff -N modules/simpletest/tests/session_test.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/tests/session_test.info	13 Aug 2008 18:06:25 -0000
@@ -0,0 +1,8 @@
+; $Id$
+name = "Session Test"
+description = "Support module for session data testing."
+package = Testing
+version = VERSION
+core = 7.x
+files[] = session_test.module
+hidden = TRUE
Index: modules/simpletest/tests/session_test.module
===================================================================
RCS file: modules/simpletest/tests/session_test.module
diff -N modules/simpletest/tests/session_test.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/tests/session_test.module	13 Aug 2008 18:06:25 -0000
@@ -0,0 +1,54 @@
+<?php
+// $Id$
+
+/**
+ * Implementation of hook_menu().
+ */
+function session_test_menu() {
+  $items['session-test/get'] = array(
+    'title' => t('Session Value'),
+    'page callback' => '_session_test_get',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/set/%'] = array(
+    'title' => t('Set Session Value'),
+    'page callback' => '_session_test_set',
+    'page arguments' => array(2),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/no-set/%'] = array(
+    'title' => t('Disabled Session Set Value'),
+    'page callback' => '_session_test_no_set',
+    'page arguments' => array(2),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Menu callback: Print the stored session value to the screen.
+ */
+function _session_test_get() {
+  return t('The current value of the stored session variable is: %val', array('%val' => $_SESSION['session_test_value']));
+}
+
+/**
+ * Menu callback: Store a value in session_test_value.
+ */
+function _session_test_set($value) {
+  $_SESSION['session_test_value'] = $value;
+  return t('The current value of the stored session variable has been set to %val', array('%val' => $value));
+}
+
+/**
+ * Menu callback: Turn off session saving and then try to save a value anyway.
+ */
+function _session_test_no_set($value) {
+  session_save_session(FALSE);
+  _session_test_set($value);
+  return t('session saving was disabled, and then %val was set', array('%val' => $value));
+}
