Changeset View
Changeset View
Standalone View
Standalone View
src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php
- This file was added.
<?php | |||||
final class PhutilPHPObjectProtocolChannelTestCase extends PhutilTestCase { | |||||
public function testPHPObjectChannelBasics() { | |||||
list($x, $y) = PhutilSocketChannel::newChannelPair(); | |||||
$xp = new PhutilPHPObjectProtocolChannel($x); | |||||
$yp = new PhutilPHPObjectProtocolChannel($y); | |||||
$object = (object)array( | |||||
'key' => mt_rand(), | |||||
); | |||||
$xp->write($object); | |||||
$xp->flush(); | |||||
$result = $yp->waitForMessage(); | |||||
$this->assertTrue( | |||||
(array)$object === (array)$result, | |||||
pht('Values are identical.')); | |||||
$this->assertFalse( | |||||
$object === $result, | |||||
pht('Objects are not the same.')); | |||||
} | |||||
public function testCloseSocketWriteChannel() { | |||||
list($x, $y) = PhutilSocketChannel::newChannelPair(); | |||||
$xp = new PhutilPHPObjectProtocolChannel($x); | |||||
$yp = new PhutilPHPObjectProtocolChannel($y); | |||||
$yp->closeWriteChannel(); | |||||
$yp->update(); | |||||
// NOTE: This test is more broad than the implementation needs to be. A | |||||
// better test would be to verify that this throws an exception: | |||||
// | |||||
// $xp->waitForMessage(); | |||||
// | |||||
// However, if the test breaks, that method will hang forever instead of | |||||
// returning, which would be hard to diagnose. Since the current | |||||
// implementation shuts down the entire channel, just test for that. | |||||
$this->assertFalse($xp->update(), pht('Expected channel to close.')); | |||||
} | |||||
public function testCloseExecWriteChannel() { | |||||
$future = new ExecFuture('cat'); | |||||
// If this test breaks, we want to explode, not hang forever. | |||||
$future->setTimeout(5); | |||||
$exec_channel = new PhutilExecChannel($future); | |||||
$exec_channel->write('quack'); | |||||
$exec_channel->closeWriteChannel(); | |||||
// If `closeWriteChannel()` did what it is supposed to, this will just | |||||
// echo "quack" and exit with no error code. If the channel did not close, | |||||
// this will time out after 5 seconds and throw. | |||||
$future->resolvex(); | |||||
$this->assertTrue(true); | |||||
} | |||||
} |