| <?php |
| /* |
| * |
| * Copyright 2015 gRPC authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| |
| require_once(dirname(__FILE__) . '/../../lib/Grpc/ServerCallReader.php'); |
| require_once(dirname(__FILE__) . '/../../lib/Grpc/ServerCallWriter.php'); |
| require_once(dirname(__FILE__) . '/../../lib/Grpc/Status.php'); |
| require_once(dirname(__FILE__) . '/../../lib/Grpc/ServerContext.php'); |
| |
| class StartBatchEvent |
| { |
| public function __construct(string $message) |
| { |
| $this->message = $message; |
| } |
| public $message; |
| } |
| |
| class StringValue |
| { |
| public function setValue(string $value) |
| { |
| $this->value = $value; |
| } |
| |
| public function getValue(): string |
| { |
| return $this->value; |
| } |
| |
| public function serializeToString(): string |
| { |
| return $this->value; |
| } |
| |
| public function mergeFromString(string $value) |
| { |
| $this->value = $value; |
| } |
| |
| private $value = ''; |
| } |
| |
| class ServerCallTest extends \PHPUnit\Framework\TestCase |
| { |
| private $mockCall; |
| private $serverContext; |
| |
| public function setUp(): void |
| { |
| $this->mockCall = $this->getMockBuilder(stdClass::class) |
| ->setMethods(['startBatch']) |
| ->getMock(); |
| $this->serverContext = new \Grpc\ServerContext($this->mockCall); |
| } |
| |
| public function newStringMessage(string $value = 'a string') |
| { |
| $message = new StringValue(); |
| $message->setValue($value); |
| return $message; |
| } |
| |
| public function testRead() |
| { |
| $message = $this->newStringMessage(); |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_RECV_MESSAGE => true, |
| ]))->willReturn(new StartBatchEvent($message->serializeToString())); |
| |
| $serverCallReader = new \Grpc\ServerCallReader( |
| $this->mockCall, |
| '\StringValue' |
| ); |
| $return = $serverCallReader->read(); |
| $this->assertEquals($message, $return); |
| } |
| |
| public function testStartEmptyMetadata() |
| { |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_INITIAL_METADATA => [], |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $this->serverContext->setInitialMetadata([]); |
| $serverCallWriter->start(); |
| } |
| |
| public function testStartWithMetadata() |
| { |
| $metadata = ['a' => 1]; |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_INITIAL_METADATA => $metadata, |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $this->serverContext->setInitialMetadata($metadata); |
| $serverCallWriter->start(); |
| return $serverCallWriter; |
| } |
| |
| public function testStartWithMessage() |
| { |
| $metadata = ['a' => 1]; |
| $message = $this->newStringMessage(); |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_INITIAL_METADATA => $metadata, |
| \Grpc\OP_SEND_MESSAGE => ['message' => $message->serializeToString()], |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $this->serverContext->setInitialMetadata($metadata); |
| $serverCallWriter->start($message); |
| } |
| |
| public function testWriteStartWithMessageAndOptions() |
| { |
| $metadata = ['a' => 1]; |
| $message = $this->newStringMessage(); |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_INITIAL_METADATA => $metadata, |
| \Grpc\OP_SEND_MESSAGE => [ |
| 'message' => $message->serializeToString(), |
| 'flags' => 0x02, |
| ], |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $this->serverContext->setInitialMetadata($metadata); |
| $serverCallWriter->start($message, ['flags' => 0x02]); |
| } |
| |
| public function testWriteDataOnly() |
| { |
| $message = $this->newStringMessage(); |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_INITIAL_METADATA => [], |
| \Grpc\OP_SEND_MESSAGE => ['message' => $message->serializeToString()], |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $serverCallWriter->write($message); |
| } |
| |
| public function testWriteDataWithOptions() |
| { |
| $message = $this->newStringMessage(); |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_INITIAL_METADATA => [], |
| \Grpc\OP_SEND_MESSAGE => [ |
| 'message' => $message->serializeToString(), |
| 'flags' => 0x02 |
| ], |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $serverCallWriter->write($message, ['flags' => 0x02]); |
| } |
| |
| public function testWriteDataWithMetadata() |
| { |
| $metadata = ['a' => 1]; |
| $message = $this->newStringMessage(); |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_INITIAL_METADATA => $metadata, |
| \Grpc\OP_SEND_MESSAGE => ['message' => $message->serializeToString()], |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $this->serverContext->setInitialMetadata($metadata); |
| $serverCallWriter->write($message, []); |
| } |
| |
| public function testFinish() |
| { |
| $status = \Grpc\Status::status( |
| \Grpc\STATUS_INVALID_ARGUMENT, |
| "invalid argument", |
| ['trailiingMeta' => 100] |
| ); |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_STATUS_FROM_SERVER => $status, |
| \Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
| \Grpc\OP_SEND_INITIAL_METADATA => [], |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $this->serverContext->setStatus($status); |
| $serverCallWriter->finish(); |
| } |
| |
| public function testFinishWithMetadataAndMessage() |
| { |
| $metadata = ['a' => 1]; |
| $message = $this->newStringMessage(); |
| $status = \Grpc\Status::ok(['trailiingMeta' => 100]); |
| |
| $this->mockCall->expects($this->once()) |
| ->method('startBatch') |
| ->with($this->identicalTo([ |
| \Grpc\OP_SEND_STATUS_FROM_SERVER => $status, |
| \Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
| \Grpc\OP_SEND_INITIAL_METADATA => $metadata, |
| \Grpc\OP_SEND_MESSAGE => [ |
| 'message' => $message->serializeToString(), |
| 'flags' => 0x02, |
| ], |
| ])); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $this->serverContext->setInitialMetadata($metadata); |
| $this->serverContext->setStatus($status); |
| $serverCallWriter->finish($message, ['flags' => 0x02]); |
| } |
| |
| /** |
| * @todo `at` is deprecated and will be removed in phpunit 10 |
| */ |
| public function testStartWriteFinish() |
| { |
| $metadata = ['a' => 1]; |
| $metadata2 = ['a' => 2]; |
| $message1 = $this->newStringMessage(); |
| $message2 = $this->newStringMessage('another string'); |
| |
| $this->mockCall->expects($this->exactly(4)) |
| ->method('startBatch') |
| ->withConsecutive( |
| [$this->identicalTo([ |
| \Grpc\OP_SEND_INITIAL_METADATA => $metadata, |
| ])], |
| [$this->identicalTo([ |
| \Grpc\OP_SEND_MESSAGE => ['message' => $message1->serializeToString()], |
| ])], |
| [$this->identicalTo([ |
| \Grpc\OP_SEND_MESSAGE => [ |
| 'message' => $message2->serializeToString(), |
| 'flags' => 0x02, |
| ] |
| ])], |
| [$this->identicalTo([ |
| \Grpc\OP_SEND_STATUS_FROM_SERVER => \Grpc\Status::ok(), |
| \Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
| ])] |
| ); |
| |
| $serverCallWriter = new \Grpc\ServerCallWriter( |
| $this->mockCall, |
| $this->serverContext |
| ); |
| $this->serverContext->setInitialMetadata($metadata); |
| $serverCallWriter->start(); |
| $serverCallWriter->write($message1, [], $metadata2 /* should not send */); |
| $serverCallWriter->write($message2, ['flags' => 0x02]); |
| $serverCallWriter->finish(); |
| } |
| } |