Work on php version support and testing
This commit is contained in:
parent
34bf40a775
commit
5f7f53e7eb
@ -5,7 +5,9 @@ php:
|
|||||||
- 5.5
|
- 5.5
|
||||||
- 5.6
|
- 5.6
|
||||||
- 7
|
- 7
|
||||||
|
- 7.1
|
||||||
- hhvm
|
- hhvm
|
||||||
|
- nightly
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- export PATH=$HOME/.local/bin:$PATH
|
- export PATH=$HOME/.local/bin:$PATH
|
||||||
|
@ -32,7 +32,7 @@ class ClientNegotiator {
|
|||||||
|
|
||||||
// https://bugs.php.net/bug.php?id=73373
|
// https://bugs.php.net/bug.php?id=73373
|
||||||
// https://bugs.php.net/bug.php?id=74240 - need >=7.1.4 or >=7.0.18
|
// https://bugs.php.net/bug.php?id=74240 - need >=7.1.4 or >=7.0.18
|
||||||
$supported = version_compare(PHP_VERSION, '7.0.18', '>=') && !version_compare(PHP_VERSION, '7.1.4', '<');
|
$supported = PermessageDeflateOptions::permessageDeflateSupported();
|
||||||
if (!$supported) {
|
if (!$supported) {
|
||||||
if ($perMessageDeflateOptions->getDeflate()) {
|
if ($perMessageDeflateOptions->getDeflate()) {
|
||||||
trigger_error('permessage-deflate is being disabled because it is not support by your PHP version.', E_USER_NOTICE);
|
trigger_error('permessage-deflate is being disabled because it is not support by your PHP version.', E_USER_NOTICE);
|
||||||
|
@ -9,7 +9,8 @@ use Psr\Http\Message\ResponseInterface;
|
|||||||
final class PermessageDeflateOptions
|
final class PermessageDeflateOptions
|
||||||
{
|
{
|
||||||
const MAX_WINDOW_BITS = 15;
|
const MAX_WINDOW_BITS = 15;
|
||||||
const VALID_BITS = ['8', '9', '10', '11', '12', '13', '14', '15'];
|
/* this is a private instead of const for 5.4 compatibility */
|
||||||
|
private static $VALID_BITS = ['8', '9', '10', '11', '12', '13', '14', '15'];
|
||||||
|
|
||||||
private $deflate = false;
|
private $deflate = false;
|
||||||
|
|
||||||
@ -55,7 +56,7 @@ final class PermessageDeflateOptions
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function withServerMaxWindowBits($bits = self::MAX_WINDOW_BITS) {
|
public function withServerMaxWindowBits($bits = self::MAX_WINDOW_BITS) {
|
||||||
if (!in_array($bits, self::VALID_BITS)) {
|
if (!in_array($bits, self::$VALID_BITS)) {
|
||||||
throw new \Exception('server_max_window_bits must have a value between 8 and 15.');
|
throw new \Exception('server_max_window_bits must have a value between 8 and 15.');
|
||||||
}
|
}
|
||||||
$new = clone $this;
|
$new = clone $this;
|
||||||
@ -63,7 +64,7 @@ final class PermessageDeflateOptions
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function withClientMaxWindowBits($bits = self::MAX_WINDOW_BITS) {
|
public function withClientMaxWindowBits($bits = self::MAX_WINDOW_BITS) {
|
||||||
if (!in_array($bits, self::VALID_BITS)) {
|
if (!in_array($bits, self::$VALID_BITS)) {
|
||||||
throw new \Exception('client_max_window_bits must have a value between 8 and 15.');
|
throw new \Exception('client_max_window_bits must have a value between 8 and 15.');
|
||||||
}
|
}
|
||||||
$new = clone $this;
|
$new = clone $this;
|
||||||
@ -111,7 +112,7 @@ final class PermessageDeflateOptions
|
|||||||
$value = true;
|
$value = true;
|
||||||
break;
|
break;
|
||||||
case "server_max_window_bits":
|
case "server_max_window_bits":
|
||||||
if (!in_array($value, self::VALID_BITS)) {
|
if (!in_array($value, self::$VALID_BITS)) {
|
||||||
throw new InvalidPermessageDeflateOptionsException($key . ' must have a value between 8 and 15.');
|
throw new InvalidPermessageDeflateOptionsException($key . ' must have a value between 8 and 15.');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -119,7 +120,7 @@ final class PermessageDeflateOptions
|
|||||||
if ($value === null) {
|
if ($value === null) {
|
||||||
$value = '15';
|
$value = '15';
|
||||||
}
|
}
|
||||||
if (!in_array($value, self::VALID_BITS)) {
|
if (!in_array($value, self::$VALID_BITS)) {
|
||||||
throw new InvalidPermessageDeflateOptionsException($key . ' must have no value or a value between 8 and 15.');
|
throw new InvalidPermessageDeflateOptionsException($key . ' must have no value or a value between 8 and 15.');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -245,4 +246,19 @@ final class PermessageDeflateOptions
|
|||||||
|
|
||||||
return $request->withAddedHeader('Sec-Websocket-Extensions', $header);
|
return $request->withAddedHeader('Sec-Websocket-Extensions', $header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function permessageDeflateSupported($version = PHP_VERSION) {
|
||||||
|
if (!function_exists('deflate_init')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (version_compare($version, '7.1.3', '>')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (version_compare($version, '7.0.18', '>=')
|
||||||
|
&& version_compare($version, '7.1.0', '<')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ class ServerNegotiator implements NegotiatorInterface {
|
|||||||
|
|
||||||
// https://bugs.php.net/bug.php?id=73373
|
// https://bugs.php.net/bug.php?id=73373
|
||||||
// https://bugs.php.net/bug.php?id=74240 - need >=7.1.4 or >=7.0.18
|
// https://bugs.php.net/bug.php?id=74240 - need >=7.1.4 or >=7.0.18
|
||||||
$supported = version_compare(PHP_VERSION, '7.0.18', '>=') && !version_compare(PHP_VERSION, '7.1.4', '<');
|
$supported = PermessageDeflateOptions::permessageDeflateSupported();
|
||||||
if ($enablePerMessageDeflate && !$supported) {
|
if ($enablePerMessageDeflate && !$supported) {
|
||||||
trigger_error('permessage-deflate is being disabled because it is not support by your PHP version.', E_USER_NOTICE);
|
trigger_error('permessage-deflate is being disabled because it is not support by your PHP version.', E_USER_NOTICE);
|
||||||
$enablePerMessageDeflate = false;
|
$enablePerMessageDeflate = false;
|
||||||
|
@ -102,17 +102,19 @@ function getTestCases() {
|
|||||||
return $deferred->promise();
|
return $deferred->promise();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$cn = new \Ratchet\RFC6455\Handshake\ClientNegotiator(PermessageDeflateOptions::createDefault());
|
||||||
|
|
||||||
function runTest($case)
|
function runTest($case)
|
||||||
{
|
{
|
||||||
global $factory;
|
global $factory;
|
||||||
global $testServer;
|
global $testServer;
|
||||||
|
global $cn;
|
||||||
|
|
||||||
$casePath = "/runCase?case={$case}&agent=" . AGENT;
|
$casePath = "/runCase?case={$case}&agent=" . AGENT;
|
||||||
|
|
||||||
$deferred = new Deferred();
|
$deferred = new Deferred();
|
||||||
|
|
||||||
$factory->create($testServer, 9001)->then(function (\React\Stream\Stream $stream) use ($deferred, $casePath, $case) {
|
$factory->create($testServer, 9001)->then(function (\React\Stream\Stream $stream) use ($cn, $deferred, $casePath, $case) {
|
||||||
$cn = new \Ratchet\RFC6455\Handshake\ClientNegotiator(PermessageDeflateOptions::createDefault());
|
|
||||||
/** @var RequestInterface $cnRequest */
|
/** @var RequestInterface $cnRequest */
|
||||||
$cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001' . $casePath));
|
$cnRequest = $cn->generateRequest(new Uri('ws://127.0.0.1:9001' . $casePath));
|
||||||
|
|
||||||
|
14
tests/ab/fuzzingclient_skip_deflate.json
Normal file
14
tests/ab/fuzzingclient_skip_deflate.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"options": {
|
||||||
|
"failByDrop": false
|
||||||
|
}
|
||||||
|
, "outdir": "./reports/servers"
|
||||||
|
, "servers": [{
|
||||||
|
"agent": "RatchetRFC/0.1.0"
|
||||||
|
, "url": "ws://localhost:9001"
|
||||||
|
, "options": {"version": 18}
|
||||||
|
}]
|
||||||
|
, "cases": ["*"]
|
||||||
|
, "exclude-cases": ["12.*", "13.*"]
|
||||||
|
, "exclude-agent-cases": {}
|
||||||
|
}
|
10
tests/ab/fuzzingserver_skip_deflate.json
Normal file
10
tests/ab/fuzzingserver_skip_deflate.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"url": "ws://127.0.0.1:9001"
|
||||||
|
, "options": {
|
||||||
|
"failByDrop": false
|
||||||
|
}
|
||||||
|
, "outdir": "./reports/clients"
|
||||||
|
, "cases": ["*"]
|
||||||
|
, "exclude-cases": ["12.*", "13.*"]
|
||||||
|
, "exclude-agent-cases": {}
|
||||||
|
}
|
@ -1,11 +1,23 @@
|
|||||||
|
set -x
|
||||||
cd tests/ab
|
cd tests/ab
|
||||||
|
|
||||||
wstest -m fuzzingserver -s fuzzingserver.json &
|
SKIP_DEFLATE=
|
||||||
|
if [ "$TRAVIS" = "true" ]; then
|
||||||
|
if [ $(phpenv version-name) = "hhvm" -o $(phpenv version-name) = "5.4" -o $(phpenv version-name) = "5.5" -o $(phpenv version-name) = "5.6" ]; then
|
||||||
|
echo "Skipping deflate autobahn tests for $(phpenv version-name)"
|
||||||
|
SKIP_DEFLATE=_skip_deflate
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
wstest -m fuzzingserver -s fuzzingserver$SKIP_DEFLATE.json &
|
||||||
sleep 5
|
sleep 5
|
||||||
php clientRunner.php
|
php clientRunner.php
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|
||||||
php startServer.php &
|
php startServer.php &
|
||||||
|
PHP_SERVER_PID=$!
|
||||||
sleep 3
|
sleep 3
|
||||||
wstest -m fuzzingclient -s fuzzingclient.json
|
wstest -m fuzzingclient -s fuzzingclient$SKIP_DEFLATE.json
|
||||||
|
|
||||||
|
kill $PHP_SERVER_PID
|
||||||
|
29
tests/unit/Handshake/PermessageDeflateOptionsTest.php
Normal file
29
tests/unit/Handshake/PermessageDeflateOptionsTest.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Ratchet\RFC6455\Test\Unit\Handshake;
|
||||||
|
|
||||||
|
use Ratchet\RFC6455\Handshake\PermessageDeflateOptions;
|
||||||
|
|
||||||
|
class PermessageDeflateOptionsTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
public static function versionSupportProvider() {
|
||||||
|
return [
|
||||||
|
['7.0.17', false],
|
||||||
|
['7.0.18', true],
|
||||||
|
['7.0.200', true],
|
||||||
|
['5.6.0', false],
|
||||||
|
['7.1.3', false],
|
||||||
|
['7.1.4', true],
|
||||||
|
['7.1.200', true],
|
||||||
|
['10.0.0', true]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @requires function deflate_init
|
||||||
|
* @dataProvider versionSupportProvider
|
||||||
|
*/
|
||||||
|
public function testVersionSupport($version, $supported) {
|
||||||
|
$this->assertEquals($supported, PermessageDeflateOptions::permessageDeflateSupported($version));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user