/
UnixConnectorTest.php
90 lines (71 loc) · 2.73 KB
/
UnixConnectorTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
namespace React\Tests\Socket;
use React\Socket\ConnectionInterface;
use React\Socket\UnixConnector;
class UnixConnectorTest extends TestCase
{
private $loop;
private $connector;
/**
* @before
*/
public function setUpConnector()
{
$this->loop = $this->getMockBuilder('React\EventLoop\LoopInterface')->getMock();
$this->connector = new UnixConnector($this->loop);
}
public function testConstructWithoutLoopAssignsLoopAutomatically()
{
$connector = new UnixConnector();
$ref = new \ReflectionProperty($connector, 'loop');
$ref->setAccessible(true);
$loop = $ref->getValue($connector);
$this->assertInstanceOf('React\EventLoop\LoopInterface', $loop);
}
public function testInvalid()
{
$promise = $this->connector->connect('google.com:80');
$promise->then(null, $this->expectCallableOnceWithException(
'RuntimeException'
));
}
public function testInvalidScheme()
{
$promise = $this->connector->connect('tcp://google.com:80');
$promise->then(null, $this->expectCallableOnceWithException(
'InvalidArgumentException',
'Given URI "tcp://google.com:80" is invalid (EINVAL)',
defined('SOCKET_EINVAL') ? SOCKET_EINVAL : (defined('PCNTL_EINVAL') ? PCNTL_EINVAL : 22)
));
}
public function testValid()
{
if (!in_array('unix', stream_get_transports())) {
$this->markTestSkipped('Unix domain sockets (UDS) not supported on your platform (Windows?)');
}
// random unix domain socket path
$path = sys_get_temp_dir() . '/test' . uniqid() . '.sock';
// temporarily create unix domain socket server to connect to
$server = stream_socket_server('unix://' . $path, $errno, $errstr);
// skip test if we can not create a test server (Windows etc.)
if (!$server) {
$this->markTestSkipped('Unable to create socket "' . $path . '": ' . $errstr . '(' . $errno .')');
return;
}
// tests succeeds if we get notified of successful connection
$promise = $this->connector->connect($path);
$promise->then($this->expectCallableOnce());
// remember remote and local address of this connection and close again
$remote = $local = false;
$promise->then(function(ConnectionInterface $conn) use (&$remote, &$local) {
$remote = $conn->getRemoteAddress();
$local = $conn->getLocalAddress();
$conn->close();
});
// clean up server
fclose($server);
unlink($path);
$this->assertNull($local);
$this->assertEquals('unix://' . $path, $remote);
}
}