Skip to content

Commit

Permalink
[THRIFT-5757] Unit tests for php lib
Browse files Browse the repository at this point in the history
  • Loading branch information
sveneld committed Mar 18, 2024
1 parent 0e72363 commit a47eb3a
Show file tree
Hide file tree
Showing 13 changed files with 577 additions and 8 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
"php-mock/php-mock-phpunit": "^2.10",
"ext-json": "*",
"ext-xml": "*",
"ext-curl": "*"
"ext-curl": "*",
"ext-pcntl": "*"
},
"autoload": {
"psr-4": {"Thrift\\": "lib/php/lib/"}
Expand Down
21 changes: 20 additions & 1 deletion lib/php/lib/Factory/TFramedTransportFactory.php
Original file line number Diff line number Diff line change
@@ -1,13 +1,32 @@
<?php

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

namespace Thrift\Factory;

use Thrift\Transport\TFramedTransport;
use Thrift\Transport\TTransport;

class TFramedTransportFactory implements TTransportFactoryInterface
{
public static function getTransport(TTransport $transport)
public function getTransport(TTransport $transport)
{
return new TFramedTransport($transport);
}
Expand Down
22 changes: 20 additions & 2 deletions lib/php/lib/Factory/TTransportFactory.php
Original file line number Diff line number Diff line change
@@ -1,17 +1,35 @@
<?php

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

namespace Thrift\Factory;

use Thrift\Transport\TTransport;

class TTransportFactory implements TTransportFactoryInterface
{
/**
* @static
* @param TTransport $transport
* @return TTransport
*/
public static function getTransport(TTransport $transport)
public function getTransport(TTransport $transport)
{
return $transport;
}
Expand Down
22 changes: 20 additions & 2 deletions lib/php/lib/Factory/TTransportFactoryInterface.php
Original file line number Diff line number Diff line change
@@ -1,15 +1,33 @@
<?php

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

namespace Thrift\Factory;

use Thrift\Transport\TTransport;

interface TTransportFactoryInterface
{
/**
* @static
* @param TTransport $transport
* @return TTransport
*/
public static function getTransport(TTransport $transport);
public function getTransport(TTransport $transport);
}
4 changes: 4 additions & 0 deletions lib/php/lib/Server/TSSLServerSocket.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ public function __construct($host = 'localhost', $port = 9090, $context = null)
{
$ssl_host = $this->getSSLHost($host);
parent::__construct($ssl_host, $port);
// Initialize a stream context if not provided
if ($context === null) {
$context = stream_context_create();
}
$this->context_ = $context;
}

Expand Down
1 change: 1 addition & 0 deletions lib/php/lib/Server/TServerTransport.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Thrift\Server;

use Thrift\Exception\TTransportException;
use Thrift\Transport\TTransport;

/**
* Generic class for Server agent.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function testGetTransport()
{
$transport = $this->createMock(TTransport::class);
$factory = new TFramedTransportFactory();
$framedTransport = $factory::getTransport($transport);
$framedTransport = $factory->getTransport($transport);

$this->assertInstanceOf(TFramedTransport::class, $framedTransport);

Expand Down
2 changes: 1 addition & 1 deletion lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public function testGetTransport()
{
$transport = $this->createMock(TTransport::class);
$factory = new TTransportFactory();
$result = $factory::getTransport($transport);
$result = $factory->getTransport($transport);

$this->assertSame($transport, $result);
}
Expand Down
30 changes: 30 additions & 0 deletions lib/php/test/Unit/Lib/Server/Fixture/TestProcessor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

namespace Test\Thrift\Unit\Lib\Server\Fixture;

class TestProcessor
{
public function process($input, $output)
{
return true;
}
}
32 changes: 32 additions & 0 deletions lib/php/test/Unit/Lib/Server/TForkingServerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

namespace Test\Thrift\Unit\Lib\Server;

use PHPUnit\Framework\TestCase;

class TForkingServerTest extends TestCase
{
public function testServe(): void
{
$this->markTestSkipped('Unit test could not be written for class which use pcntl_fork and exit functions');
}
}
151 changes: 151 additions & 0 deletions lib/php/test/Unit/Lib/Server/TSSLServerSocketTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
<?php

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

namespace Test\Thrift\Unit\Lib\Server;

use phpmock\phpunit\PHPMock;
use PHPUnit\Framework\TestCase;
use Thrift\Exception\TTransportException;
use Thrift\Server\TSSLServerSocket;
use Thrift\Transport\TSocket;

class TSSLServerSocketTest extends TestCase
{
use PHPMock;

public function testGetSSLHost()
{
$socket = new TSSLServerSocket();

$this->assertEquals('ssl://localhost', $socket->getSSLHost('localhost'));
$this->assertEquals('ssl://localhost', $socket->getSSLHost('ssl://localhost'));
$this->assertEquals('tcp://localhost', $socket->getSSLHost('tcp://localhost'));
}

public function testListenAndClose(): void
{
$options = [
'ssl' => [
'verify_peer' => true,
'verify_peer_name' => true,
'allow_self_signed' => true,
],
];
$context = stream_context_create($options);
$socket = new TSSLServerSocket('somehost', 999, $context);

$listener = tmpfile();
$this->getFunctionMock('Thrift\Server', 'stream_socket_server')
->expects($this->once())
->with(
'ssl://somehost:999', #$address
$this->anything(), #&$error_code
$this->anything(), #&$error_string
STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, #int $flags
$this->callback(function ($context) use ($options) {
$contextOptions = stream_context_get_options($context);

return is_resource($context) && $options === $contextOptions;
})#resource $context
)->willReturn($listener);

$socket->listen();

$reflection = new \ReflectionClass($socket);
$property = $reflection->getProperty('listener_');
$property->setAccessible(true);

$this->assertIsResource($property->getValue($socket));

$this->getFunctionMock('Thrift\Server', 'fclose')
->expects($this->once())
->with($this->equalTo($listener))
->willReturn(true);

$socket->close();
$this->assertNull($property->getValue($socket));
}

public function testAccept()
{
$socket = new TSSLServerSocket('somehost', 999);
$socket->setAcceptTimeout(1000);

$listener = tmpfile();
$this->getFunctionMock('Thrift\Server', 'stream_socket_server')
->expects($this->once())
->with(
'ssl://somehost:999', #$address
$this->anything(), #&$error_code
$this->anything(), #&$error_string
STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, #int $flags
$this->callback(function ($context) {
$contextOptions = stream_context_get_options($context);

return is_resource($context) && $contextOptions === [];
}) #resource $context
)->willReturn($listener);

$transportHandle = tmpfile();
$this->getFunctionMock('Thrift\Server', 'stream_socket_accept')
->expects($this->once())
->with(
$this->equalTo($listener),
1
)->willReturn($transportHandle);

$socket->listen();
$result = $socket->accept();
$this->assertInstanceOf(TSocket::class, $result);

$reflection = new \ReflectionClass($result);
$property = $reflection->getProperty('handle_');
$property->setAccessible(true);
$this->assertEquals($transportHandle, $property->getValue($result));
}

public function testAcceptFailed()
{
$socket = new TSSLServerSocket('somehost', 999);
$socket->setAcceptTimeout(1000);

$listener = tmpfile();

$this->getFunctionMock('Thrift\Server', 'stream_socket_server')
->expects($this->once())
->with('ssl://somehost:999')
->willReturn($listener);

$transportHandle = tmpfile();
$this->getFunctionMock('Thrift\Server', 'stream_socket_accept')
->expects($this->once())
->with(
$this->equalTo($listener),
1
)->willReturn(null);

$this->expectException(TTransportException::class);
$this->expectExceptionMessage('accept() may not return NULL');

$socket->listen();
$socket->accept();
}
}
Loading

0 comments on commit a47eb3a

Please sign in to comment.