修复错误,增加单测

pull/1/head
韩天峰 8 months ago
parent 0033a243d0
commit 16787142d6
  1. 47
      src/Php/Constants.php
  2. 46
      src/Php/Translator.php
  3. 63
      tests/std/dir/scandir_basic.phpt
  4. 33
      tests/std/misc/exec_basic1.phpt
  5. 11
      tests/std/misc/syslog_basic.phpt
  6. 25
      tests/std/misc/time_nanosleep_basic.phpt
  7. 18
      tests/std/network/bindto.phpt
  8. 15
      tests/std/network/closelog_basic.phpt
  9. 54
      tests/std/network/fsockopen_basic.phpt
  10. 41
      tests/std/network/fsockopen_error.phpt
  11. 38
      tests/std/network/fsockopen_variation1.phpt
  12. 48
      tests/std/network/fsockopen_variation2.phpt

@ -0,0 +1,47 @@
<?php
namespace PhpAot\Php;
class Constants
{
const array CPP_RESERVED_NAMES = [
'auto',
'break',
'case',
'catch',
'class',
'struct',
'const',
'continue',
'default',
'do',
'else',
'elseif',
'enum',
'extends',
'final',
'finally',
'for',
'function',
'global',
'if',
'int',
'double',
'float',
'false',
'for',
'if',
'int',
'new',
'null',
'or',
'and',
'private',
'protected',
'public',
'return',
'static',
'pipe',
'errno', // Linux error code
];
}

