Changed attempt to use decorator pattern for everything to chain of command pattern

This commit is contained in:
Chris Boden 2011-09-05 19:39:37 -04:00
parent 30ce6c0386
commit 9bc0cbce25
11 changed files with 96 additions and 94 deletions

View File

@ -1,15 +0,0 @@
<?php
namespace Ratchet;
interface ApplicationInterface {
/**
* @return string
*/
function getName();
function onConnect();
function onMessage();
function onClose();
}

View File

@ -1,8 +1,8 @@
<?php <?php
namespace Ratchet\Protocol; namespace Ratchet\Protocol;
use Ratchet\ServerInterface; use Ratchet\ReceiverInterface;
interface ProtocolInterface extends ServerInterface { interface ProtocolInterface extends ReceiverInterface {
/** /**
* @return Array * @return Array
*/ */

View File

@ -0,0 +1,34 @@
<?php
namespace Ratchet\Protocol;
class WebSocket implements ProtocolInterface {
/**
* @return Array
*/
public static function getDefaultConfig() {
return Array(
'domain' => AF_INET
, 'type' => SOCK_STREAM
, 'protocol' => SOL_TCP
, 'options' => Array(
SOL_SOCKET => Array(SO_REUSEADDR => 1)
)
);
}
/**
* @return string
*/
function getName() {
return __CLASS__;
}
function handleConnect() {
}
function handleMessage() {
}
function handleClose() {
}
}

View File

@ -1,32 +0,0 @@
<?php
namespace Ratchet\Protocol\WebSocket;
use Ratchet\ServerInterface;
use Ratchet\Protocol\ProtocolInterface;
use Ratchet\ApplicationInterface;
class Server implements ProtocolInterface {
protected $_server = null;
public function __construct(ServerInterface $server) {
$this->_server = $server;
}
/**
* @return Array
*/
public static function getDefaultConfig() {
return Array(
'domain' => AF_INET
, 'type' => SOCK_STREAM
, 'protocol' => SOL_TCP
, 'options' => Array(
SOL_SOCKET => Array(SO_REUSEADDR => 1)
)
);
}
public function attatchApplication(ApplicationInterface $app) {}
public function run($address = '127.0.0.1', $port = 1025) {
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace Ratchet;
interface ReceiverInterface {
/**
* @return string
*/
function getName();
function handleConnect();
function handleMessage();
function handleClose();
}

View File

@ -4,9 +4,9 @@ use Ratchet\Protocol\ProtocolInterface;
class Server implements ServerInterface { class Server implements ServerInterface {
protected $_master = null; protected $_master = null;
protected $_app = null;
protected $_debug = false; protected $_debug = false;
protected $_receivers = Array();
protected $_connections = Array(); protected $_connections = Array();
/** /**
@ -18,8 +18,8 @@ class Server implements ServerInterface {
$this->_debug = (boolean)$debug; $this->_debug = (boolean)$debug;
} }
public function attatchApplication(ApplicationInterface $app) { public function attatchReceiver(ReceiverInterface $receiver) {
$this->_app = $app; $this->_receivers[spl_object_hash($receiver)] = $receiver;
} }
/* /*
@ -28,8 +28,8 @@ class Server implements ServerInterface {
* @throws Ratchet\Exception * @throws Ratchet\Exception
*/ */
public function run($address = '127.0.0.1', $port = 1025) { public function run($address = '127.0.0.1', $port = 1025) {
if (!($this->_app instanceof ApplicationInterface)) { if (count($this->_receivers) == 0) {
throw new \RuntimeException("No application has been bound to the server"); throw new \RuntimeException("No receiver has been attatched to the server");
} }
set_time_limit(0); set_time_limit(0);

View File

@ -2,7 +2,7 @@
namespace Ratchet; namespace Ratchet;
interface ServerInterface { interface ServerInterface {
function attatchApplication(ApplicationInterface $app); function attatchReceiver(ReceiverInterface $receiver);
function run($address = '127.0.0.1', $port = 1025); function run($address = '127.0.0.1', $port = 1025);
} }

View File

@ -1,18 +1,18 @@
<?php <?php
namespace Ratchet\Tests\Mock; namespace Ratchet\Tests\Mock;
use Ratchet\ApplicationInterface; use Ratchet\ReceiverInterface;
class Application implements ApplicationInterface { class Application implements ReceiverInterface {
public function getName() { public function getName() {
return 'mock_application'; return 'mock_application';
} }
public function onConnect() { public function handleConnect() {
} }
public function onMessage() { public function handleMessage() {
} }
public function onClose() { public function handleClose() {
} }
} }

View File

@ -1,30 +0,0 @@
<?php
namespace Ratchet\Tests\Protocol\WebSocket;
use Ratchet\Server;
use Ratchet\Protocol\WebSocket\Server as WebServer;
use Ratchet\Tests\Mock\Socket;
/**
* @covers Ratchet\Protocol\WebSocket\Server
*/
class ServerTest extends \PHPUnit_Framework_TestCase {
protected $_server;
public function setUp() {
$this->_server = new WebServer(new Server(new Socket()));
}
public function testServerImplementsServerInterface() {
$constraint = $this->isInstanceOf('\\Ratchet\\ServerInterface');
$this->assertThat($this->_server, $constraint);
}
public function testServerImplementsProtocolInterface() {
$constraint = $this->isInstanceOf('\\Ratchet\\Protocol\ProtocolInterface');
$this->assertThat($this->_server, $constraint);
}
public function testGetConfigReturnsArray() {
$this->assertInternalType('array', $this->_server->getDefaultConfig());
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Ratchet\Tests\Protocol;
use Ratchet\Protocol\WebSocket;
use Ratchet\Tests\Mock\Socket;
/**
* @covers Ratchet\Protocol\WebSocket
*/
class ServerTest extends \PHPUnit_Framework_TestCase {
protected $_ws;
public function setUp() {
$this->_ws = new WebSocket();
}
public function testServerImplementsServerInterface() {
$constraint = $this->isInstanceOf('\\Ratchet\\ReceiverInterface');
$this->assertThat($this->_ws, $constraint);
}
public function testServerImplementsProtocolInterface() {
$constraint = $this->isInstanceOf('\\Ratchet\\Protocol\ProtocolInterface');
$this->assertThat($this->_ws, $constraint);
}
public function testGetConfigReturnsArray() {
$this->assertInternalType('array', $this->_ws->getDefaultConfig());
}
}

View File

@ -24,17 +24,18 @@ class ServerTest extends \PHPUnit_Framework_TestCase {
$this->_server->run(); $this->_server->run();
} }
public function testAttatchedApplicationIsSet() { public function testAttatchedReceiverIsSet() {
$app = new TestApp(); $app = new TestApp();
$this->_server->attatchApplication($app); $this->_server->attatchReceiver($app);
$this->assertAttributeEquals($app, '_app', $this->_server); // todo, use proper assertions...can't look them up atm, no internet
$this->assertAttributeEquals(Array(spl_object_hash($app) => $app), '_receivers', $this->_server);
} }
public function testBindToInvalidAddress() { public function testBindToInvalidAddress() {
$app = new TestApp(); $app = new TestApp();
$this->_server->attatchApplication($app); $this->_server->attatchReceiver($app);
$this->setExpectedException('\\Ratchet\\Exception'); $this->setExpectedException('\\Ratchet\\Exception');
$this->_server->run('la la la', 80); $this->_server->run('la la la', 80);