From 8983724ce72b1bd59db8563505de669114393f00 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 23 Feb 2024 20:31:35 +0000 Subject: [PATCH] Zend: Add tests for exit/die --- Zend/tests/bug77339.phpt | 2 +- .../exit/define_class_members_exit_die.phpt | 37 ++++ Zend/tests/exit/define_die_constant.phpt | 12 ++ .../exit/define_die_constant_namespace.phpt | 14 ++ Zend/tests/exit/define_die_function.phpt | 10 + .../exit/define_die_function_namespace.phpt | 14 ++ Zend/tests/exit/define_exit_constant.phpt | 12 ++ .../exit/define_exit_constant_namespace.phpt | 14 ++ Zend/tests/exit/define_exit_function.phpt | 10 + .../exit/define_exit_function_namespace.phpt | 12 ++ Zend/tests/exit/define_goto_label_die.phpt | 14 ++ .../exit/define_goto_label_die_with_jump.phpt | 14 ++ Zend/tests/exit/define_goto_label_exit.phpt | 14 ++ .../define_goto_label_exit_with_jump.phpt | 14 ++ .../{ => exit}/die_string_cast_exception.phpt | 0 Zend/tests/exit/disabling_die.phpt | 11 ++ Zend/tests/exit/disabling_exit.phpt | 11 ++ Zend/tests/exit/exit_as_function.phpt | 23 +++ Zend/tests/exit/exit_statements.phpt | 46 +++++ Zend/tests/exit/exit_values.phpt | 183 ++++++++++++++++++ Zend/tests/generators/yield_precedence.phpt | 4 +- Zend/tests/gh9916-006.phpt | 2 +- Zend/tests/jump12.phpt | 2 +- Zend/tests/throw/leaks.phpt | 2 +- 24 files changed, 471 insertions(+), 6 deletions(-) create mode 100644 Zend/tests/exit/define_class_members_exit_die.phpt create mode 100644 Zend/tests/exit/define_die_constant.phpt create mode 100644 Zend/tests/exit/define_die_constant_namespace.phpt create mode 100644 Zend/tests/exit/define_die_function.phpt create mode 100644 Zend/tests/exit/define_die_function_namespace.phpt create mode 100644 Zend/tests/exit/define_exit_constant.phpt create mode 100644 Zend/tests/exit/define_exit_constant_namespace.phpt create mode 100644 Zend/tests/exit/define_exit_function.phpt create mode 100644 Zend/tests/exit/define_exit_function_namespace.phpt create mode 100644 Zend/tests/exit/define_goto_label_die.phpt create mode 100644 Zend/tests/exit/define_goto_label_die_with_jump.phpt create mode 100644 Zend/tests/exit/define_goto_label_exit.phpt create mode 100644 Zend/tests/exit/define_goto_label_exit_with_jump.phpt rename Zend/tests/{ => exit}/die_string_cast_exception.phpt (100%) create mode 100644 Zend/tests/exit/disabling_die.phpt create mode 100644 Zend/tests/exit/disabling_exit.phpt create mode 100644 Zend/tests/exit/exit_as_function.phpt create mode 100644 Zend/tests/exit/exit_statements.phpt create mode 100644 Zend/tests/exit/exit_values.phpt diff --git a/Zend/tests/bug77339.phpt b/Zend/tests/bug77339.phpt index c21b8cbad2943..07b03b92527a9 100644 --- a/Zend/tests/bug77339.phpt +++ b/Zend/tests/bug77339.phpt @@ -9,7 +9,7 @@ class Foo if (!isset($arguments[0])) { var_dump(['getSomeWhat']); var_dump($arguments); - exit; + exit(); } } echo "OK\n"; diff --git a/Zend/tests/exit/define_class_members_exit_die.phpt b/Zend/tests/exit/define_class_members_exit_die.phpt new file mode 100644 index 0000000000000..0a3816dc0d065 --- /dev/null +++ b/Zend/tests/exit/define_class_members_exit_die.phpt @@ -0,0 +1,37 @@ +--TEST-- +Can define die and exit as class methods, constants and property +--FILE-- +exit); +var_dump($o->die); +var_dump($o->exit()); +var_dump($o->die()); + +?> +--EXPECT-- +int(5) +int(10) +NULL +NULL +int(20) +int(15) diff --git a/Zend/tests/exit/define_die_constant.phpt b/Zend/tests/exit/define_die_constant.phpt new file mode 100644 index 0000000000000..393904d9356dd --- /dev/null +++ b/Zend/tests/exit/define_die_constant.phpt @@ -0,0 +1,12 @@ +--TEST-- +Attempting to define die constant +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting identifier in %s on line %d diff --git a/Zend/tests/exit/define_die_constant_namespace.phpt b/Zend/tests/exit/define_die_constant_namespace.phpt new file mode 100644 index 0000000000000..b68038ba10fb7 --- /dev/null +++ b/Zend/tests/exit/define_die_constant_namespace.phpt @@ -0,0 +1,14 @@ +--TEST-- +Attempting to define die constant in a namespace +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting identifier in %s on line %d diff --git a/Zend/tests/exit/define_die_function.phpt b/Zend/tests/exit/define_die_function.phpt new file mode 100644 index 0000000000000..4ea41d6ced5bd --- /dev/null +++ b/Zend/tests/exit/define_die_function.phpt @@ -0,0 +1,10 @@ +--TEST-- +Attempting to define die() function +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting "(" in %s on line %d diff --git a/Zend/tests/exit/define_die_function_namespace.phpt b/Zend/tests/exit/define_die_function_namespace.phpt new file mode 100644 index 0000000000000..fece46cb7acd6 --- /dev/null +++ b/Zend/tests/exit/define_die_function_namespace.phpt @@ -0,0 +1,14 @@ +--TEST-- +Attempting to define die() function in a namespace +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting "(" in %s on line %d diff --git a/Zend/tests/exit/define_exit_constant.phpt b/Zend/tests/exit/define_exit_constant.phpt new file mode 100644 index 0000000000000..33cd073401223 --- /dev/null +++ b/Zend/tests/exit/define_exit_constant.phpt @@ -0,0 +1,12 @@ +--TEST-- +Attempting to define exit constant +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting identifier in %s on line %d diff --git a/Zend/tests/exit/define_exit_constant_namespace.phpt b/Zend/tests/exit/define_exit_constant_namespace.phpt new file mode 100644 index 0000000000000..8d0097bb9da3c --- /dev/null +++ b/Zend/tests/exit/define_exit_constant_namespace.phpt @@ -0,0 +1,14 @@ +--TEST-- +Attempting to define exit constant in a namespace +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting identifier in %s on line %d diff --git a/Zend/tests/exit/define_exit_function.phpt b/Zend/tests/exit/define_exit_function.phpt new file mode 100644 index 0000000000000..4c406ef0d8905 --- /dev/null +++ b/Zend/tests/exit/define_exit_function.phpt @@ -0,0 +1,10 @@ +--TEST-- +Attempting to define exit() function +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting "(" in %s on line %d diff --git a/Zend/tests/exit/define_exit_function_namespace.phpt b/Zend/tests/exit/define_exit_function_namespace.phpt new file mode 100644 index 0000000000000..9ea785b0e53ba --- /dev/null +++ b/Zend/tests/exit/define_exit_function_namespace.phpt @@ -0,0 +1,12 @@ +--TEST-- +Attempting to define exit() function in a namespace +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting "(" in %s on line %d diff --git a/Zend/tests/exit/define_goto_label_die.phpt b/Zend/tests/exit/define_goto_label_die.phpt new file mode 100644 index 0000000000000..b94ee13fa0abe --- /dev/null +++ b/Zend/tests/exit/define_goto_label_die.phpt @@ -0,0 +1,14 @@ +--TEST-- +Attempting to define a goto label called die +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token ":" in %s on line %d diff --git a/Zend/tests/exit/define_goto_label_die_with_jump.phpt b/Zend/tests/exit/define_goto_label_die_with_jump.phpt new file mode 100644 index 0000000000000..fc755d52a5794 --- /dev/null +++ b/Zend/tests/exit/define_goto_label_die_with_jump.phpt @@ -0,0 +1,14 @@ +--TEST-- +Attempting to define a goto label called die and jump to it +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting identifier in %s on line %d diff --git a/Zend/tests/exit/define_goto_label_exit.phpt b/Zend/tests/exit/define_goto_label_exit.phpt new file mode 100644 index 0000000000000..a72b6bac2d2a4 --- /dev/null +++ b/Zend/tests/exit/define_goto_label_exit.phpt @@ -0,0 +1,14 @@ +--TEST-- +Attempting to define a goto label called exit +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token ":" in %s on line %d diff --git a/Zend/tests/exit/define_goto_label_exit_with_jump.phpt b/Zend/tests/exit/define_goto_label_exit_with_jump.phpt new file mode 100644 index 0000000000000..a810f2c44c2d8 --- /dev/null +++ b/Zend/tests/exit/define_goto_label_exit_with_jump.phpt @@ -0,0 +1,14 @@ +--TEST-- +Attempting to define a goto label called exit and jump to it +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "exit", expecting identifier in %s on line %d diff --git a/Zend/tests/die_string_cast_exception.phpt b/Zend/tests/exit/die_string_cast_exception.phpt similarity index 100% rename from Zend/tests/die_string_cast_exception.phpt rename to Zend/tests/exit/die_string_cast_exception.phpt diff --git a/Zend/tests/exit/disabling_die.phpt b/Zend/tests/exit/disabling_die.phpt new file mode 100644 index 0000000000000..85a3d6daa8ef9 --- /dev/null +++ b/Zend/tests/exit/disabling_die.phpt @@ -0,0 +1,11 @@ +--TEST-- +Using disable_functions INI to remove die +--INI-- +disable_functions=die +--FILE-- + +--EXPECT-- diff --git a/Zend/tests/exit/disabling_exit.phpt b/Zend/tests/exit/disabling_exit.phpt new file mode 100644 index 0000000000000..fb72226a98518 --- /dev/null +++ b/Zend/tests/exit/disabling_exit.phpt @@ -0,0 +1,11 @@ +--TEST-- +Using disable_functions INI to remove exit +--INI-- +disable_functions=exit +--FILE-- + +--EXPECT-- diff --git a/Zend/tests/exit/exit_as_function.phpt b/Zend/tests/exit/exit_as_function.phpt new file mode 100644 index 0000000000000..c1487da7ed841 --- /dev/null +++ b/Zend/tests/exit/exit_as_function.phpt @@ -0,0 +1,23 @@ +--TEST-- +exit() as function +--FILE-- + +--EXPECTF-- +Parse error: syntax error, unexpected token "...", expecting ")" in %s on line %d diff --git a/Zend/tests/exit/exit_statements.phpt b/Zend/tests/exit/exit_statements.phpt new file mode 100644 index 0000000000000..efd0496f2a1cb --- /dev/null +++ b/Zend/tests/exit/exit_statements.phpt @@ -0,0 +1,46 @@ +--TEST-- +Using exit/die as a statement/constant +--FILE-- +getMessage(), PHP_EOL; +} + +TEMPLATE; + + +$php = getenv('TEST_PHP_EXECUTABLE_ESCAPED'); +$command = $php . ' ' . escapeshellarg(FILE_PATH); + +foreach (['exit', 'die'] as $value) { + echo 'Using ', $value, ' as value:', PHP_EOL; + $output = []; + $content = str_replace('FUNCTION', $value, FILE_CONTENT); + file_put_contents(FILE_PATH, $content); + exec($command, $output, $exit_status); + echo 'Exit status is: ', $exit_status, PHP_EOL, + 'Output is:', PHP_EOL, join($output), PHP_EOL; +} + +?> +--CLEAN-- + +--EXPECT-- +Using exit as value: +Exit status is: 0 +Output is: +Before exit +Using die as value: +Exit status is: 0 +Output is: +Before die diff --git a/Zend/tests/exit/exit_values.phpt b/Zend/tests/exit/exit_values.phpt new file mode 100644 index 0000000000000..2f53a870f9fe1 --- /dev/null +++ b/Zend/tests/exit/exit_values.phpt @@ -0,0 +1,183 @@ +--TEST-- +exit(false); +--FILE-- +getMessage(), PHP_EOL; +} + +TEMPLATE; + +$php = getenv('TEST_PHP_EXECUTABLE_ESCAPED'); +$command = $php . ' ' . escapeshellarg(FILE_PATH); + +foreach ([FILE_CONTENT, str_replace('exit', 'die', FILE_CONTENT)] as $code) { + foreach ($values as $value) { + echo 'Using ', zend_test_var_export($value), ' as value:', PHP_EOL; + $output = []; + $content = str_replace('VALUE', zend_test_var_export($value), $code); + file_put_contents(FILE_PATH, $content); + exec($command, $output, $exit_status); + echo 'Exit status is: ', $exit_status, PHP_EOL, + 'Output is:', PHP_EOL, join($output), PHP_EOL; + } + + echo 'As a statement:', PHP_EOL; + $output = []; + $content = str_replace('(VALUE)', '', $code); + exec($command, $output, $exit_status); + echo 'Exit status is: ', $exit_status, PHP_EOL, + 'Output is:', PHP_EOL, join($output), PHP_EOL; +} + +?> +--CLEAN-- + +--EXPECTF-- +Using NULL as value: +Exit status is: 0 +Output is: + +Using false as value: +Exit status is: 0 +Output is: + +Using true as value: +Exit status is: 0 +Output is: +1 +Using 0 as value: +Exit status is: 0 +Output is: + +Using 1 as value: +Exit status is: 1 +Output is: + +Using 20 as value: +Exit status is: 20 +Output is: + +Using 10.0 as value: +Exit status is: 0 +Output is: +10 +Using 15.5 as value: +Exit status is: 0 +Output is: +15.5 +Using 'Hello world' as value: +Exit status is: 0 +Output is: +Hello world +Using [] as value: +Exit status is: 0 +Output is: +Warning: Array to string conversion in %s on line 3Array +Using STDERR as value: +Exit status is: 0 +Output is: +Resource id #3 +Using new stdClass() as value: +Exit status is: 0 +Output is: +Error: Object of class stdClass could not be converted to string +As a statement: +Exit status is: 0 +Output is: +Error: Object of class stdClass could not be converted to string +Using NULL as value: +Exit status is: 0 +Output is: + +Using false as value: +Exit status is: 0 +Output is: + +Using true as value: +Exit status is: 0 +Output is: +1 +Using 0 as value: +Exit status is: 0 +Output is: + +Using 1 as value: +Exit status is: 1 +Output is: + +Using 20 as value: +Exit status is: 20 +Output is: + +Using 10.0 as value: +Exit status is: 0 +Output is: +10 +Using 15.5 as value: +Exit status is: 0 +Output is: +15.5 +Using 'Hello world' as value: +Exit status is: 0 +Output is: +Hello world +Using [] as value: +Exit status is: 0 +Output is: +Warning: Array to string conversion in %s on line 3Array +Using STDERR as value: +Exit status is: 0 +Output is: +Resource id #3 +Using new stdClass() as value: +Exit status is: 0 +Output is: +Error: Object of class stdClass could not be converted to string +As a statement: +Exit status is: 0 +Output is: +Error: Object of class stdClass could not be converted to string diff --git a/Zend/tests/generators/yield_precedence.phpt b/Zend/tests/generators/yield_precedence.phpt index 6b87fa0364db9..a028f0e91b529 100644 --- a/Zend/tests/generators/yield_precedence.phpt +++ b/Zend/tests/generators/yield_precedence.phpt @@ -5,9 +5,9 @@ Precedence of yield and arrow operators function gen() { yield "a" . "b"; - yield "a" or die; + yield "a" or die(); yield "k" => "a" . "b"; - yield "k" => "a" or die; + yield "k" => "a" or die(); var_dump([yield "k" => "a" . "b"]); yield yield "k1" => yield "k2" => "a" . "b"; yield yield "k1" => (yield "k2") => "a" . "b"; diff --git a/Zend/tests/gh9916-006.phpt b/Zend/tests/gh9916-006.phpt index 28c57105c7b1f..fc97f4813f423 100644 --- a/Zend/tests/gh9916-006.phpt +++ b/Zend/tests/gh9916-006.phpt @@ -14,7 +14,7 @@ $gen = (function() { yield from (function () { $x = new stdClass; print "Before exit\n"; - exit; + exit(); print "Not executed\n"; yield; })(); diff --git a/Zend/tests/jump12.phpt b/Zend/tests/jump12.phpt index 3c244d6181995..9c759f379fe18 100644 --- a/Zend/tests/jump12.phpt +++ b/Zend/tests/jump12.phpt @@ -7,7 +7,7 @@ goto c; declare (ticks=1) { b: print "ok!\n"; - exit; + exit(); } c: print "ok!\n"; diff --git a/Zend/tests/throw/leaks.phpt b/Zend/tests/throw/leaks.phpt index 0f9311a820c04..2cf9b9d29b9aa 100644 --- a/Zend/tests/throw/leaks.phpt +++ b/Zend/tests/throw/leaks.phpt @@ -24,7 +24,7 @@ try { var_dump(error_reporting()); // Exit also unwinds and thus has the same basic problem. -new stdClass(exit); +new stdClass(exit()); ?> --EXPECT--