<?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
);
}
}
|