diff --git a/src/Server/Socket/ForkSharedProxy.php b/src/Server/Socket/ForkSharedProxy.php new file mode 100644 index 0000000..46e231d --- /dev/null +++ b/src/Server/Socket/ForkSharedProxy.php @@ -0,0 +1,41 @@ +setOption(SOL_SOCKET, SO_REUSEADDR, 1); + + $socket->bind('0.0.0.0', $port); + $socket->listen(SOMAXCONN); + + return $socket; + } + + public function accept(Socket $socket): Connection + { + return $socket->accept(); + } + + public function isSupported(): bool + { + return true; + } +} diff --git a/tests/Server/Socket/ForkSharedProxyTest.php b/tests/Server/Socket/ForkSharedProxyTest.php new file mode 100644 index 0000000..fbd74e9 --- /dev/null +++ b/tests/Server/Socket/ForkSharedProxyTest.php @@ -0,0 +1,74 @@ +assertInstanceOf(SocketProxyInterface::class, $proxy); + } + + public function testCreateSocketReturnsSocket(): void + { + $proxy = new ForkSharedProxy(); + + $socket = $proxy->createSocket(0, ProtocolType::TCP); + + $this->assertInstanceOf(Socket::class, $socket); + + $socket->close(); + } + + public function testAcceptReturnsConnection(): void + { + $proxy = new ForkSharedProxy(); + + $socket = $proxy->createSocket(0, ProtocolType::TCP); + + \socket_getsockname($this->getSocketResource($socket), $address, $portNumber); + + $client = \socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + $this->assertNotFalse($client); + + /** @var string $address */ + /** @var int $portNumber */ + \socket_connect($client, $address, $portNumber); + + $connection = $proxy->accept($socket); + + $this->assertInstanceOf(Connection::class, $connection); + + \socket_close($client); + $connection->close(); + $socket->close(); + } + + public function testIsSupportedAlwaysTrue(): void + { + $proxy = new ForkSharedProxy(); + + $this->assertTrue($proxy->isSupported()); + } + + private function getSocketResource(Socket $socket): \Socket + { + $reflection = new \ReflectionProperty(Socket::class, 'resource'); + + $resource = $reflection->getValue($socket); + $this->assertInstanceOf(\Socket::class, $resource); + + return $resource; + } +}