[BUGFIX] Fail with exit code for fatal errors during boot 23/47423/3
authorHelmut Hummel <info@helhum.io>
Sun, 27 Mar 2016 19:38:37 +0000 (21:38 +0200)
committerHelmut Hummel <helmut.hummel@typo3.org>
Wed, 30 Mar 2016 19:45:18 +0000 (21:45 +0200)
Especially for CI environments it is crucial that TYPO3
does not exit cleanly when a fatal error occurs.

Change from die (which exits with return code 0) to exit(1)
and send a http error code as well (in web requests)

Releases: master, 7.6
Resolves: #75280
Change-Id: I473de98366a5ea3629d968e2c1600f241b9e73a1
Reviewed-on: https://review.typo3.org/47423
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Tested-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Tested-by: Tymoteusz Motylewski <t.motylewski@gmail.com>
Reviewed-by: Helmut Hummel <helmut.hummel@typo3.org>
Tested-by: Helmut Hummel <helmut.hummel@typo3.org>
typo3/sysext/core/Build/FunctionalTestsBootstrap.php
typo3/sysext/core/Build/UnitTestsBootstrap.php
typo3/sysext/core/Classes/Core/SystemEnvironmentBuilder.php

index 23fa53c..7d21e78 100644 (file)
@@ -57,7 +57,7 @@ class FunctionalTestsBootstrap
     protected function loadClassFiles()
     {
         if (!class_exists('PHPUnit_Framework_TestCase')) {
-            die('PHPUnit wasn\'t found. Please check your settings and command.');
+            $this->exitWithMessage('PHPUnit wasn\'t found. Please check your settings and command.');
         }
         if (!class_exists(BaseTestCase::class)) {
             // PHPUnit is invoked globally, so we need to include the project autoload file
@@ -82,7 +82,7 @@ class FunctionalTestsBootstrap
         }
 
         if (!file_exists(ORIGINAL_ROOT . 'typo3/cli_dispatch.phpsh')) {
-            die('Unable to determine path to entry script. Please check your path or set an environment variable \'TYPO3_PATH_WEB\' to your root path.');
+            $this->exitWithMessage('Unable to determine path to entry script. Please check your path or set an environment variable \'TYPO3_PATH_WEB\' to your root path.');
         }
 
         return $this;
@@ -136,6 +136,17 @@ class FunctionalTestsBootstrap
         }
         return rtrim(strtr($webRoot, '\\', '/'), '/') . '/';
     }
+
+    /**
+     * Echo out a text message and exit with error code
+     *
+     * @param string $message
+     */
+    protected function exitWithMessage($message)
+    {
+        echo $message . LF;
+        exit(1);
+    }
 }
 
 if (PHP_SAPI !== 'cli') {
index b5f153c..d173db4 100644 (file)
@@ -100,7 +100,7 @@ class UnitTestsBootstrap
         $_SERVER['SCRIPT_NAME'] = PATH_thisScript;
 
         if (!file_exists(PATH_thisScript)) {
-            die('Unable to determine path to entry script. Please check your path or set an environment variable \'TYPO3_PATH_WEB\' to your root path.');
+            $this->exitWithMessage('Unable to determine path to entry script. Please check your path or set an environment variable \'TYPO3_PATH_WEB\' to your root path.');
         }
 
         return $this;
@@ -185,7 +185,7 @@ class UnitTestsBootstrap
     {
         $classLoaderFilepath = __DIR__ . '/../../../../vendor/autoload.php';
         if (!file_exists($classLoaderFilepath)) {
-            die('ClassLoader can\'t be loaded. Please check your path or set an environment variable \'TYPO3_PATH_WEB\' to your root path.');
+            $this->exitWithMessage('ClassLoader can\'t be loaded. Please check your path or set an environment variable \'TYPO3_PATH_WEB\' to your root path.');
         }
         $classLoader = require $classLoaderFilepath;
 
@@ -227,6 +227,17 @@ class UnitTestsBootstrap
 
         return $this;
     }
+
+    /**
+     * Echo out a text message and exit with error code
+     *
+     * @param string $message
+     */
+    protected function exitWithMessage($message)
+    {
+        echo $message . LF;
+        exit(1);
+    }
 }
 
 if (PHP_SAPI !== 'cli') {
index 80c16cb..7e6497d 100644 (file)
@@ -182,10 +182,10 @@ class SystemEnvironmentBuilder
     protected static function checkMainPathsExist()
     {
         if (!is_file(PATH_thisScript)) {
-            static::dieWithMessage('Unable to determine path to entry script.');
+            static::exitWithMessage('Unable to determine path to entry script.');
         }
         if (!is_dir(PATH_typo3 . 'sysext')) {
-            static::dieWithMessage('Calculated absolute path to typo3/sysext directory does not exist.' . LF . LF
+            static::exitWithMessage('Calculated absolute path to typo3/sysext directory does not exist.' . LF . LF
                 . 'Something in the main file, folder and link structure is wrong and must be fixed! A typical document root contains a couple of symbolic links:' . LF
                 . '* A symlink "typo3_src" pointing to the TYPO3 CMS core.' . LF
                 . '* A symlink "typo3" - the backend entry point - pointing to "typo3_src/typo3"' . LF
@@ -396,14 +396,23 @@ class SystemEnvironmentBuilder
     }
 
     /**
-     * Echo out a text message and die
+     * Send http headers, echo out a text message and exit with error code
      *
      * @param string $message
      */
-    protected static function dieWithMessage($message)
+    protected static function exitWithMessage($message)
     {
-        header('Content-type: text/plain');
-        die($message);
+        $headers = [
+            \TYPO3\CMS\Core\Utility\HttpUtility::HTTP_STATUS_500,
+            'Content-type: text/plain'
+        ];
+        if (!headers_sent()) {
+            foreach ($headers as $header) {
+                header($header);
+            }
+        }
+        echo $message . LF;
+        exit(1);
     }
 
     /**