| 
<?php
require_once MIO_PATH . 'Selector.php';
 
 class MioSelectorTest extends UnitTestCase
 {
 private
 $server,
 $selector,
 $stream;
 
 public function setUp()
 {
 $this->server   = stream_socket_server( '127.0.0.1:8888', $errno=null, $errstr=null );
 if( !$this->server ) {
 throw new Exception("Could not start test server [$errno:$errstr]");
 }
 $this->selector = new MioSelector();
 $this->stream   = new MioStream( fsockopen( '127.0.0.1', 8888, $errno=null, $errstr=null ), '127.0.0.1:8888' );
 $this->selector->register(
 $this->stream,
 MioSelectionKey::OP_WRITE
 );
 }
 
 public function tearDown()
 {
 if( is_resource( $this->server ) ) {
 fclose( $this->server );
 }
 $this->selector->close();
 }
 
 public function testPropertyAccess()
 {
 try {
 $this->selector->selection_keys;
 $this->pass();
 } catch( InvalidArgumentException $e ) {
 $this->fail();
 }
 try {
 $this->selector->open;
 $this->fail();
 } catch( InvalidArgumentException $e ) {
 $this->pass();
 }
 }
 
 public function testRegister()
 {
 $this->assertTrue(
 is_array( $this->selector->selection_keys )
 );
 $this->assert(
 new IdenticalExpectation( $this->stream ),
 $this->selector->selection_keys[0]->stream
 );
 }
 
 public function testRegisterClosedStream()
 {
 $this->selector->removeKey(
 $this->selector->keyFor( $this->stream )
 );
 $this->stream->close();
 try {
 $this->selector->register(
 $this->stream,
 MioSelectionKey::OP_WRITE
 );
 $this->fail();
 } catch( MioClosedException $e ) {
 $this->pass();
 }
 }
 
 public function testRegisterClosedSelector()
 {
 $this->selector->close();
 try {
 $this->selector->register(
 $this->stream,
 MioSelectionKey::OP_WRITE
 );
 $this->fail();
 } catch( MioClosedException $e ) {
 $this->pass();
 }
 }
 
 public function testClosing()
 {
 $this->assertTrue(
 $this->selector->isOpen()
 );
 $this->assertTrue(
 $this->stream->isOpen()
 );
 $this->selector->close();
 $this->assertFalse(
 $this->selector->isOpen()
 );
 $this->assertFalse(
 $this->stream->isOpen()
 );
 }
 
 public function testHasStream()
 {
 $this->assertTrue(
 $this->selector->hasStream(
 $this->stream
 )
 );
 }
 
 public function testKeyFor()
 {
 $key = $this->selector->keyFor( $this->stream );
 $this->assertTrue(
 $key instanceof MioSelectionKey
 );
 $this->assert(
 new IdenticalExpectation( $this->stream ),
 $key->stream
 );
 }
 
 public function testRemoveKey()
 {
 // Add a second stream to confirm the other
 // streams don't get corrupted
 $stream2 = new MioStream( fsockopen( '127.0.0.1', 8888, $errno=null, $errstr=null ), '127.0.0.1:8888' );
 $this->selector->register(
 $stream2,
 MioSelectionKey::OP_WRITE
 );
 $this->assertTrue(
 $this->selector->hasStream( $this->stream )
 );
 $this->assertTrue(
 $this->selector->hasStream( $stream2 )
 );
 $this->selector->removeKey(
 $this->selector->keyFor(
 $this->stream
 )
 );
 $this->assertFalse(
 $this->selector->hasStream( $this->stream )
 );
 $this->assertTrue(
 $this->selector->hasStream( $stream2 )
 );
 $this->assertFalse(
 $this->stream->isOpen()
 );
 }
 
 public function testSelectWhenNothingIsRegistered()
 {
 $this->selector->removeKey(
 $this->selector->keyFor( $this->stream )
 );
 $this->assertFalse(
 $this->selector->select()
 );
 }
 
 public function testClosedRemovalInSelect()
 {
 $this->stream->close();
 $this->assertFalse(
 $this->selector->select()
 );
 }
 
 /**
 * this is more of a full start-to-finnish test
 */
 public function testSelect()
 {
 $data = 'Some test data to send';
 $con = stream_socket_accept( $this->server );
 $this->assertEqual(
 $this->selector->select(),
 1
 );
 $key = $this->selector->selected_keys[0];
 $this->assertTrue(
 $key->isWritable()
 );
 $key->stream->write( $data );
 fread( $con, 1024 );
 
 $key->setInterestOps( MioSelectionKey::OP_READ );
 
 $this->assertEqual(
 $this->selector->select(),
 0
 );
 
 fwrite( $con, $data );
 
 $this->assertEqual(
 $this->selector->select(),
 1
 );
 }
 
 public function testTurnToString()
 {
 $this->assertPattern(
 '/Selector \(\d:\d\)/',
 "".$this->selector
 );
 }
 }
 
 |