| 
<?php/**
 * This test script simulates a web browser to test session behavior.
 * Before run this script, you should activate an HTTP server
 * to listen to this folder under http://localhost:8000/
 * or your prefered configuration (bellow).
 * You can use PHP 5.4 native HTTP server by calling:
 * $ php -S localhost:8000
 */
 $listen = 'http://localhost:8000';
 $debug  = false;
 
 $test = new SmartSessionTest($listen, $debug);
 $test->run();
 exit(0);
 
 
 final class SmartSessionTest {
 
 /**
 * Host that are listen to HTTP requests.
 * @var string
 */
 private $host;
 
 /**
 * Debug flag.
 * @var bool
 */
 private $debug;
 
 /**
 * Runtime sessid for tests
 * @var string
 */
 private $sessid;
 
 /**
 * Pass counter
 * @var int
 */
 private $totalPass = 0;
 
 /**
 * Fail counter
 * @var int
 */
 private $totalFail = 0;
 
 /**
 * Constructor
 */
 public function __construct($host, $debug = false) {
 $this->host  = (string)$host;
 $this->debug = (bool)$debug;
 }
 
 /**
 * Run tests
 * @return void
 */
 public function run() {
 $this->testStatus();
 $this->testGet();
 $this->testDel();
 $this->testSet();
 $this->testClear();
 
 $this->testStatusWithSessid();
 $this->testGetWithSessid();
 $this->testDelWithSessid();
 $this->testClearWithSessid();
 
 fprintf(STDOUT, "Total pass: %d\n", $this->totalPass);
 fprintf(STDOUT, "Total fail: %d\n", $this->totalFail);
 }
 
 /**
 * Test status without sending session ID
 */
 public function testStatus() {
 $result = file_get_contents($this->host . '/testStatus.php');
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['open'] === false, __METHOD__, 'open must be false');
 $this->assertThat($json['exist'] === false, __METHOD__, 'exist must be false');
 }
 
 /**
 * Test to get a value without sending session ID
 */
 public function testGet() {
 $result = file_get_contents($this->host . '/testGet.php');
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['open'] === false, __METHOD__, 'open must be false');
 $this->assertThat($json['exist'] === false, __METHOD__, 'open must be false');
 $this->assertThat($json['value'] === null, __METHOD__, 'value must be null');
 }
 
 /**
 * Test to delete a value without sending session ID
 */
 public function testDel() {
 $result = file_get_contents($this->host . '/testDel.php');
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['hasBefore'] === false, __METHOD__, 'hasBefore must be false');
 $this->assertThat($json['hasAfter'] === false, __METHOD__, 'hasAfter must be false');
 $this->assertThat($json['open'] === false, __METHOD__, 'open must be false');
 $this->assertThat($json['exist'] === false, __METHOD__, 'exist must be false');
 $this->assertThat($json['value'] === null, __METHOD__, 'value must be null');
 }
 
 /**
 * Test to set a value without sending session ID
 */
 public function testSet() {
 $result = file_get_contents($this->host . '/testSet.php');
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['open'] === true, __METHOD__, 'open must be false');
 $this->assertThat($json['exist'] === true, __METHOD__, 'exist must be false');
 $this->assertThat($json['value'] === 123, __METHOD__, 'value must be 123');
 
 $this->sessid = $json['sessid'];
 }
 
 /**
 * Test to clear session without sending session ID
 */
 public function testClear() {
 $result = file_get_contents($this->host . '/testClear.php');
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['open'] === false, __METHOD__, 'open must be false');
 $this->assertThat($json['exist'] === false, __METHOD__, 'exist must be false');
 }
 
 /**
 * Test session status sending valid session ID
 */
 public function testStatusWithSessid() {
 $context = stream_context_create(
 array(
 'http' => array(
 'method' => 'GET',
 'header' => sprintf("Cookie: %s=%s\r\n", session_name(), urlencode($this->sessid))
 )
 )
 );
 
 $result = file_get_contents($this->host . '/testStatus.php', false, $context);
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['open'] === false, __METHOD__, 'open must be false');
 $this->assertThat($json['exist'] === true, __METHOD__, 'exist must be true');
 }
 
 /**
 * Test to get a value sending session ID
 */
 public function testGetWithSessid() {
 $context = stream_context_create(
 array(
 'http' => array(
 'method' => 'GET',
 'header' => sprintf("Cookie: %s=%s\r\n", session_name(), urlencode($this->sessid))
 )
 )
 );
 
 $result = file_get_contents($this->host . '/testGet.php', false, $context);
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['open'] === true, __METHOD__, 'open must be true');
 $this->assertThat($json['exist'] === true, __METHOD__, 'exist must be true');
 $this->assertThat($json['value'] === 123, __METHOD__, 'value must be 123');
 }
 
 /**
 * Test to delete a value sending session ID
 */
 public function testDelWithSessid() {
 $context = stream_context_create(
 array(
 'http' => array(
 'method' => 'GET',
 'header' => sprintf("Cookie: %s=%s\r\n", session_name(), urlencode($this->sessid))
 )
 )
 );
 
 $result = file_get_contents($this->host . '/testDel.php', false, $context);
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['hasBefore'] === true, __METHOD__, 'hasBefore must be true');
 $this->assertThat($json['hasAfter'] === false, __METHOD__, 'hasAfter must be false');
 $this->assertThat($json['open'] === true, __METHOD__, 'open must be true');
 $this->assertThat($json['exist'] === true, __METHOD__, 'exist must be true');
 $this->assertThat($json['value'] === null, __METHOD__, 'value must be null');
 }
 
 /**
 * Test to clear session sending session ID
 */
 public function testClearWithSessid() {
 $context = stream_context_create(
 array(
 'http' => array(
 'method' => 'GET',
 'header' => sprintf("Cookie: %s=%s\r\n", session_name(), urlencode($this->sessid))
 )
 )
 );
 
 $result = file_get_contents($this->host . '/testClear.php', false, $context);
 $json = json_decode($result, true);
 $this->printDebug($json);
 
 $this->assertThat($json['open'] === false, __METHOD__, 'open must be false');
 $this->assertThat($json['exist'] === false, __METHOD__, 'exist must be false');
 }
 
 /**
 * Simple assertion method
 * @param bool $pass
 * @param string $method
 * @param string $description
 */
 private function assertThat($pass, $method, $description) {
 static $counter = 0;
 $counter += 1;
 
 if ($pass === true) {
 fprintf(STDOUT, "Test %03d - %s: pass\n", $counter, $method);
 $this->totalPass += 1;
 } else {
 fprintf(STDERR, "Test %03d - %s: fail (%s)\n", $counter, $method, $description);
 $this->totalFail += 1;
 }
 }
 
 /**
 * Print debug if enabled
 * @param mixed $value
 * @return void
 */
 private function printDebug($value) {
 if ($this->debug) {
 fprintf(STDOUT, "Debug: %s\n", var_export($value, true));
 }
 }
 }
 |