|
14 | 14 | use Hyperf\Config\Config;
|
15 | 15 | use Hyperf\Contract\ConfigInterface;
|
16 | 16 | use Hyperf\Contract\StdoutLoggerInterface;
|
| 17 | +use Hyperf\Engine\Channel; |
17 | 18 | use Hyperf\ExceptionHandler\ExceptionHandlerDispatcher;
|
18 | 19 | use Hyperf\Rpc\ProtocolManager;
|
19 | 20 | use Hyperf\RpcMultiplex\TcpServer;
|
20 | 21 | use Hyperf\RpcServer\RequestDispatcher;
|
| 22 | +use Hyperf\Server\Connection as HyperfConnection; |
21 | 23 | use Hyperf\Server\Event;
|
22 | 24 | use Hyperf\Server\Exception\InvalidArgumentException;
|
23 | 25 | use Hyperf\Server\Server;
|
24 | 26 | use Hyperf\Support\Reflection\ClassInvoker;
|
25 | 27 | use HyperfTest\RpcMultiplex\Stub\ContainerStub;
|
26 | 28 | use Mockery;
|
| 29 | +use Multiplex\Contract\PackerInterface; |
| 30 | +use Multiplex\Packet; |
27 | 31 | use PHPUnit\Framework\Attributes\CoversNothing;
|
28 | 32 |
|
29 | 33 | /**
|
@@ -71,6 +75,56 @@ public function testInitServerConfig()
|
71 | 75 | $this->assertSame($settings, $invoker->initServerConfig('rpc')['settings']);
|
72 | 76 | }
|
73 | 77 |
|
| 78 | + public function testHeartbeat() |
| 79 | + { |
| 80 | + $container = ContainerStub::mockContainer(); |
| 81 | + $container->shouldReceive('get')->with(ConfigInterface::class)->andReturn(new Config([ |
| 82 | + 'server' => [ |
| 83 | + 'servers' => [ |
| 84 | + [ |
| 85 | + 'name' => 'rpc', |
| 86 | + 'type' => Server::SERVER_BASE, |
| 87 | + 'host' => '0.0.0.0', |
| 88 | + 'port' => 9502, |
| 89 | + 'sock_type' => SWOOLE_SOCK_TCP, |
| 90 | + 'callbacks' => [ |
| 91 | + Event::ON_RECEIVE => [TcpServer::class, 'onReceive'], |
| 92 | + ], |
| 93 | + 'settings' => $settings = [ |
| 94 | + 'open_length_check' => true, |
| 95 | + 'package_max_length' => 1024 * 1024 * 2, |
| 96 | + 'package_length_type' => 'N', |
| 97 | + 'package_length_offset' => 0, |
| 98 | + 'package_body_offset' => 4, |
| 99 | + ], |
| 100 | + ], |
| 101 | + ], |
| 102 | + ], |
| 103 | + ])); |
| 104 | + |
| 105 | + /** @var PackerInterface $packer */ |
| 106 | + $packer = $container->get(PackerInterface::class); |
| 107 | + $server = new TcpServer( |
| 108 | + $container, |
| 109 | + Mockery::mock(RequestDispatcher::class), |
| 110 | + Mockery::mock(ExceptionHandlerDispatcher::class), |
| 111 | + Mockery::mock(ProtocolManager::class), |
| 112 | + Mockery::mock(StdoutLoggerInterface::class), |
| 113 | + ); |
| 114 | + |
| 115 | + $connection = Mockery::mock(HyperfConnection::class); |
| 116 | + $chan = new Channel(1); |
| 117 | + $connection->shouldReceive('send')->once()->withAnyArgs()->andReturnUsing(function ($args) use ($chan) { |
| 118 | + $chan->push($args); |
| 119 | + }); |
| 120 | + $server->onReceive($connection, 1, 1, $packer->pack(new Packet(0, Packet::PING))); |
| 121 | + |
| 122 | + $packet = $packer->unpack($chan->pop()); |
| 123 | + $this->assertSame(0, $packet->getId()); |
| 124 | + $this->assertSame(Packet::PONG, $packet->getBody()); |
| 125 | + $this->assertTrue($packet->isHeartbeat()); |
| 126 | + } |
| 127 | + |
74 | 128 | public function testInitServerConfigFailed()
|
75 | 129 | {
|
76 | 130 | $container = ContainerStub::mockContainer();
|
|
0 commit comments