Refactoring
Major restructure, dropped aggregate idea, can't get around php golden hammer, the all mighty array, problem Unit tests broken
This commit is contained in:
		
							parent
							
								
									3ef9f45de5
								
							
						
					
					
						commit
						ac8644125c
					
				@ -1,6 +1,13 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
namespace Ratchet\Protocol;
 | 
					namespace Ratchet\Protocol;
 | 
				
			||||||
 | 
					use Ratchet\Server;
 | 
				
			||||||
 | 
					use Ratchet\Server\Client;
 | 
				
			||||||
 | 
					use Ratchet\Server\Message;
 | 
				
			||||||
 | 
					use Ratchet\Socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @link http://ca.php.net/manual/en/ref.http.php
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
class WebSocket implements ProtocolInterface {
 | 
					class WebSocket implements ProtocolInterface {
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @return Array
 | 
					     * @return Array
 | 
				
			||||||
@ -20,15 +27,18 @@ class WebSocket implements ProtocolInterface {
 | 
				
			|||||||
     * @return string
 | 
					     * @return string
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    function getName() {
 | 
					    function getName() {
 | 
				
			||||||
        return __CLASS__;
 | 
					        return 'WebSocket';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function handleConnect() {
 | 
					    public function setUp(Server $server) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function handleMessage() {
 | 
					    function handleConnect(Socket $client) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function handleClose() {
 | 
					    function handleMessage($message, Socket $from) {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function handleClose(Socket $client) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,5 +1,8 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
namespace Ratchet;
 | 
					namespace Ratchet;
 | 
				
			||||||
 | 
					use Ratchet\Server;
 | 
				
			||||||
 | 
					use Ratchet\Server\Client;
 | 
				
			||||||
 | 
					use Ratchet\Server\Message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface ReceiverInterface {
 | 
					interface ReceiverInterface {
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -7,9 +10,11 @@ interface ReceiverInterface {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    function getName();
 | 
					    function getName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function handleConnect();
 | 
					    function setUp(Server $server);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function handleMessage();
 | 
					    function handleConnect(Socket $client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function handleClose();
 | 
					    function handleMessage($message, Socket $from);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function handleClose(Socket $client);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,56 +1,124 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
namespace Ratchet;
 | 
					namespace Ratchet;
 | 
				
			||||||
 | 
					use Ratchet\Server\Aggregator;
 | 
				
			||||||
use Ratchet\Protocol\ProtocolInterface;
 | 
					use Ratchet\Protocol\ProtocolInterface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Server implements ServerInterface {
 | 
					class Server implements ServerInterface {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The master socket, receives all connections
 | 
				
			||||||
 | 
					     * @type Socket
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    protected $_master = null;
 | 
					    protected $_master = null;
 | 
				
			||||||
    protected $_debug  = false;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected $_receivers   = Array();
 | 
					    /**
 | 
				
			||||||
    protected $_connections = Array();
 | 
					     * @todo This needs to implement the composite pattern
 | 
				
			||||||
 | 
					     * @var array of ReceiverInterface
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $_receivers   = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $_resources   = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @type array of Ratchet\Server\Client
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $_connections = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @param Ratchet\Socket
 | 
					     * @param Ratchet\Socket
 | 
				
			||||||
     * @param boolean True, enables debug mode and the server doesn't infiniate loop
 | 
					     * @param boolean True, enables debug mode and the server doesn't infiniate loop
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public function __construct(Socket $socket, $debug = false) {
 | 
					    public function __construct(Socket $host) {
 | 
				
			||||||
        $this->_master = $socket;
 | 
					        $this->_master = $host;
 | 
				
			||||||
        $this->_debug  = (boolean)$debug;
 | 
					
 | 
				
			||||||
 | 
					        $socket = $host->getResource();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->_resources[]          = $socket;
 | 
				
			||||||
 | 
					        $this->_connections[$socket] = $host;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @todo Receive an interface that creates clients based on interface, decorator pattern for Socket
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function setClientFactory($s) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function attatchReceiver(ReceiverInterface $receiver) {
 | 
					    public function attatchReceiver(ReceiverInterface $receiver) {
 | 
				
			||||||
 | 
					        $receiver->setUp($this);
 | 
				
			||||||
        $this->_receivers[spl_object_hash($receiver)] = $receiver;
 | 
					        $this->_receivers[spl_object_hash($receiver)] = $receiver;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getMaster() {
 | 
				
			||||||
 | 
					        return $this->_master;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getClients() {
 | 
				
			||||||
 | 
					        return $this->_connections;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
     * @param mixed
 | 
					     * @param mixed
 | 
				
			||||||
     * @param int
 | 
					     * @param int
 | 
				
			||||||
     * @throws Ratchet\Exception
 | 
					     * @throws Exception
 | 
				
			||||||
 | 
					     * @todo Validate address.  Use socket_get_option, if AF_INET must be IP, if AF_UNIX must be path
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public function run($address = '127.0.0.1', $port = 1025) {
 | 
					    public function run($address = '127.0.0.1', $port = 1025) {
 | 
				
			||||||
        if (count($this->_receivers) == 0) {
 | 
					        if (count($this->_receivers) == 0) {
 | 
				
			||||||
            throw new \RuntimeException("No receiver has been attatched to the server");
 | 
					            throw new \RuntimeException("No receiver has been attached to the server");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        set_time_limit(0);
 | 
					        set_time_limit(0);
 | 
				
			||||||
        ob_implicit_flush();
 | 
					        ob_implicit_flush();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// socket_create_listen($port); instead of create, bind, listen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (false === ($this->_master->bind($address, (int)$port))) { // perhaps I should do some checks here...
 | 
					        if (false === ($this->_master->bind($address, (int)$port))) { // perhaps I should do some checks here...
 | 
				
			||||||
            throw new Exception();
 | 
					            throw new Exception;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (false === ($this->_master->listen())) {
 | 
					        if (false === ($this->_master->listen())) {
 | 
				
			||||||
            throw new Exception();
 | 
					            throw new Exception;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        do {
 | 
					        do {
 | 
				
			||||||
			$changed     = $this->_connections;
 | 
								$changed     = $this->_resources;
 | 
				
			||||||
			$num_changed = socket_select($changed_sockets, $write = NULL, $except = NULL, NULL);
 | 
								$num_changed = @socket_select($changed, $write = NULL, $except = NULL, NULL);
 | 
				
			||||||
//			foreach($changed as $) 
 | 
								foreach($changed as $resource) {
 | 
				
			||||||
 | 
					                if ($this->_master->getResource() == $resource) {
 | 
				
			||||||
 | 
					                    $new_connection     = clone $this->_master;
 | 
				
			||||||
 | 
					                    $this->_resources[] = $new_connection->getResource();
 | 
				
			||||||
 | 
					                    $this->_connections[$new_connection->getResource()] = $new_connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        } while (!$this->_debug);
 | 
					                    // /here $this->_receivers->handleConnection($new_connection);
 | 
				
			||||||
 | 
					                    $this->tmpRIterator('handleConnect', $new_connection);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    $conn  = $this->_connections[$resource];
 | 
				
			||||||
 | 
					                    $data  = null;
 | 
				
			||||||
 | 
					                    $bytes = $conn->recv($data, 4096, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if ($bytes == 0) {
 | 
				
			||||||
 | 
					                        $this->tmpRIterator('handleClose', $conn);
 | 
				
			||||||
 | 
					                        // $this->_receivers->handleDisconnect($conn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        unset($this->_connections[$resource]);
 | 
				
			||||||
 | 
					                        unset($this->_resources[array_search($resource, $this->_resources)]);
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        $this->tmpRIterator('handleMessage', $data, $conn);
 | 
				
			||||||
 | 
					                        // new Message
 | 
				
			||||||
 | 
					                        // $this->_receivers->handleMessage($msg, $conn);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } while (true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//        $this->_master->set_nonblock();
 | 
					//        $this->_master->set_nonblock();
 | 
				
			||||||
//        declare(ticks = 1); 
 | 
					//        declare(ticks = 1); 
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function tmpRIterator() {
 | 
				
			||||||
 | 
					        $args = func_get_args();
 | 
				
			||||||
 | 
					        $fn   = array_shift($args);
 | 
				
			||||||
 | 
					        foreach ($this->_receivers as $app) {
 | 
				
			||||||
 | 
					            call_user_func_array(array($app, $fn), $args);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										69
									
								
								lib/Ratchet/Server/Aggregator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								lib/Ratchet/Server/Aggregator.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					namespace Ratchet\Server;
 | 
				
			||||||
 | 
					use Ratchet\Socket;
 | 
				
			||||||
 | 
					use Ratchet\Exception;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Aggregator implements \IteratorAggregator {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var Ratchet\Socket
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $_master;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @var SplObjectStorage
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected $_sockets;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $_resources = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param Ratchet\Socket
 | 
				
			||||||
 | 
					     * @throws Ratchet\Exception
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function __construct(Socket $master) {
 | 
				
			||||||
 | 
					        $this->_sockets = new \SplObjectStorage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->_master = $master;
 | 
				
			||||||
 | 
					        $this->insert($this->_master);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return Socket
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getMaster() {
 | 
				
			||||||
 | 
					        return $this->_master;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param resource
 | 
				
			||||||
 | 
					     * @return Socket
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getClientByResource($resource) {
 | 
				
			||||||
 | 
					        if ($this->_sockets->contains($resource)) {
 | 
				
			||||||
 | 
					            return $this->_sockets[$resource];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        throw new Exception("Resource not found");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected function insert(Socket $socket) {
 | 
				
			||||||
 | 
					        $resource = $socket->getResource();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->_sockets[$socket] = $resource;
 | 
				
			||||||
 | 
					        $this->_resources[]      = $resource;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return SplObjectStorage
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getIterator() {
 | 
				
			||||||
 | 
					        return $this->_sockets;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function asArray() {
 | 
				
			||||||
 | 
					        return $this->_resources;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								lib/Ratchet/Server/Client.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								lib/Ratchet/Server/Client.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					namespace Ratchet\Server;
 | 
				
			||||||
 | 
					use Ratchet\Socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Client {
 | 
				
			||||||
 | 
					    protected $_socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct(Socket $socket) {
 | 
				
			||||||
 | 
					        $this->_socket = $socket;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -10,7 +10,7 @@ class Socket {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @type resource
 | 
					     * @type resource
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public $_resource;
 | 
					    protected $_resource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static $_defaults = Array(
 | 
					    public static $_defaults = Array(
 | 
				
			||||||
        'domain'   => AF_INET
 | 
					        'domain'   => AF_INET
 | 
				
			||||||
@ -34,6 +34,17 @@ class Socket {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return resource (Socket)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getResource() {
 | 
				
			||||||
 | 
					        return $this->_resource;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __clone() {
 | 
				
			||||||
 | 
					        $this->_resource = @socket_accept($this->_resource);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @param Ratchet\Protocol\ProtocolInterface
 | 
					     * @param Ratchet\Protocol\ProtocolInterface
 | 
				
			||||||
     * @return Ratchet\Socket
 | 
					     * @return Ratchet\Socket
 | 
				
			||||||
@ -70,7 +81,7 @@ class Socket {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return Array($domain, $type, $protocol);
 | 
					        return array($domain, $type, $protocol);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -88,7 +99,17 @@ class Socket {
 | 
				
			|||||||
        $write  = static::mungForSelect($write);
 | 
					        $write  = static::mungForSelect($write);
 | 
				
			||||||
        $except = static::mungForSelect($except);
 | 
					        $except = static::mungForSelect($except);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        socket_select($read, $write, $except, $tv_sec, $tv_usec);
 | 
					        return socket_select($read, $write, $except, $tv_sec, $tv_usec);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param string
 | 
				
			||||||
 | 
					     * @param int
 | 
				
			||||||
 | 
					     * @param int
 | 
				
			||||||
 | 
					     * @return int
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function recv(&$buf, $len, $flags) {
 | 
				
			||||||
 | 
					        return socket_recv($this->_resource, $buf, $len, $flags);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -105,9 +126,9 @@ class Socket {
 | 
				
			|||||||
            throw new \InvalidArgumentException('Object pass is not traversable');
 | 
					            throw new \InvalidArgumentException('Object pass is not traversable');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $return = Array();
 | 
					        $return = array();
 | 
				
			||||||
        foreach ($collection as $key => $socket) {
 | 
					        foreach ($collection as $key => $socket) {
 | 
				
			||||||
            $return[$key] = ($socket instanceof \Ratchet\Socket ? $socket->_resource : $socket);
 | 
					            $return[$key] = ($socket instanceof \Ratchet\Socket ? $socket->getResource() : $socket);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $return;
 | 
					        return $return;
 | 
				
			||||||
@ -118,12 +139,19 @@ class Socket {
 | 
				
			|||||||
     * @param string
 | 
					     * @param string
 | 
				
			||||||
     * @param Array
 | 
					     * @param Array
 | 
				
			||||||
     * @return mixed
 | 
					     * @return mixed
 | 
				
			||||||
 | 
					     * @throws Exception
 | 
				
			||||||
     * @throws \BadMethodCallException
 | 
					     * @throws \BadMethodCallException
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public function __call($method, $arguments) {
 | 
					    public function __call($method, $arguments) {
 | 
				
			||||||
        if (function_exists('socket_' . $method)) {
 | 
					        if (function_exists('socket_' . $method)) {
 | 
				
			||||||
            array_unshift($arguments, $this->_resource);
 | 
					            array_unshift($arguments, $this->_resource);
 | 
				
			||||||
            return call_user_func_array('socket_' . $method, $arguments);
 | 
					            $result = @call_user_func_array('socket_' . $method, $arguments);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (false === $result) {
 | 
				
			||||||
 | 
					                throw new Exception;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return $result;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        throw new \BadMethodCallException("{$method} is not a valid socket function");
 | 
					        throw new \BadMethodCallException("{$method} is not a valid socket function");
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,24 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
namespace Ratchet\Tests\Mock;
 | 
					namespace Ratchet\Tests\Mock;
 | 
				
			||||||
use Ratchet\ReceiverInterface;
 | 
					use Ratchet\ReceiverInterface;
 | 
				
			||||||
 | 
					use Ratchet\Server;
 | 
				
			||||||
 | 
					use Ratchet\Tests\Mock\Socket as MockSocket;
 | 
				
			||||||
 | 
					use Ratchet\Socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Application implements ReceiverInterface {
 | 
					class Application implements ReceiverInterface {
 | 
				
			||||||
    public function getName() {
 | 
					    public function getName() {
 | 
				
			||||||
        return 'mock_application';
 | 
					        return 'mock_application';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function handleConnect() {
 | 
					    public function setUp(Server $server) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function handleMessage() {
 | 
					    public function handleConnect(Socket $client) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function handleClose() {
 | 
					    public function handleMessage($msg, Socket $from) {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function handleClose(Socket $client) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
namespace Ratchet\Tests\Mock;
 | 
					namespace Ratchet\Tests\Mock;
 | 
				
			||||||
use Ratchet\Socket as RealSocket;
 | 
					use Ratchet\Socket as RealSocket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Socket extends RealSocket {
 | 
					class FakeSocket extends RealSocket {
 | 
				
			||||||
    protected $_arguments = Array();
 | 
					    protected $_arguments = Array();
 | 
				
			||||||
    protected $_options   = Array();
 | 
					    protected $_options   = Array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1,6 +1,8 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
namespace Ratchet\Tests\Mock;
 | 
					namespace Ratchet\Tests\Mock;
 | 
				
			||||||
use Ratchet\Protocol\ProtocolInterface;
 | 
					use Ratchet\Protocol\ProtocolInterface;
 | 
				
			||||||
 | 
					use Ratchet\Server;
 | 
				
			||||||
 | 
					use Ratchet\Socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Protocol implements ProtocolInterface {
 | 
					class Protocol implements ProtocolInterface {
 | 
				
			||||||
    public static function getDefaultConfig() {
 | 
					    public static function getDefaultConfig() {
 | 
				
			||||||
@ -18,12 +20,15 @@ class Protocol implements ProtocolInterface {
 | 
				
			|||||||
        return 'mock_protocol';
 | 
					        return 'mock_protocol';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function handleConnect() {
 | 
					    public function setUp(Server $server) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function handleMessage() {
 | 
					    public function handleConnect(Socket $client) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function handleClose() {
 | 
					    public function handleMessage($msg, Socket $client) {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function handleClose(Socket $client) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										42
									
								
								tests/Ratchet/Tests/Mock/SocketAggregator.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								tests/Ratchet/Tests/Mock/SocketAggregator.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					namespace Ratchet\Tests\Mock;
 | 
				
			||||||
 | 
					use Ratchet\SocketAggregator as RealSocketAggregator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SocketAggregator extends RealSocketAggregator {
 | 
				
			||||||
 | 
					    protected $_arguments = Array();
 | 
				
			||||||
 | 
					    protected $_options   = Array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct($domain = null, $type = null, $protocol = null) {
 | 
				
			||||||
 | 
					        list($this->_arguments['domain'], $this->_arguments['type'], $this->_arguments['protocol']) = static::getConfig($domain, $type, $protocol);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function accept() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function bind($address, $port) {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function close() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function get_option($level, $optname) {
 | 
				
			||||||
 | 
					        return $this->_options[$level][$optname];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function listen($backlog) {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function recv($buf, $len, $flags) {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function set_option($level, $optname, $optval) {
 | 
				
			||||||
 | 
					        if (!isset($this->_options[$level])) {
 | 
				
			||||||
 | 
					            $this->_options[$level] = Array();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->_options[$level][$optname] = $optval;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function write($buffer, $length = 0) {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
namespace Ratchet\Tests;
 | 
					namespace Ratchet\Tests;
 | 
				
			||||||
use Ratchet\Server;
 | 
					use Ratchet\Server;
 | 
				
			||||||
use Ratchet\Tests\Mock\Socket;
 | 
					use Ratchet\Tests\Mock\FakeSocket as Socket;
 | 
				
			||||||
use Ratchet\Tests\Mock\Application as TestApp;
 | 
					use Ratchet\Tests\Mock\Application as TestApp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										94
									
								
								tests/Ratchet/Tests/SocketAggregatorTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								tests/Ratchet/Tests/SocketAggregatorTest.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,94 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					namespace Ratchet\Tests;
 | 
				
			||||||
 | 
					use Ratchet\Tests\Mock\FakeSocket as Socket;
 | 
				
			||||||
 | 
					use Ratchet\Socket as RealSocket;
 | 
				
			||||||
 | 
					use Ratchet\Tests\Mock\Protocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @covers Ratchet\SocketAggregator
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class SocketAggregatorTest extends \PHPUnit_Framework_TestCase {
 | 
				
			||||||
 | 
					    protected $_socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected static function getMethod($name) {
 | 
				
			||||||
 | 
					        $class  = new \ReflectionClass('\\Ratchet\\Tests\\Mock\\Socket');
 | 
				
			||||||
 | 
					        $method = $class->getMethod($name);
 | 
				
			||||||
 | 
					        $method->setAccessible(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp() {
 | 
				
			||||||
 | 
					        $this->_socket = new Socket();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					    public function testWhatGoesInConstructComesOut() {
 | 
				
			||||||
 | 
					        $this->assertTrue(false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testGetDefaultConfigForConstruct() {
 | 
				
			||||||
 | 
					        $ref_conf = static::getMethod('getConfig');
 | 
				
			||||||
 | 
					        $config   = $ref_conf->invokeArgs($this->_socket, Array());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(array_values(Socket::$_defaults), $config);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInvalidConstructorArguments() {
 | 
				
			||||||
 | 
					        $this->setExpectedException('\\Ratchet\\Exception');
 | 
				
			||||||
 | 
					        $socket = new RealSocket('invalid', 'param', 'derp');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testConstructAndCallByOpenAndClose() {
 | 
				
			||||||
 | 
					        $socket = new RealSocket();
 | 
				
			||||||
 | 
					        $socket->close();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testInvalidSocketCall() {
 | 
				
			||||||
 | 
					        $this->setExpectedException('\\BadMethodCallException');
 | 
				
			||||||
 | 
					        $this->_socket->fake_method();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testConstructionFromProtocolInterfaceConfig() {
 | 
				
			||||||
 | 
					        $protocol = new Protocol();
 | 
				
			||||||
 | 
					        $socket   = Socket::createFromConfig($protocol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertInstanceOf('\\Ratchet\\Socket', $socket);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testCreationFromConfigOutputMatchesInput() {
 | 
				
			||||||
 | 
					        $protocol = new Protocol();
 | 
				
			||||||
 | 
					        $socket   = Socket::createFromConfig($protocol);
 | 
				
			||||||
 | 
					        $config   = $protocol::getDefaultConfig();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // change this to array_filter late
 | 
				
			||||||
 | 
					        unset($config['options']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertAttributeEquals($config, '_arguments', $socket);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function asArrayProvider() {
 | 
				
			||||||
 | 
					        return Array(
 | 
				
			||||||
 | 
					            Array(Array('hello' => 'world'), Array('hello' => 'world'))
 | 
				
			||||||
 | 
					          , Array(null, null)
 | 
				
			||||||
 | 
					          , Array(Array('hello' => 'world'), new \ArrayObject(Array('hello' => 'world')))
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @dataProvider asArrayProvider
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function testMethodMungforselectReturnsExpectedValues($output, $input) {
 | 
				
			||||||
 | 
					        $method = static::getMethod('mungForSelect');
 | 
				
			||||||
 | 
					        $return = $method->invokeArgs($this->_socket, Array($input));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals($return, $output);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testMethodMungforselectRejectsNonTraversable() {
 | 
				
			||||||
 | 
					        $this->setExpectedException('\\InvalidArgumentException');
 | 
				
			||||||
 | 
					        $method = static::getMethod('mungForSelect');
 | 
				
			||||||
 | 
					        $method->invokeArgs($this->_socket, Array('I am upset with PHP ATM'));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
namespace Ratchet\Tests;
 | 
					namespace Ratchet\Tests;
 | 
				
			||||||
use Ratchet\Tests\Mock\Socket;
 | 
					use Ratchet\Tests\Mock\FakeSocket as Socket;
 | 
				
			||||||
use Ratchet\Socket as RealSocket;
 | 
					use Ratchet\Socket as RealSocket;
 | 
				
			||||||
use Ratchet\Tests\Mock\Protocol;
 | 
					use Ratchet\Tests\Mock\Protocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user