<?php
 
require_once MIO_PATH . 'SelectionKey.php';
 
 
class MioBlankObject {
 
}
 
 
class MioSelectionKeyTest extends UnitTestCase
 
{
 
    private
 
        $server,
 
        $key;
 
    
 
    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]");
 
        }
 
        $stream = new MioStream( fsockopen( '127.0.0.1', 8888, $errno=null, $errstr=null ), '127.0.0.1:8888' );
 
        $this->key = new MioSelectionKey( $stream, 0 );
 
    }
 
 
    public function tearDown()
 
    {
 
        if( is_resource( $this->server ) ) {
 
            fclose( $this->server );
 
        }
 
        $this->key->stream->close();
 
        unset( $this->server, $this->key );
 
    }
 
 
    public function testIllegalPropertyAccess()
 
    {
 
        try {
 
            $this->key->stream;
 
            $this->pass();
 
        } catch( InvalidArgumentException $e ) {
 
            $this->fail();
 
        }
 
        try {
 
            $this->key->interest_ops;
 
            $this->fail();
 
        } catch( InvalidArgumentException $e ) {
 
            $this->pass();
 
        }
 
    }
 
 
    public function testBlockingCreation()
 
    {
 
        $stream = new MioStream( fsockopen( '127.0.0.1', 8888, $errno=null, $errstr=null ), '127.0.0.1:8888' );
 
        $stream->setBlocking( 1 );
 
        try {
 
            $key = new MioSelectionKey( $stream, 0 );
 
            $this->fail();
 
        } catch( MioBlockingException $e ) {
 
            $this->pass();
 
        }
 
    }
 
 
    public function testClosedCreation()
 
    {
 
        $stream = new MioStream( fsockopen( '127.0.0.1', 8888, $errno=null, $errstr=null ), '127.0.0.1:8888' );
 
        $stream->close();
 
        try {
 
            $key = new MioSelectionKey( $stream, 0 );
 
            $this->fail();
 
        } catch( MioClosedException $e ) {
 
            $this->pass();
 
        }
 
    }
 
 
    public function testInterestOps()
 
    {
 
        $this->assertTrue(
 
            $this->key->interestedIn( 0 )
 
        );
 
        $this->assertFalse(
 
            $this->key->interestedIn( MioSelectionKey::OP_READ )
 
        );
 
    }
 
 
    public function testSetInterestOps()
 
    {
 
        $this->key->setInterestOps( MioSelectionKey::OP_READ );
 
        $this->assertTrue(
 
            $this->key->interestedIn( MioSelectionKey::OP_READ )
 
        );
 
        $this->assertFalse(
 
            $this->key->interestedIn( MioSelectionKey::OP_WRITE )
 
        );
 
    }
 
 
    public function testSetInterestOpsFailure()
 
    {
 
        try {
 
            $this->key->setInterestOps( 123 );
 
            $this->fail();
 
        } catch( MioOpsException $e ) {
 
            $this->pass();
 
        }
 
    }
 
 
    public function testAddReadableOp()
 
    {
 
        $this->key->setInterestOps( MioSelectionKey::OP_READ );
 
        $this->key->addReadyOp( MioSelectionKey::OP_READ );
 
        $this->assertTrue(
 
            $this->key->isReadable()
 
        );
 
    }
 
 
    public function testAddWritableOp()
 
    {
 
        $this->key->setInterestOps( MioSelectionKey::OP_WRITE );
 
        $this->key->addReadyOp( MioSelectionKey::OP_WRITE );
 
        $this->assertTrue(
 
            $this->key->isWritable()
 
        );
 
    }
 
 
    public function testAddAcceptableOp()
 
    {
 
        $this->key->setInterestOps( MioSelectionKey::OP_ACCEPT );
 
        $this->key->addReadyOp( MioSelectionKey::OP_ACCEPT );
 
        $this->assertTrue(
 
            $this->key->isAcceptable()
 
        );
 
    }
 
 
    public function testAddBadReadyOp()
 
    {
 
        try {
 
            $this->key->addReadyOp( 22 );
 
            $this->fail();
 
        } catch( MioOpsException $e ) {
 
            $this->pass();
 
        }
 
    }
 
 
    public function testResetReadyOps()
 
    {
 
        $this->key->addReadyOp( MioSelectionKey::OP_READ );
 
        $this->key->resetReadyOps();
 
        $this->assertFalse(
 
            $this->key->isReadable()
 
        );
 
    }
 
 
    public function testAttach()
 
    {
 
        $object = new MioBlankObject();
 
        $this->key->attach( $object );
 
        $this->assert(
 
            new IdenticalExpectation( $object ),
 
            $this->key->attachment
 
        );
 
    }
 
 
    public function testAttachNonObject()
 
    {
 
        $array = array();
 
        try {
 
            $this->key->attach( $array );
 
            $this->fail();
 
        } catch( MioException $e ) {
 
            $this->pass();
 
        }
 
    }
 
 
    public function testTurnToString()
 
    {
 
        $this->assertPattern(
 
            '/SelectionKey \(\d:\d?\)/',
 
            "".$this->key
 
        );
 
    }
 
    
 
}
 
 
 
 |