ConnectionInterface updates
Added write/end methods to Connections Created decorator class implementing ConnectionInterface
This commit is contained in:
parent
8404f911a3
commit
dbc40b821d
43
src/Ratchet/Resource/AbstractConnectionDecorator.php
Normal file
43
src/Ratchet/Resource/AbstractConnectionDecorator.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
namespace Ratchet\Resource;
|
||||||
|
|
||||||
|
abstract class AbstractConnectionDecorator implements ConnectionInterface {
|
||||||
|
/**
|
||||||
|
* @var ConnectionInterface
|
||||||
|
*/
|
||||||
|
protected $wrappedConn;
|
||||||
|
|
||||||
|
public function __construct(ConnectionInterface $conn) {
|
||||||
|
$this->wrappedConn = $conn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ConnectionInterface
|
||||||
|
*/
|
||||||
|
protected function getConnection() {
|
||||||
|
return $this->wrappedConn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __set($name, $value) {
|
||||||
|
$this->wrappedConn->$name = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @todo trigger_error() instead - Have it the same as if called from a POPO
|
||||||
|
*/
|
||||||
|
public function __get($name) {
|
||||||
|
if (!$this->__isset($name)) {
|
||||||
|
throw new \InvalidArgumentException("Attribute '{$name}' not found in Connection {$this->getID()}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->wrappedConn->$name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __isset($name) {
|
||||||
|
return isset($this->wrappedConn->$name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __unset($name) {
|
||||||
|
unset($this->wrappedConn->$name);
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Ratchet\Resource;
|
namespace Ratchet\Resource;
|
||||||
use Ratchet\Resource\Socket\SocketInterface;
|
use Ratchet\Resource\Socket\SocketInterface;
|
||||||
|
use Ratchet\Resource\Socket\BSDSocketException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A proxy object representing a connection to the application
|
* A proxy object representing a connection to the application
|
||||||
@ -16,6 +17,25 @@ class Connection implements ConnectionInterface {
|
|||||||
$this->_socket = $socket;
|
$this->_socket = $socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function write($data) {
|
||||||
|
return $this->_socket->deliver($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function end() {
|
||||||
|
try {
|
||||||
|
$this->_socket->shutdown();
|
||||||
|
} catch (BSDSocketException $e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_socket->close();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is here because I couldn't figure out a better/easier way to tie a connection and socket together for the server and commands
|
* This is here because I couldn't figure out a better/easier way to tie a connection and socket together for the server and commands
|
||||||
* Anyway, if you're here, it's not recommended you use this/directly interact with the socket in your App...
|
* Anyway, if you're here, it's not recommended you use this/directly interact with the socket in your App...
|
||||||
|
@ -4,4 +4,14 @@ namespace Ratchet\Resource;
|
|||||||
const VERSION = 'Ratchet/0.1';
|
const VERSION = 'Ratchet/0.1';
|
||||||
|
|
||||||
interface ConnectionInterface {
|
interface ConnectionInterface {
|
||||||
|
/**
|
||||||
|
* Send data to the connection
|
||||||
|
* @param string
|
||||||
|
*/
|
||||||
|
function write($data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* End the connection
|
||||||
|
*/
|
||||||
|
function end();
|
||||||
}
|
}
|
@ -157,7 +157,7 @@ class BSDSocket implements SocketInterface {
|
|||||||
$num = socket_select($read, $write, $except, $tv_sec, $tv_usec);
|
$num = socket_select($read, $write, $except, $tv_sec, $tv_usec);
|
||||||
|
|
||||||
if (false === $num) {
|
if (false === $num) {
|
||||||
throw new BSDException($this);
|
throw new BSDSocketException($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $num;
|
return $num;
|
||||||
|
@ -3,5 +3,18 @@ namespace Ratchet\Tests\Mock;
|
|||||||
use Ratchet\Resource\ConnectionInterface;
|
use Ratchet\Resource\ConnectionInterface;
|
||||||
|
|
||||||
class Connection implements ConnectionInterface {
|
class Connection implements ConnectionInterface {
|
||||||
|
public $last = array(
|
||||||
|
'write' => ''
|
||||||
|
, 'end' => false
|
||||||
|
);
|
||||||
|
|
||||||
public $remoteAddress = '127.0.0.1';
|
public $remoteAddress = '127.0.0.1';
|
||||||
|
|
||||||
|
public function write($data) {
|
||||||
|
$this->last[__FUNCTION__] = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function end() {
|
||||||
|
$this->last[__FUNCTION__] = true;
|
||||||
|
}
|
||||||
}
|
}
|
22
tests/Ratchet/Tests/Mock/ConnectionDecorator.php
Normal file
22
tests/Ratchet/Tests/Mock/ConnectionDecorator.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
namespace Ratchet\Tests\Mock;
|
||||||
|
use Ratchet\Resource\AbstractConnectionDecorator;
|
||||||
|
|
||||||
|
class ConnectionDecorator extends AbstractConnectionDecorator {
|
||||||
|
public $last = array(
|
||||||
|
'write' => ''
|
||||||
|
, 'end' => false
|
||||||
|
);
|
||||||
|
|
||||||
|
public function write($data) {
|
||||||
|
$this->last[__FUNCTION__] = $data;
|
||||||
|
|
||||||
|
$this->getConnection()->write($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function end() {
|
||||||
|
$this->last[__FUNCTION__] = true;
|
||||||
|
|
||||||
|
$this->getConnection()->end();
|
||||||
|
}
|
||||||
|
}
|
109
tests/Ratchet/Tests/Resource/AbstractConnectionDecoratorTest.php
Normal file
109
tests/Ratchet/Tests/Resource/AbstractConnectionDecoratorTest.php
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
<?php
|
||||||
|
namespace Ratchet\Tests\Resource;
|
||||||
|
use Ratchet\Tests\Mock\ConnectionDecorator;
|
||||||
|
use Ratchet\Tests\Mock\Connection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers Ratchet\Resource\AbstractConnectionDecorator
|
||||||
|
*/
|
||||||
|
class AbstractConnectionDecoratorTest extends \PHPUnit_Framework_TestCase {
|
||||||
|
protected $mock;
|
||||||
|
protected $l1;
|
||||||
|
protected $l2;
|
||||||
|
|
||||||
|
public function setUp() {
|
||||||
|
$this->mock = new Connection;
|
||||||
|
$this->l1 = new ConnectionDecorator($this->mock);
|
||||||
|
$this->l2 = new ConnectionDecorator($this->l1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGet() {
|
||||||
|
$var = 'hello';
|
||||||
|
$val = 'world';
|
||||||
|
|
||||||
|
$this->mock->$var = $val;
|
||||||
|
|
||||||
|
$this->assertEquals($val, $this->l1->$var);
|
||||||
|
$this->assertEquals($val, $this->l2->$var);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSet() {
|
||||||
|
$var = 'Chris';
|
||||||
|
$val = 'Boden';
|
||||||
|
|
||||||
|
$this->l1->$var = $val;
|
||||||
|
|
||||||
|
$this->assertEquals($val, $this->mock->$var);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetLevel2() {
|
||||||
|
$var = 'Try';
|
||||||
|
$val = 'Again';
|
||||||
|
|
||||||
|
$this->l2->$var = $val;
|
||||||
|
|
||||||
|
$this->assertEquals($val, $this->mock->$var);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testIsSetTrue() {
|
||||||
|
$var = 'PHP';
|
||||||
|
$val = 'Ratchet';
|
||||||
|
|
||||||
|
$this->mock->$var = $val;
|
||||||
|
|
||||||
|
$this->assertTrue(isset($this->l1->$var));
|
||||||
|
$this->assertTrue(isset($this->l2->$var));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testIsSetFalse() {
|
||||||
|
$var = 'herp';
|
||||||
|
$val = 'derp';
|
||||||
|
|
||||||
|
$this->assertFalse(isset($this->l1->$var));
|
||||||
|
$this->assertFalse(isset($this->l2->$var));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testUnset() {
|
||||||
|
$var = 'Flying';
|
||||||
|
$val = 'Monkey';
|
||||||
|
|
||||||
|
$this->mock->$var = $val;
|
||||||
|
unset($this->l1->$var);
|
||||||
|
|
||||||
|
$this->assertFalse(isset($this->mock->$var));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testUnsetLevel2() {
|
||||||
|
$var = 'Flying';
|
||||||
|
$val = 'Monkey';
|
||||||
|
|
||||||
|
$this->mock->$var = $val;
|
||||||
|
unset($this->l2->$var);
|
||||||
|
|
||||||
|
$this->assertFalse(isset($this->mock->$var));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetConnection() {
|
||||||
|
$class = new \ReflectionClass('\\Ratchet\\Resource\\AbstractConnectionDecorator');
|
||||||
|
$method = $class->getMethod('getConnection');
|
||||||
|
$method->setAccessible(true);
|
||||||
|
|
||||||
|
$conn = $method->invokeArgs($this->l1, array());
|
||||||
|
|
||||||
|
$this->assertSame($this->mock, $conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetConnectionLevel2() {
|
||||||
|
$class = new \ReflectionClass('\\Ratchet\\Resource\\AbstractConnectionDecorator');
|
||||||
|
$method = $class->getMethod('getConnection');
|
||||||
|
$method->setAccessible(true);
|
||||||
|
|
||||||
|
$conn = $method->invokeArgs($this->l2, array());
|
||||||
|
|
||||||
|
$this->assertSame($this->l1, $conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testWarningGettingNothing() {
|
||||||
|
$this->markTestSkipped('Functionality not in class yet');
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user