]> source.dussan.org Git - nextcloud-server.git/commitdiff
PHPUnit support for Windows added
authorThomas Mueller <thomas.mueller@tmit.eu>
Thu, 24 Jan 2013 12:47:04 +0000 (13:47 +0100)
committerThomas Mueller <thomas.mueller@tmit.eu>
Mon, 4 Feb 2013 09:15:00 +0000 (10:15 +0100)
autotest.cmd [new file with mode: 0644]
tests/win32-phpunit.php [new file with mode: 0644]

diff --git a/autotest.cmd b/autotest.cmd
new file mode 100644 (file)
index 0000000..053860d
--- /dev/null
@@ -0,0 +1,117 @@
+::
+:: ownCloud
+::
+:: @author Thomas Müller
+:: @author Tobias Ramforth (translated into Windows batch file)
+::
+:: @copyright 2012 Thomas Müller thomas.mueller@tmit.eu
+::
+@echo off
+
+set DATADIR=data-autotest
+set BASEDIR=%~dp0
+
+:: create autoconfig for sqlite, mysql and postgresql
+echo ^<?php                                      > .\tests\autoconfig-sqlite.php
+echo $AUTOCONFIG ^= array ^(                     >> .\tests\autoconfig-sqlite.php
+echo  'installed' ^=^> false^,                   >> .\tests\autoconfig-sqlite.php
+echo  'dbtype' ^=^> 'sqlite'^,                   >> .\tests\autoconfig-sqlite.php
+echo  'dbtableprefix' ^=^> 'oc_'^,               >> .\tests\autoconfig-sqlite.php
+echo  'adminlogin' ^=^> 'admin'^,                >> .\tests\autoconfig-sqlite.php
+echo  'adminpass' ^=^> 'admin'^,                 >> .\tests\autoconfig-sqlite.php
+echo  'directory' ^=^> '%BASEDIR%%DATADIR%'^,    >> .\tests\autoconfig-sqlite.php
+echo ^)^;                                        >> .\tests\autoconfig-sqlite.php
+
+echo ^<?php                                      > .\tests\autoconfig-mysql.php
+echo $AUTOCONFIG ^= array ^(                     >> .\tests\autoconfig-mysql.php
+echo   'installed' ^=^> false^,                  >> .\tests\autoconfig-mysql.php
+echo   'dbtype' ^=^> 'mysql'^,                   >> .\tests\autoconfig-mysql.php
+echo   'dbtableprefix' ^=^> 'oc_'^,              >> .\tests\autoconfig-mysql.php
+echo   'adminlogin' ^=^> 'admin'^,               >> .\tests\autoconfig-mysql.php
+echo   'adminpass' ^=^> 'admin'^,                >> .\tests\autoconfig-mysql.php
+echo   'directory' ^=^> '%BASEDIR%%DATADIR%'^,   >> .\tests\autoconfig-mysql.php
+echo   'dbuser' ^=^> 'oc_autotest'^,             >> .\tests\autoconfig-mysql.php
+echo   'dbname' ^=^> 'oc_autotest'^,             >> .\tests\autoconfig-mysql.php
+echo   'dbhost' ^=^> 'localhost'^,               >> .\tests\autoconfig-mysql.php
+echo   'dbpass' ^=^> 'owncloud'^,                >> .\tests\autoconfig-mysql.php
+echo ^)^;                                        >> .\tests\autoconfig-mysql.php
+
+echo ^<?php                                      > .\tests\autoconfig-pgsql.php
+echo $AUTOCONFIG ^= array ^(                     >> .\tests\autoconfig-pgsql.php
+echo   'installed' ^=^> false^,                  >> .\tests\autoconfig-pgsql.php
+echo   'dbtype' ^=^> 'pgsql'^,                   >> .\tests\autoconfig-pgsql.php
+echo   'dbtableprefix' ^=^> 'oc_'^,              >> .\tests\autoconfig-pgsql.php
+echo   'adminlogin' ^=^> 'admin'^,               >> .\tests\autoconfig-pgsql.php
+echo   'adminpass' ^=^> 'admin'^,                >> .\tests\autoconfig-pgsql.php
+echo   'directory' ^=^> '%BASEDIR%%DATADIR%'^,   >> .\tests\autoconfig-pgsql.php
+echo   'dbuser' ^=^> 'oc_autotest'^,             >> .\tests\autoconfig-pgsql.php
+echo   'dbname' ^=^> 'oc_autotest'^,             >> .\tests\autoconfig-pgsql.php
+echo   'dbhost' ^=^> 'localhost'^,               >> .\tests\autoconfig-pgsql.php
+echo   'dbpass' ^=^> 'owncloud'^,                >> .\tests\autoconfig-pgsql.php
+echo ^)^;                                        >> .\tests\autoconfig-pgsql.php
+
+echo localhost:5432:*:oc_autotest:owncloud > %APPDATA%\postgresql\pgpass.conf
+
+::
+:: start test execution
+::
+::call:execute_tests "sqlite"
+call:execute_tests "mysql"
+::call:execute_tests "mssql"
+::call:execute_tests "ora"
+::call:execute_tests "pgsql"
+
+goto:eof
+
+:execute_tests
+       echo "Setup environment for %~1 testing ..."
+       :: back to root folder
+       cd %BASEDIR%
+
+       :: revert changes to tests\data
+       git checkout tests\data\*
+
+       :: reset data directory
+       rmdir /s /q %DATADIR%
+       md %DATADIR%
+
+       :: remove the old config file
+       :: del /q /f config\config.php
+       copy /y tests\preseed-config.php config\config.php
+
+       :: drop database
+       if "%~1" == "mysql" mysql -u oc_autotest -powncloud -e "DROP DATABASE oc_autotest"
+       
+       if "%~1" == "pgsql" dropdb -h localhost -p 5432 -U oc_autotest -w oc_autotest
+       
+       :: copy autoconfig
+       copy /y %BASEDIR%\tests\autoconfig-%~1.php %BASEDIR%\config\autoconfig.php
+
+       :: trigger installation
+       php -f index.php
+
+       ::test execution
+       echo "Testing with %~1 ..."
+       cd tests
+       rmdir /s /q coverage-html-%~1
+       md coverage-html-%~1
+       php -f enable_all.php
+       ::phpunit --log-junit autotest-results-%~1.xml --coverage-clover autotest-clover-%~1.xml --coverage-html coverage-html-%~1
+       ::phpunit --bootstrap bootstrap.php --configuration phpunit.xml
+       php win32-phpunit.php --bootstrap bootstrap.php --configuration phpunit.xml --log-junit autotest-results-%~1.xml --coverage-clover autotest-clover-%~1.xml --coverage-html coverage-html-%~1
+       echo "Done with testing %~1 ..."
+       cd %BASEDIR%
+goto:eof
+
+::
+:: NOTES on mysql:
+::  - CREATE USER 'oc_autotest'@'localhost' IDENTIFIED BY 'owncloud';
+::  - grant access permissions: grant all on oc_autotest.* to 'oc_autotest'@'localhost';
+::
+:: NOTES on pgsql:
+::  - su - postgres
+::  - createuser -P (enter username and password and enable superuser)
+::  - to enable dropdb I decided to add following line to pg_hba.conf (this is not the safest way but I don't care for the testing machine):
+:: local       all     all     trust
+::
+
diff --git a/tests/win32-phpunit.php b/tests/win32-phpunit.php
new file mode 100644 (file)
index 0000000..ac8f95e
--- /dev/null
@@ -0,0 +1,347 @@
+<?php
+OC_PHPUnit_Loader::checkIncludePath();
+OC_PHPUnit_Loader::detectPHPUnitVersionId();
+
+//load PHPUnit
+switch (OC_PHPUnit_Loader::$PHPUnitVersionId) {
+    case "36": {
+        OC_PHPUnit_Loader::load36();
+        break;
+    }
+    case "37": {
+        OC_PHPUnit_Loader::load37();
+        break;
+    }
+}
+
+//load custom implementation of the PHPUnit_TextUI_ResultPrinter
+switch (OC_PHPUnit_Loader::$PHPUnitVersionId) {
+    case "36":
+    case "37": {
+        class OC_PHPUnit_TextUI_ResultPrinter extends PHPUnit_TextUI_ResultPrinter
+        {
+            function __construct()
+            {
+                parent::__construct('php://stderr');
+            }
+
+            public function printResult(PHPUnit_Framework_TestResult $result)
+            {
+                $this->printHeader();
+                $this->printFooter($result);
+            }
+
+            protected function writeProgress($progress)
+            {
+                //ignore
+            }
+        }
+        break;
+    }
+}
+
+//loading of OC_PHPUnit_TextUI_Command
+switch (OC_PHPUnit_Loader::$PHPUnitVersionId) {
+    case "36":
+    case "37": {
+        class OC_PHPUnit_TextUI_Command extends PHPUnit_TextUI_Command
+        {
+
+            public static function main($exit = TRUE)
+            {
+                $command = new OC_PHPUnit_TextUI_Command();
+                $command->run($_SERVER['argv'], $exit);
+            }
+
+            protected function handleArguments(array $argv)
+            {
+                parent::handleArguments($argv);
+                $this->arguments['listeners'][] = new OC_PHPUnit_Framework_TestListener();
+                $this->arguments['printer'] = new OC_PHPUnit_TextUI_ResultPrinter();
+            }
+
+            protected function createRunner()
+            {
+                $coverage_Filter = new PHP_CodeCoverage_Filter();
+                $coverage_Filter->addFileToBlacklist(__FILE__);
+                $runner = new PHPUnit_TextUI_TestRunner($this->arguments['loader'], $coverage_Filter);
+                return $runner;
+            }
+        }
+        break;
+    }
+}
+
+class OC_PHPUnit_Loader
+{
+
+    const SUCCESS_EXIT = 0;
+    const FAILURE_EXIT = 1;
+    const EXCEPTION_EXIT = 2;
+
+    public static $PHPUnitVersionId;
+
+    /**
+     * @return void
+     */
+    public static function checkIncludePath()
+    {
+        //check include path
+        $PHPUnitParentDirectory = self::getPHPUnitParentDirectory();
+        if (is_null($PHPUnitParentDirectory)) {
+            echo "Cannot find PHPUnit in include path (" . ini_get('include_path') . ")";
+            exit(OC_PHPUnit_Loader::FAILURE_EXIT);
+        }
+    }
+
+    /**
+     * @return null | string
+     */
+    private static function getPHPUnitParentDirectory()
+    {
+        $pathArray = explode(PATH_SEPARATOR, ini_get('include_path'));
+        foreach ($pathArray as $path)
+        {
+            if (file_exists($path . DIRECTORY_SEPARATOR . 'PHPUnit/')) {
+                return $path;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @return void
+     */
+    public static function detectPHPUnitVersionId()
+    {
+        require_once 'PHPUnit/Runner/Version.php';
+
+        $PHPUnitVersion = PHPUnit_Runner_Version::id();
+
+        if ($PHPUnitVersion === "@package_version@") {
+
+            self::$PHPUnitVersionId = "37";
+        }
+        else if (version_compare($PHPUnitVersion, '3.7.0') >= 0) {
+
+            self::$PHPUnitVersionId = "37";
+        }
+        else if (version_compare($PHPUnitVersion, '3.6.0') >= 0) {
+
+            self::$PHPUnitVersionId = "36";
+        }
+        else if (version_compare($PHPUnitVersion, '3.6.0') >= 0) {
+
+            echo "unsupported PHPUnit version:  $PHPUnitVersion";
+            exit(OC_PHPUnit_Loader::FAILURE_EXIT);
+        }
+    }
+
+    /**
+     * @return void
+     */
+    public static function load37()
+    {
+
+        require 'PHPUnit/Autoload.php';
+
+    }
+
+
+    /**
+     * @return void
+     */
+    public static function load36()
+    {
+        define('PHPUnit_MAIN_METHOD', 'OC_PHPUnit_TextUI_Command::main');
+
+        require 'PHPUnit/Autoload.php';
+
+    }
+}
+
+class OC_PHPUnit_Framework_TestListener implements PHPUnit_Framework_TestListener
+{
+
+    private $isSummaryTestCountPrinted = false;
+
+    public static function printEvent($eventName, $params = array())
+    {
+        self::printText("\n[$eventName");
+        foreach ($params as $key => $value) {
+            self::printText(" $key='$value'");
+        }
+        self::printText("]\n");
+    }
+
+    public static function printText($text)
+    {
+        file_put_contents('php://stderr', $text);
+    }
+
+    private static function getMessage(Exception $e)
+    {
+        $message = "";
+        if (strlen(get_class($e)) != 0) {
+            $message = $message . get_class($e);
+        }
+        if (strlen($message) != 0 && strlen($e->getMessage()) != 0) {
+            $message = $message . " : ";
+        }
+        $message = $message . $e->getMessage();
+        return self::escapeValue($message);
+    }
+
+    private static function getDetails(Exception $e)
+    {
+        return self::escapeValue($e->getTraceAsString());
+    }
+
+    public static function getValueAsString($value)
+    {
+        if (is_null($value)) {
+            return "null";
+        }
+        else if (is_bool($value)) {
+            return $value == true ? "true" : "false";
+        }
+        else if (is_array($value) || is_string($value)) {
+            $valueAsString = print_r($value, true);
+            if (strlen($valueAsString) > 10000) {
+                return null;
+            }
+            return $valueAsString;
+        }
+        else if (is_scalar($value)){
+            return print_r($value, true);
+        }
+        return null;
+    }
+
+    private static function escapeValue($text) {
+        $text = str_replace("|", "||", $text);
+        $text = str_replace("'", "|'", $text);
+        $text = str_replace("\n", "|n", $text);
+        $text = str_replace("\r", "|r", $text);
+        $text = str_replace("]", "|]", $text);
+        return $text;
+    }
+
+    public static function getFileName($className)
+    {
+        $reflectionClass = new ReflectionClass($className);
+        $fileName = $reflectionClass->getFileName();
+        return $fileName;
+    }
+
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        self::printEvent("testFailed", array(
+            "name" => $test->getName(),
+            "message" => self::getMessage($e),
+            "details" => self::getDetails($e)
+        ));
+    }
+
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        $params = array(
+            "name" => $test->getName(),
+            "message" => self::getMessage($e),
+            "details" => self::getDetails($e)
+        );
+        if ($e instanceof PHPUnit_Framework_ExpectationFailedException) {
+            $comparisonFailure = $e->getComparisonFailure();
+            if ($comparisonFailure instanceof PHPUnit_Framework_ComparisonFailure) {
+                $actualResult = $comparisonFailure->getActual();
+                $expectedResult = $comparisonFailure->getExpected();
+                $actualString = self::getValueAsString($actualResult);
+                $expectedString = self::getValueAsString($expectedResult);
+                if (!is_null($actualString) && !is_null($expectedString)) {
+                    $params['actual'] = self::escapeValue($actualString);
+                    $params['expected'] = self::escapeValue($expectedString);
+                }
+            }
+        }
+        self::printEvent("testFailed", $params);
+    }
+
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        self::printEvent("testIgnored", array(
+            "name" => $test->getName(),
+            "message" => self::getMessage($e),
+            "details" => self::getDetails($e)
+        ));
+    }
+
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        self::printEvent("testIgnored", array(
+            "name" => $test->getName(),
+            "message" => self::getMessage($e),
+            "details" => self::getDetails($e)
+        ));
+    }
+
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        $testName = $test->getName();
+        $params = array(
+            "name" => $testName
+        );
+        if ($test instanceof PHPUnit_Framework_TestCase) {
+            $className = get_class($test);
+            $fileName = self::getFileName($className);
+            $params['locationHint'] = "php_qn://$fileName::\\$className::$testName";
+        }
+        self::printEvent("testStarted", $params);
+    }
+
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        self::printEvent("testFinished", array(
+            "name" => $test->getName(),
+            "duration" => (int)(round($time, 2) * 1000)
+        ));
+    }
+
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        if (!$this->isSummaryTestCountPrinted) {
+            $this->isSummaryTestCountPrinted = true;
+            //print tests count
+            self::printEvent("testCount", array(
+                "count" => count($suite)
+            ));
+        }
+
+        $suiteName = $suite->getName();
+        if (empty($suiteName)) {
+            return;
+        }
+        $params = array(
+            "name" => $suiteName,
+        );
+        if (class_exists($suiteName, false)) {
+            $fileName = self::getFileName($suiteName);
+            $params['locationHint'] = "php_qn://$fileName::\\$suiteName";
+        }
+        self::printEvent("testSuiteStarted", $params);
+    }
+
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $suiteName = $suite->getName();
+        if (empty($suiteName)) {
+            return;
+        }
+        self::printEvent("testSuiteFinished",
+            array(
+                "name" => $suite->getName()
+            ));
+    }
+
+}
+
+OC_PHPUnit_TextUI_Command::main();