Merge pull request #1438 from owncloud/phpunit-tests-win32-master
PHPUnit support for Windows added
This commit is contained in:
commit
7d0b4c2581
2 changed files with 464 additions and 0 deletions
117
autotest.cmd
Normal file
117
autotest.cmd
Normal file
|
@ -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
|
||||||
|
::
|
||||||
|
|
347
tests/win32-phpunit.php
Normal file
347
tests/win32-phpunit.php
Normal file
|
@ -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();
|
Loading…
Reference in a new issue