<?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/MethodDescriptor.php');
require_once(dirname(__FILE__) . '/../../lib/Grpc/RpcServer.php');

class RpcServerTest extends \PHPUnit\Framework\TestCase
{
    private $server;
    private $mockService;

    public function setUp(): void
    {
        $this->server = new \Grpc\RpcServer();
        $this->mockService = $this->getMockBuilder(stdClass::class)
            ->setMethods(['getMethodDescriptors', 'hello'])
            ->getMock();
    }

    public function testHandleServices()
    {
        $helloMethodDescriptor = new \Grpc\MethodDescriptor(
            $this->mockService,
            'hello',
            'String',
            \Grpc\MethodDescriptor::UNARY_CALL
        );
        $this->mockService->expects($this->once())
            ->method('getMethodDescriptors')
            ->with()
            ->will($this->returnValue([
                '/test/hello' => $helloMethodDescriptor
            ]));

        $pathMap = $this->server->handle($this->mockService);
        $this->assertEquals($pathMap, [
            '/test/hello' => $helloMethodDescriptor
        ]);

        $mockService2 = $this->getMockBuilder(stdClass::class)
            ->setMethods(['getMethodDescriptors', 'hello', 'bye'])
            ->getMock();
        $helloMethodDescriptor2 = new \Grpc\MethodDescriptor(
            $this->mockService,
            'hello',
            'Number',
            \Grpc\MethodDescriptor::UNARY_CALL
        );
        $byeMethodDescritor = new \Grpc\MethodDescriptor(
            $this->mockService,
            'bye',
            'String',
            \Grpc\MethodDescriptor::UNARY_CALL
        );
        $mockService2->expects($this->once())
            ->method('getMethodDescriptors')
            ->with()
            ->will($this->returnValue([
                '/test/hello' => $helloMethodDescriptor2,
                '/test/bye' => $byeMethodDescritor
            ]));

        $pathMap = $this->server->handle($mockService2);
        $this->assertEquals($pathMap, [
            '/test/hello' => $helloMethodDescriptor2,
            '/test/bye' => $byeMethodDescritor
        ]);
    }
}
