From 7f54b3d3f06a046b4a88fae800a379bd3259ea8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Wed, 6 Oct 2021 15:50:38 +0200 Subject: [PATCH] Add tests for function/class declared in a file included repeatedly --- .../repeated_include/anonymous_class.inc | 7 ++ .../repeated_include/anonymous_class.phpt | 64 +++++++++++++++++++ .../repeated_include/anonymous_function.inc | 7 ++ .../repeated_include/anonymous_function.phpt | 33 ++++++++++ Zend/tests/repeated_include/class_in_if.inc | 9 +++ Zend/tests/repeated_include/class_in_if.phpt | 32 ++++++++++ .../tests/repeated_include/function_in_if.inc | 7 ++ .../repeated_include/function_in_if.phpt | 32 ++++++++++ 8 files changed, 191 insertions(+) create mode 100644 Zend/tests/repeated_include/anonymous_class.inc create mode 100644 Zend/tests/repeated_include/anonymous_class.phpt create mode 100644 Zend/tests/repeated_include/anonymous_function.inc create mode 100644 Zend/tests/repeated_include/anonymous_function.phpt create mode 100644 Zend/tests/repeated_include/class_in_if.inc create mode 100644 Zend/tests/repeated_include/class_in_if.phpt create mode 100644 Zend/tests/repeated_include/function_in_if.inc create mode 100644 Zend/tests/repeated_include/function_in_if.phpt diff --git a/Zend/tests/repeated_include/anonymous_class.inc b/Zend/tests/repeated_include/anonymous_class.inc new file mode 100644 index 0000000000000..69010dd15afbf --- /dev/null +++ b/Zend/tests/repeated_include/anonymous_class.inc @@ -0,0 +1,7 @@ + new class() { + public static function verify() { + return 'ok'; + } +}); diff --git a/Zend/tests/repeated_include/anonymous_class.phpt b/Zend/tests/repeated_include/anonymous_class.phpt new file mode 100644 index 0000000000000..3c384cf63a893 --- /dev/null +++ b/Zend/tests/repeated_include/anonymous_class.phpt @@ -0,0 +1,64 @@ +--TEST-- +Repeated include must not increase memory - anonymous class +--SKIPIF-- + false])['opcache_enabled']) { + die('xfail test currently requires opcache enabled'); +} +?> +--FILE-- + */ + private static $classNameByFxHash = []; + + private function __construct() + { + } + + public static function get_class(\Closure $createAnonymousClassFx): string + { + $fxRefl = new \ReflectionFunction($createAnonymousClassFx); + $fxHash = $fxRefl->getFileName() . ':' . $fxRefl->getStartLine() . '-' . $fxRefl->getEndLine(); + + if (!isset(self::$classNameByFxHash[$fxHash])) { + self::$classNameByFxHash[$fxHash] = get_class($createAnonymousClassFx()); + } + + return self::$classNameByFxHash[$fxHash]; + } +} + +$classNamePrev = null; +$m = -1; +$mDiff = -1; +$mPrev = 0; +for ($i = 0; $i < (PHP_OS_FAMILY === 'Windows' ? 1_000 /* include is slow on Windows */ : 20_000); $i++) { + require __DIR__ . '/anonymous_class.inc'; + if ($classNamePrev !== null && $className !== $classNamePrev) { + echo 'Class name is different: ' . $className . ' vs ' . $classNamePrev . ' (' . $i . ' iteration)' . "\n"; + exit(1); + } + $classNamePrev = $className; + assert($className::verify() === 'ok'); + $m = memory_get_usage(); + $mDiff = $m - $mPrev; + if ($mPrev !== 0 && $mDiff !== 0) { + echo 'Increased memory detected: ' . $mDiff . ' B (' . $i . ' iteration)' . "\n"; + exit(1); + } + $mPrev = $m; +} +echo 'done'; + +?> +--EXPECT-- +done diff --git a/Zend/tests/repeated_include/anonymous_function.inc b/Zend/tests/repeated_include/anonymous_function.inc new file mode 100644 index 0000000000000..ee8be2fd6bec6 --- /dev/null +++ b/Zend/tests/repeated_include/anonymous_function.inc @@ -0,0 +1,7 @@ + 'okB'; diff --git a/Zend/tests/repeated_include/anonymous_function.phpt b/Zend/tests/repeated_include/anonymous_function.phpt new file mode 100644 index 0000000000000..7521b7e26d6a8 --- /dev/null +++ b/Zend/tests/repeated_include/anonymous_function.phpt @@ -0,0 +1,33 @@ +--TEST-- +Repeated include must not increase memory - anonymous function +--SKIPIF-- + false])['opcache_enabled']) { + die('xfail test currently requires opcache enabled'); +} +?> +--FILE-- + +--EXPECT-- +done diff --git a/Zend/tests/repeated_include/class_in_if.inc b/Zend/tests/repeated_include/class_in_if.inc new file mode 100644 index 0000000000000..f2142c1426f9b --- /dev/null +++ b/Zend/tests/repeated_include/class_in_if.inc @@ -0,0 +1,9 @@ + false])['opcache_enabled']) { + die('xfail test currently requires opcache enabled'); +} +?> +--FILE-- + +--EXPECT-- +done diff --git a/Zend/tests/repeated_include/function_in_if.inc b/Zend/tests/repeated_include/function_in_if.inc new file mode 100644 index 0000000000000..eaeb243129640 --- /dev/null +++ b/Zend/tests/repeated_include/function_in_if.inc @@ -0,0 +1,7 @@ + false])['opcache_enabled']) { + die('xfail test currently requires opcache enabled'); +} +?> +--FILE-- + +--EXPECT-- +done