@ -57,45 +57,7 @@ class Translator extends \PhpAot\Core\Translator
'php_func_decl.h',
];
private array $reservedNames = [
'auto',
'break',
'case',
'catch',
'class',
'struct',
'const',
'continue',
'default',
'do',
'else',
'elseif',
'enum',
'extends',
'final',
'finally',
'for',
'function',
'global',
'if',
'int',
'double',
'float',
'false',
'for',
'if',
'int',
'new',
'null',
'or',
'and',
'private',
'protected',
'public',
'return',
'static',
'pipe',
];
private array $reservedNames;
private array $unsupportedFunctions = [
'compact',
@ -1978,7 +1940,7 @@ class Translator extends \PhpAot\Core\Translator
private function parseConstFetch(Node $expr): string
{
if ($expr->name->getType() != 'Name') {
if ($expr->name->getType() != 'Name' and !($expr->name instanceof Node\Name\FullyQualified)) {
abort($expr);
}
$name = $this->parseIdentifier($expr->name);
@ -1991,6 +1953,8 @@ class Translator extends \PhpAot\Core\Translator
return 'true';
} elseif ($name === 'false') {
return 'false';
} elseif ($name === 'PHP_EOL') {
return '"' . $this->escapeString(PHP_EOL) . '"';
}
return 'php::constant("' . $name . '")';
}
@ -2035,7 +1999,7 @@ class Translator extends \PhpAot\Core\Translator
private function escapeVarName(string $name): string
{
if (in_array($name, $this->reservedNames)) {
if (in_array($name, Constants::CPP_RESERVED_NAMES)) {
return '_php__var__' . $name;
} else {
return $name;

@ -0,0 +1,63 @@
--TEST--
Test scandir() function : basic functionality
--FILE--
<?php
/*
* Test basic functionality of scandir()
*/
echo "*** Testing scandir() : basic functionality ***\n";
// include file.inc for create_files function
include (__DIR__ . '/../file/file.inc');
// set up directory
$directory = __DIR__ . '/scandir_basic';
mkdir($directory);
create_files($directory, 3);
echo "\n-- scandir() with mandatory arguments --\n";
var_dump(scandir($directory));
echo "\n-- scandir() with all arguments --\n";
$sorting_order = SCANDIR_SORT_DESCENDING;
$context = stream_context_create();
var_dump(scandir($directory, $sorting_order, $context));
delete_files($directory, 3);
?>
--CLEAN--
<?php
$directory = __DIR__ . '/scandir_basic';
rmdir($directory);
?>
--EXPECT--
*** Testing scandir() : basic functionality ***
-- scandir() with mandatory arguments --
array(5) {
[0]=>
string(1) "."
[1]=>
string(2) ".."
[2]=>
string(9) "file1.tmp"
[3]=>
string(9) "file2.tmp"
[4]=>
string(9) "file3.tmp"
}
-- scandir() with all arguments --
array(5) {
[0]=>
string(9) "file3.tmp"
[1]=>
string(9) "file2.tmp"
[2]=>
string(9) "file1.tmp"
[3]=>
string(2) ".."
[4]=>
string(1) "."
}

@ -0,0 +1,33 @@
--TEST--
exec, system, passthru — Basic command execution functions
--SKIPIF--
<?php
// If this does not work for Windows, please uncomment or fix test
// if(substr(PHP_OS, 0, 3) == "WIN") die("skip not for Windows");
?>
--FILE--
<?php
$cmd = "echo abc\n\0command";
try {
var_dump(exec($cmd, $output));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump(system($cmd, $output));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
var_dump(passthru($cmd, $output));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
?>
--EXPECT--
string(3) "abc"
abc
string(3) "abc"
abc
NULL

@ -0,0 +1,11 @@
--TEST--
Basic syslog test
--FILE--
<?php
openlog('phpt', LOG_NDELAY | LOG_PID, LOG_USER);
syslog(LOG_WARNING, 'Basic syslog test');
closelog();
?>
--EXPECT--

@ -0,0 +1,25 @@
--TEST--
time_nanosleep — Delay for a number of seconds and nanoseconds
--SKIPIF--
<?php if (!function_exists('time_nanosleep')) die("skip");
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
?>
--CREDITS--
Àlex Corretgé - alex@corretge.cat
--FILE--
<?php
$nano = time_nanosleep(2, 100000);
if ($nano === true) {
echo "Slept for 2 seconds, 100 milliseconds.\n";
} elseif ($nano === false) {
echo "Sleeping failed.\n";
} elseif (is_array($nano)) {
$seconds = $nano['seconds'];
$nanoseconds = $nano['nanoseconds'];
echo "Interrupted by a signal.\n";
echo "Time remaining: $seconds seconds, $nanoseconds nanoseconds.";
}
?>
--EXPECT--
Slept for 2 seconds, 100 milliseconds.

@ -0,0 +1,18 @@
--TEST--
Test invalid bindto
--FILE--
<?php
$ctx = stream_context_create([
'socket' => [
'bindto' => 'invalid',
],
]);
$fp = stream_socket_client(
'tcp://www.' . str_repeat('x', 100) . '.com:80',
$errno, $errstr, 30, STREAM_CLIENT_CONNECT, $ctx
);
?>
--EXPECTF--
Warning: %s: php_network_getaddresses: getaddrinfo for www.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.com failed: %s in %s
Warning: %s: Unable to connect to tcp://www.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.com:80 (php_network_getaddresses: getaddrinfo for %s failed: %s) in %s

@ -0,0 +1,15 @@
--TEST--
Test closelog() function : basic functionality
--FILE--
<?php
echo "*** Testing closelog() : basic functionality ***\n";
// Zero arguments
echo "\n-- Testing closelog() function with Zero arguments --\n";
var_dump( closelog() );
?>
--EXPECT--
*** Testing closelog() : basic functionality ***
-- Testing closelog() function with Zero arguments --
bool(true)

@ -0,0 +1,54 @@
--TEST--
Test fsockopen() function : basic functionality
--FILE--
<?php
echo "*** Testing fsockopen() : basic functionality ***\n";
echo "Open a server socket\n";
for ($i=0; $i<100; $i++) {
$port = rand(10000, 65000);
/* Setup socket server */
$server = @stream_socket_server("tcp://127.0.0.1:$port");
if ($server) {
break;
}
}
// Initialise all required variables
$hostname = 'tcp://127.0.0.1'; // loopback address
$errno = null;
$errstr = null;
$timeout = 1.5;
echo "\nCalling fsockopen() with all possible arguments:\n";
$client = fsockopen($hostname, $port, $errno, $errstr, $timeout);
var_dump($client);
fclose($client);
echo "\nCalling fsockopen() with mandatory arguments:\n";
$second_client = fsockopen($hostname, $port);
var_dump($second_client);
fclose($second_client);
echo "\nCalling fsockopen() with address and port in same string:\n";
$address = $hostname . ':' . $port;
$third_client = fsockopen($address);
var_dump($third_client);
fclose($third_client);
echo "Done";
?>
--EXPECTF--
*** Testing fsockopen() : basic functionality ***
Open a server socket
Calling fsockopen() with all possible arguments:
resource(%d) of type (stream)
Calling fsockopen() with mandatory arguments:
resource(%d) of type (stream)
Calling fsockopen() with address and port in same string:
resource(%d) of type (stream)
Done

@ -0,0 +1,41 @@
--TEST--
Test fsockopen() function : error conditions
--FILE--
<?php
echo "*** Testing fsockopen() : basic error conditions ***\n";
echo "\n-- Attempting to connect to a non-existent socket --\n";
$hostname = 'tcp://127.0.0.1'; // loopback address
$port = 31337;
$errno = null;
$errstr = null;
$timeout = 1.5;
var_dump( fsockopen($hostname, $port, $errno, $errstr, $timeout) );
var_dump($errstr);
echo "\n-- Attempting to connect using an invalid protocol --\n";
$hostname = 'invalid://127.0.0.1'; // loopback address
$port = 31337;
$errno = null;
$errstr = null;
$timeout = 1.5;
var_dump( fsockopen($hostname, $port, $errno, $errstr, $timeout) );
var_dump($errstr);
echo "Done";
?>
--EXPECTF--
*** Testing fsockopen() : basic error conditions ***
-- Attempting to connect to a non-existent socket --
Warning: %s: Unable to connect to tcp://127.0.0.1:31337 (%a) in %s
bool(false)
string(%d) "%a"
-- Attempting to connect using an invalid protocol --
Warning: %s: Unable to connect to invalid://127.0.0.1:31337 (Unable to find the socket transport "invalid" - did you forget to enable it when you configured PHP?) in %s
bool(false)
string(100) "Unable to find the socket transport "invalid" - did you forget to enable it when you configured PHP?"
Done

@ -0,0 +1,38 @@
--TEST--
testing fsockopen without a protocol string
--FILE--
<?php
echo "Open a server socket\n";
for ($i=0; $i<100; $i++) {
$port = rand(10000, 65000);
/* Setup socket server */
$server = @stream_socket_server("tcp://127.0.0.1:$port");
if ($server) {
break;
}
}
echo "\nCalling fsockopen() without a protocol in the hostname string:\n";
$hostname = '127.0.0.1';
$client = fsockopen($hostname, $port);
var_dump($client);
fclose($client);
echo "\nCalling fsockopen() with address and port in same string, without a protocol:\n";
$address = $hostname . ':' . $port;
$second_client = fsockopen($address);
var_dump($second_client);
fclose($second_client);
echo "Done";
?>
--EXPECTF--
Open a server socket
Calling fsockopen() without a protocol in the hostname string:
resource(%d) of type (stream)
Calling fsockopen() with address and port in same string, without a protocol:
resource(%d) of type (stream)
Done

@ -0,0 +1,48 @@
--TEST--
testing fsockopen() with udp sockets
--FILE--
<?php
$hostname = 'udp://127.0.0.1';
$port = '31337';
echo "Open a server socket\n";
$server = stream_socket_server($hostname . ':' . $port, $errno, $errstr, STREAM_SERVER_BIND);
echo "\nCalling fsockopen():\n";
$client = fsockopen($hostname, $port);
var_dump($client);
echo "\nPass some data between the sockets:\n";
fwrite($client, "0123456789");
var_dump(fread($server, 10));
fclose($client);
echo "\nCalling fsockopen() with address and port in same string:\n";
$address = $hostname . ':' . $port;
$second_client = fsockopen($address);
var_dump($second_client);
echo "\nPass some data between the sockets:\n";
fwrite($second_client, "0123456789");
var_dump(fread($server, 10));
fclose($second_client);
echo "Done";
?>
--EXPECTF--
Open a server socket
Calling fsockopen():
resource(%d) of type (stream)
Pass some data between the sockets:
string(10) "0123456789"
Calling fsockopen() with address and port in same string:
resource(%d) of type (stream)
Pass some data between the sockets:
string(10) "0123456789"
Done
Loading…
Cancel
Save