wrappedSessionHandler = $this->getMock('SessionHandlerInterface'); $this->sessionHandler = new WriteSafeSessionHandler($this->wrappedSessionHandler); } /** * Tests creating a WriteSafeSessionHandler with default arguments. * * @covers ::__construct * @covers ::isSessionWritable * @covers ::write */ public function testConstructWriteSafeSessionHandlerDefaultArgs() { $session_id = 'some-id'; $session_data = 'serialized-session-data'; $this->assertSame(TRUE, $this->sessionHandler->isSessionWritable()); // Writing should be enabled, return value passed to the caller by default. $this->wrappedSessionHandler->expects($this->at(0)) ->method('write') ->with($session_id, $session_data) ->will($this->returnValue(TRUE)); $this->wrappedSessionHandler->expects($this->at(1)) ->method('write') ->with($session_id, $session_data) ->will($this->returnValue(FALSE)); $result = $this->sessionHandler->write($session_id, $session_data); $this->assertSame(TRUE, $result); $result = $this->sessionHandler->write($session_id, $session_data); $this->assertSame(FALSE, $result); } /** * Tests creating a WriteSafeSessionHandler with session writing disabled. * * @covers ::__construct * @covers ::isSessionWritable * @covers ::write */ public function testConstructWriteSafeSessionHandlerDisableWriting() { $session_id = 'some-id'; $session_data = 'serialized-session-data'; // Disable writing upon construction. $this->sessionHandler = new WriteSafeSessionHandler($this->wrappedSessionHandler, FALSE); $this->assertSame(FALSE, $this->sessionHandler->isSessionWritable()); $result = $this->sessionHandler->write($session_id, $session_data); $this->assertSame(TRUE, $result); } /** * Tests using setSessionWritable to enable/disable session writing. * * @covers ::setSessionWritable * @covers ::write */ public function testSetSessionWritable() { $session_id = 'some-id'; $session_data = 'serialized-session-data'; $this->assertSame(TRUE, $this->sessionHandler->isSessionWritable()); // Disable writing after construction. $this->sessionHandler->setSessionWritable(FALSE); $this->assertSame(FALSE, $this->sessionHandler->isSessionWritable()); $this->sessionHandler = new WriteSafeSessionHandler($this->wrappedSessionHandler, FALSE); $this->assertSame(FALSE, $this->sessionHandler->isSessionWritable()); $result = $this->sessionHandler->write($session_id, $session_data); $this->assertSame(TRUE, $result); // Enable writing again. $this->sessionHandler->setSessionWritable(TRUE); $this->assertSame(TRUE, $this->sessionHandler->isSessionWritable()); // Writing should be enabled, return value passed to the caller by default. $this->wrappedSessionHandler->expects($this->at(0)) ->method('write') ->with($session_id, $session_data) ->will($this->returnValue(TRUE)); $this->wrappedSessionHandler->expects($this->at(1)) ->method('write') ->with($session_id, $session_data) ->will($this->returnValue(FALSE)); $result = $this->sessionHandler->write($session_id, $session_data); $this->assertSame(TRUE, $result); $result = $this->sessionHandler->write($session_id, $session_data); $this->assertSame(FALSE, $result); } /** * Tests that other invocations are passed unmodified to the wrapped handler. * * @covers ::setSessionWritable * @covers ::open * @covers ::read * @covers ::close * @covers ::destroy * @covers ::gc * @dataProvider providerTestOtherMethods */ public function testOtherMethods($method, $expected_result, $args) { $invocation = $this->wrappedSessionHandler->expects($this->exactly(2)) ->method($method) ->will($this->returnValue($expected_result)); // Set the parameter matcher. call_user_func_array([$invocation, 'with'], $args); // Test with writable session. $this->assertSame(TRUE, $this->sessionHandler->isSessionWritable()); $actual_result = call_user_func_array([$this->sessionHandler, $method], $args); $this->assertSame($expected_result, $actual_result); // Test with non-writable session. $this->sessionHandler->setSessionWritable(FALSE); $this->assertSame(FALSE, $this->sessionHandler->isSessionWritable()); $actual_result = call_user_func_array([$this->sessionHandler, $method], $args); $this->assertSame($expected_result, $actual_result); } /** * Provides test data for the other methods test. * * @return array * Test data. */ public function providerTestOtherMethods() { return [ ['open', TRUE, ['/some/path', 'some-session-id']], ['read', 'some-session-data', ['a-session-id']], ['close', TRUE, []], ['destroy', TRUE, ['old-session-id']], ['gc', TRUE, [42]], ]; } }