From 1065e3805f04d7671ba3e29ff353733cc512db07 Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Sat, 16 Aug 2008 21:11:02 +0000
Subject: [PATCH] - Patch #276430 by jhedstrom, chx, boombatower et al: added
 tests for session handling.

---
 modules/simpletest/tests/session.test        | 136 +++++++++++++++++++
 modules/simpletest/tests/session_test.info   |   8 ++
 modules/simpletest/tests/session_test.module |  55 ++++++++
 3 files changed, 199 insertions(+)
 create mode 100644 modules/simpletest/tests/session.test
 create mode 100644 modules/simpletest/tests/session_test.info
 create mode 100644 modules/simpletest/tests/session_test.module

diff --git a/modules/simpletest/tests/session.test b/modules/simpletest/tests/session.test
new file mode 100644
index 000000000000..2e564e0bf3de
--- /dev/null
+++ b/modules/simpletest/tests/session.test
@@ -0,0 +1,136 @@
+<?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');
+  }
+
+  /**
+   * Tests for session_save_session().
+   */
+  function testSessionSaveSession() {
+    $this->assertTrue(session_save_session(), t('session_save_session() correctly returns TRUE when initially called with no arguments.'), t('Session'));
+    $this->assertFalse(session_save_session(FALSE), t('session_save_session() correctly returns FALSE when called with FALSE.'), t('Session'));
+    $this->assertFalse(session_save_session(), t('session_save_session() correctly returns FALSE when saving has been disabled.'), t('Session'));
+    $this->assertTrue(session_save_session(TRUE), t('session_save_session() correctly returns TRUE when called with TRUE.'), t('Session'));
+    $this->assertTrue(session_save_session(), t('session_save_session() correctly returns TRUE when saving has been enabled.'), t('Session'));
+  }
+
+  /**
+   * 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++;
+
+    $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'));
+
+    // Attempt to write over val_1. If session_save_session(FALSE) is working.
+    // 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');
+    $this->assertText($value_1, t('Session data is not saved for session_save_session(FALSE).'), t('Session'));
+
+    // 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');
+    $this->assertText($value_3, t('Session data is not saved for session_save_session(FALSE).'), t('Session'));
+
+    // 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++;
+
+    // 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)), 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.
+    $this->assertEqual(sess_count(time() + 1), 0, t('Correctly returned 0 sessions newer than the current time.'), t('Session'));
+
+  }
+
+  /**
+   * 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'));
+  }
+}
diff --git a/modules/simpletest/tests/session_test.info b/modules/simpletest/tests/session_test.info
new file mode 100644
index 000000000000..08034ffdd70e
--- /dev/null
+++ b/modules/simpletest/tests/session_test.info
@@ -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
diff --git a/modules/simpletest/tests/session_test.module b/modules/simpletest/tests/session_test.module
new file mode 100644
index 000000000000..a2f32422bf3f
--- /dev/null
+++ b/modules/simpletest/tests/session_test.module
@@ -0,0 +1,55 @@
+<?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;
+}
+
+/**
+ * Page callback, prints 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']));
+}
+
+/**
+ * Page callback, stores a value in $_SESSION['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: turns off session saving and then tries 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));
+}
-- 
GitLab