Skip to content

Commit

Permalink
If session can not be opened, destroy first (#67)
Browse files Browse the repository at this point in the history
* Correct typehint, closes #45

* Implement session destruction when failure to start
Closes #66
  • Loading branch information
g105b committed Apr 10, 2020
1 parent 69b9da9 commit 512f10d
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 20 deletions.
26 changes: 17 additions & 9 deletions src/Session.php
Expand Up @@ -36,15 +36,23 @@ public function __construct(
$config["save_path"] ?? self::DEFAULT_SESSION_PATH
);
$sessionName = $config["name"] ?? self::DEFAULT_SESSION_NAME;
session_start([
"save_path" => $sessionPath,
"name" => $sessionName,
"cookie_lifetime" => $config["cookie_lifetime"] ?? self::DEFAULT_SESSION_LIFETIME,
"cookie_path" => $config["cookie_path"] ?? self::DEFAULT_COOKIE_PATH,
"cookie_domain" => $config["cookie_domain"] ?? self::DEFAULT_SESSION_DOMAIN,
"cookie_secure" => $config["cookie_secure"] ?? self::DEFAULT_SESSION_SECURE,
"cookie_httponly" => $config["cookie_httponly"] ?? self::DEFAULT_SESSION_HTTPONLY,
]);

do {
$success = @session_start([
"save_path" => $sessionPath,
"name" => $sessionName,
"cookie_lifetime" => $config["cookie_lifetime"] ?? self::DEFAULT_SESSION_LIFETIME,
"cookie_path" => $config["cookie_path"] ?? self::DEFAULT_COOKIE_PATH,
"cookie_domain" => $config["cookie_domain"] ?? self::DEFAULT_SESSION_DOMAIN,
"cookie_secure" => $config["cookie_secure"] ?? self::DEFAULT_SESSION_SECURE,
"cookie_httponly" => $config["cookie_httponly"] ?? self::DEFAULT_SESSION_HTTPONLY,
]);

if(!$success) {
session_destroy();
}
}
while(!$success);

$this->sessionHandler->open($sessionPath, $sessionName);
$this->store = $this->readSessionData() ?: null;
Expand Down
1 change: 1 addition & 0 deletions test/unit/Helper/FunctionMocker.php
Expand Up @@ -3,6 +3,7 @@

class FunctionMocker {
public static $mockCalls = [];
public static $callState = [];

public static function mock(string $functionName) {
self::$mockCalls[$functionName] = [];
Expand Down
13 changes: 13 additions & 0 deletions test/unit/Helper/FunctionOverride/session_destroy.php
@@ -0,0 +1,13 @@
<?php
namespace Gt\Session;

use Gt\Session\Test\Helper\FunctionMocker;

function session_destroy() {
if(FunctionMocker::$callState["session_start__fail"]) {
unset(FunctionMocker::$callState["session_start__fail"]);
}

FunctionMocker::$mockCalls["session_destroy"] []= func_get_args();
return true;
}
11 changes: 10 additions & 1 deletion test/unit/Helper/FunctionOverride/session_start.php
@@ -1,5 +1,14 @@
<?php
namespace Gt\Session;

use Gt\Session\Test\Helper\FunctionMocker;

function session_start() {
\Gt\Session\Test\Helper\FunctionMocker::$mockCalls["session_start"] []= func_get_args();
FunctionMocker::$mockCalls["session_start"] []= func_get_args();

if(FunctionMocker::$callState["session_start__fail"]) {
return false;
}

return true;
}
47 changes: 38 additions & 9 deletions test/unit/SessionTest.php
Expand Up @@ -7,6 +7,7 @@
use Gt\Session\Test\Helper\DataProvider\StringProvider;
use Gt\Session\Test\Helper\FunctionMocker;
use Gt\Session\Test\Helper\DataProvider\KeyValuePairProvider;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

class SessionTest extends TestCase {
Expand All @@ -16,14 +17,17 @@ class SessionTest extends TestCase {

public function setUp():void {
FunctionMocker::mock("session_start");
FunctionMocker::mock("session_id");
FunctionMocker::mock("session_destroy");
}

public function testSessionStarts():void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();

self::assertEmpty(FunctionMocker::$mockCalls["session_start"]);
$session = new Session($handler);
new Session($handler);
self::assertCount(
1,
FunctionMocker::$mockCalls["session_start"]
Expand All @@ -34,10 +38,11 @@ public function testSessionStarts():void {
* @dataProvider data_randomConfig
*/
public function testSessionStartsWithConfig(array $config):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();

$session = new Session($handler ,$config);
new Session($handler ,$config);
$sessionStartParameter = FunctionMocker::$mockCalls["session_start"][0][0];

foreach($config as $key => $value) {
Expand All @@ -49,7 +54,19 @@ public function testSessionStartsWithConfig(array $config):void {
}
}

/** @dataProvider data_randomConfig */
public function testSessionStartDestroysFailedSession(array $config):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();

FunctionMocker::$callState["session_start__fail"] = true;
new Session($handler, $config);
self::assertCount(1, FunctionMocker::$mockCalls["session_destroy"]);
}

public function testWriteSessionDataCalled() {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$handler->expects($this->exactly(2))
Expand All @@ -64,6 +81,7 @@ public function testWriteSessionDataCalled() {
* @dataProvider data_randomString
*/
public function testGetReturnsNull(string $randomString):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand All @@ -74,6 +92,7 @@ public function testGetReturnsNull(string $randomString):void {
* @@dataProvider data_randomKeyValuePairs
*/
public function testSetGet(array $keyValuePairs):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand All @@ -91,6 +110,7 @@ public function testSetGet(array $keyValuePairs):void {
* @dataProvider data_randomKeyValuePairs
*/
public function testSetGetNamespaced(array $keyValuePairs):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand Down Expand Up @@ -118,14 +138,15 @@ public function testSetGetNamespaced(array $keyValuePairs):void {
* @dataProvider data_randomKeyValuePairs
*/
public function testSetGetNamespacedSameParentNamespace(array $keyValuePairs):void {
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);

$parentNamespace = implode(".", [
uniqid("namespace1-"),
uniqid("namespace2-"),
]);
$parentNamespace = implode(".", [
uniqid("namespace1-"),
uniqid("namespace2-"),
]);

foreach($keyValuePairs as $key => $value) {
$newKey = implode(".", [
Expand All @@ -149,6 +170,7 @@ public function testSetGetNamespacedSameParentNamespace(array $keyValuePairs):vo
* @@dataProvider data_randomKeyValuePairs
*/
public function testSetGetNotExistsOtherKey(array $keyValuePairs):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand Down Expand Up @@ -179,6 +201,7 @@ public function testSetGetNotExistsOtherKey(array $keyValuePairs):void {
* @dataProvider data_randomKeyValuePairs
*/
public function testContains(array $keyValuePairs):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand All @@ -196,6 +219,7 @@ public function testContains(array $keyValuePairs):void {
* @dataProvider data_randomKeyValuePairs
*/
public function testNotContains(array $keyValuePairs):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand All @@ -213,6 +237,7 @@ public function testNotContains(array $keyValuePairs):void {
* @dataProvider data_randomKeyValuePairs
*/
public function testRemove(array $keyValuePairs):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand All @@ -236,6 +261,7 @@ public function testRemove(array $keyValuePairs):void {
* @dataProvider data_randomKeyValuePairs
*/
public function testNamespaceKeyIsRemovedFromSession(array $keyValuePairs):void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand Down Expand Up @@ -279,6 +305,7 @@ public function testNamespaceKeyIsRemovedFromSession(array $keyValuePairs):void
* @dataProvider data_randomKeyValuePairs
*/
public function testNamespaceKeyIsRemovedFromStore(array $keyValuePairs): void {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand Down Expand Up @@ -313,6 +340,7 @@ public function testNamespaceKeyIsRemovedFromStore(array $keyValuePairs): void {
* @dataProvider data_randomKeyValuePairs
*/
public function testRemoveNamespace(array $keyValuePairs) {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand Down Expand Up @@ -355,6 +383,7 @@ public function testRemoveNamespace(array $keyValuePairs) {
* @dataProvider data_randomKeyValuePairs
*/
public function testRemoveSiblingNamespace(array $keyValuePairs) {
/** @var Handler|MockObject $handler */
$handler = $this->getMockBuilder(Handler::class)
->getMock();
$session = new Session($handler);
Expand Down
2 changes: 1 addition & 1 deletion test/unit/phpunit.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<phpunit colors="true">
<testsuites>
<testsuite>
<testsuite name="main">
<directory suffix="Test.php">.</directory>
</testsuite>
</testsuites>
Expand Down

0 comments on commit 512f10d

Please sign in to comment.