Giter Club home page Giter Club logo

phpunit-patches's Introduction

Legacy PHPUnit patches

Patches for PHPUnit 4.8.34 allowing it to run on PHP 5.3 - PHP 8.1.

You can apply these automatically with Simple patches plugin for Composer in your composer.json:

{
    "require-dev": {
        "cweagans/composer-patches": "^1.7",
        "phpunit/phpunit": "4.8.34"
    },
    "extra": {
        "composer-exit-on-patch-failure": true,
        "patches": {
            "phpunit/phpunit-mock-objects": {
                "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch"
            },
            "phpunit/php-file-iterator": {
                "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_path_file_iterator.patch"
            },
            "phpunit/phpunit": {
                "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch",
                "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch",
                "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch"
            }
        }
    }
}

phpunit-patches's People

Contributors

longthanhtran avatar marcovtwout avatar samdark avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

phpunit-patches's Issues

Compatibility for PHP 8.1

Running yiisoft/yii tests on PHP 8.1 throws:

PHP Fatal error: Cannot acquire reference to $GLOBALS in (..)\vendor\phpunit\phpunit\src\Util\Configuration.php on line 519

This was fixed in PHPUnit 8 by sebastianbergmann/phpunit@83491f4

Here's a new patch file that applies the above change to PHPUnit 4.8.34, used in yiisoft/yii:

--- a/src/Util/Configuration.php
+++ b/src/Util/Configuration.php
@@ -511,25 +511,20 @@
                 define($name, $value);
             }
         }
+        
+        foreach ($configuration['var'] as $name => $data) {
+            $GLOBALS[$name] = $data['value'];
+        }
 
-        foreach (array('var', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
-            // See https://github.com/sebastianbergmann/phpunit/issues/277
-            switch ($array) {
-                case 'var':
-                    $target = &$GLOBALS;
-                    break;
-
-                case 'server':
-                    $target = &$_SERVER;
-                    break;
+        foreach ($configuration['server'] as $name => $data) {
+            $_SERVER[$name] = $data['value'];
+        }
 
-                default:
-                    $target = &$GLOBALS['_' . strtoupper($array)];
-                    break;
-            }
+        foreach (['post', 'get', 'cookie', 'files', 'request'] as $array) {
+            $target = &$GLOBALS['_' . strtoupper($array)];
 
-            foreach ($configuration[$array] as $name => $value) {
-                $target[$name] = $value;
+            foreach ($configuration[$array] as $name => $data) {
+                $target[$name] = $data['value'];
             }
         }
 

Tests in separate process are failing on Composer v2 with PHP 8.0+

Encountered when running tests on Composer v2 with PHP 8.0 or higher in https://github.com/yiisoft/yii.
Any test annotated with @runInSeparateProcess will fail:

cd tests
$ ../vendor/bin/phpunit framework/web/CHttpSessionTest --filter testSetGet

Expected output:

PHPUnit 4.8.34 by Sebastian Bergmann and contributors.

.

Time: 372 ms, Memory: 6.00MB

OK (1 test, 84 assertions)

Actual output:

PHPUnit 4.8.34 by Sebastian Bergmann and contributors.

E

Time: 369 ms, Memory: 6.00MB

There was 1 error:

1) CHttpSessionTest::testSetGet
PHPUnit_Framework_Exception: PHPUnit 4.8.34 by Sebastian Bergmann and contributors.

Usage: phpunit [options] UnitTest [UnitTest.php]
       phpunit [options] <directory>

Code Coverage Options:

  --coverage-clover <file>  Generate code coverage report in Clover XML format.
  --coverage-crap4j <file>  Generate code coverage report in Crap4J XML format.
  --coverage-html <dir>     Generate code coverage report in HTML format.
  --coverage-php <file>     Export PHP_CodeCoverage object to file.
  --coverage-text=<file>    Generate code coverage report in text format.
                            Default: Standard output.
  --coverage-xml <dir>      Generate code coverage report in PHPUnit XML format.

Logging Options:

  --log-junit <file>        Log test execution in JUnit XML format to file.
  --log-tap <file>          Log test execution in TAP format to file.
  --log-json <file>         Log test execution in JSON format.
  --testdox-html <file>     Write agile documentation in HTML format to file.
  --testdox-text <file>     Write agile documentation in Text format to file.

Test Selection Options:

  --filter <pattern>        Filter which tests to run.
  --testsuite <name>        Filter which testsuite to run.
  --group ...               Only runs tests from the specified group(s).
  --exclude-group ...       Exclude tests from the specified group(s).
  --list-groups             List available test groups.
  --test-suffix ...         Only search for test in files with specified
                            suffix(es). Default: Test.php,.phpt

Test Execution Options:

  --report-useless-tests    Be strict about tests that do not test anything.
  --strict-coverage         Be strict about unintentionally covered code.
  --strict-global-state     Be strict about changes to global state
  --disallow-test-output    Be strict about output during tests.
  --enforce-time-limit      Enforce time limit based on test size.
  --disallow-todo-tests     Disallow @todo-annotated tests.

  --process-isolation       Run each test in a separate PHP process.
  --no-globals-backup       Do not backup and restore $GLOBALS for each test.
  --static-backup           Backup and restore static attributes for each test.

  --colors=<flag>           Use colors in output ("never", "auto" or "always").
  --columns <n>             Number of columns to use for progress output.
  --columns max             Use maximum number of columns for progress output.
  --stderr                  Write to STDERR instead of STDOUT.
  --stop-on-error           Stop execution upon first error.
  --stop-on-failure         Stop execution upon first error or failure.
  --stop-on-risky           Stop execution upon first risky test.
  --stop-on-skipped         Stop execution upon first skipped test.
  --stop-on-incomplete      Stop execution upon first incomplete test.
  -v|--verbose              Output more verbose information.
  --debug                   Display debugging information during test execution.

  --loader <loader>         TestSuiteLoader implementation to use.
  --repeat <times>          Runs the test(s) repeatedly.
  --tap                     Report test execution progress in TAP format.
  --testdox                 Report test execution progress in TestDox format.
  --printer <printer>       TestListener implementation to use.

Configuration Options:

  --bootstrap <file>        A "bootstrap" PHP file that is run before the tests.
  -c|--configuration <file> Read configuration from XML file.
  --no-configuration        Ignore default configuration file (phpunit.xml).
  --no-coverage             Ignore code coverage configuration.
  --include-path <path(s)>  Prepend PHP's include_path with given path(s).
  -d key[=value]            Sets a php.ini value.

Miscellaneous Options:

  -h|--help                 Prints this usage information.
  --version                 Prints the version and exits.

C:\www\example\yii\vendor\phpunit\phpunit\phpunit:52
C:\www\example\yii\vendor\bin\phpunit:110

Caused by
ErrorException: unserialize(): Error at offset 0 of 3898 bytes in C:\www\example\yii\vendor\phpunit\phpunit\src\Util\PHP.php:114
Stack trace:
#0 [internal function]: PHPUnit_Util_PHP->{closure}(8, 'unserialize(): ...', 'C:\\www\\example\\yii...', 114)
#1 C:\www\example\yii\vendor\phpunit\phpunit\src\Util\PHP.php(114): unserialize('PHPUnit 4.8.34 ...')
#2 C:\www\example\yii\vendor\phpunit\phpunit\src\Util\PHP.php(51): PHPUnit_Util_PHP->processChildResult(Object(CHttpSessionTest), Object(PHPUnit_Framework_TestResult), 'PHPUnit 4.8.34 ...', '')
#3 C:\www\example\yii\vendor\phpunit\phpunit\src\Framework\TestCase.php(723): PHPUnit_Util_PHP->runTestJob('<?php\nif (!defi...', Object(CHttpSessionTest), Object(PHPUnit_Framework_TestResult))
#4 C:\www\example\yii\vendor\phpunit\phpunit\src\Framework\TestSuite.php(723): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#5 C:\www\example\yii\vendor\phpunit\phpunit\src\TextUI\TestRunner.php(440): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult))
#6 C:\www\example\yii\vendor\phpunit\phpunit\src\TextUI\Command.php(149): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array)
#7 C:\www\example\yii\vendor\phpunit\phpunit\src\TextUI\Command.php(100): PHPUnit_TextUI_Command->run(Array, true)
#8 C:\www\example\yii\vendor\phpunit\phpunit\phpunit(52): PHPUnit_TextUI_Command::main()
#9 C:\www\example\yii\vendor\bin\phpunit(110): include('C:\\www\\example\\yii...')
#10 {main}
FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

When using vendor/phpunit/phpunit/phpunit instead of vendor/bin/phpunit, it works correctly:

$ ../vendor/phpunit/phpunit/phpunit framework/web/CHttpSessionTest --filter testSetGet
PHPUnit 4.8.34 by Sebastian Bergmann and contributors.

.

Time: 393 ms, Memory: 6.00MB

OK (1 test, 84 assertions)

Cause
I found the cause of this error to be a few layers deep.

When tests are annotated with @runInSeparateProcess, PHPUnit class TestCase::run() creates a temporary file that will run this test in isolation. The temporary file is based on a template TestCaseMethod.tpl and includes a list of $includedFiles that PHP requires. When running under the described circumstances, the temporary file with include the non-PHP-file vendor/phpunit/phpunit/phpunit which it shouldn't have.

When running the temporary file you can see in the output it includes phpunit (outputs: Usage: phpunit [options] UnitTest [UnitTest.php] (...) Prints the version and exits.. Because there is no decodable output this triggers the exception ErrorException: unserialize(): Error at offset 0 of 3898 bytes in C:\www\example\yii\vendor\phpunit\phpunit\src\Util\PHP.php:114.

Why are we patching phpunit, since this makes it a lot harder to use a recent phpunit package?

I'm using a recent phpunit package, and the patches from this repo don't apply on that version.

I have to add this to my composer.json file for a composer install to work.

        "patches-ignore": {
            "yiisoft/yii2-debug": {
                "phpunit/phpunit": {
                    "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch",
                    "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch"
                }
            },
            "yiisoft/yii2-faker": {
                "phpunit/phpunit": {
                    "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch",
                    "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch"
                }
            },
            "yiisoft/yii2-gii": {
                "phpunit/phpunit": {
                    "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch",
                    "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch"
                }
            }
        }

But every time I try to bump my dependencies to a latest version, there is an extra yii package that adds the patches. Recently, yii2-swiftmailer started to include these patches.

Without the patches-ignore, I get this when doing a composer install.

  - Installing phpunit/phpunit (8.5.20): Extracting archive
> post-package-install: cweagans\Composer\Patches->postInstall
  - Applying patches for phpunit/phpunit
    https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch (Fix PHP 7 compatibility)
patch '-p1' --no-backup-if-mismatch -d '/opt/app/vendor/phpunit/phpunit' < '/tmp/626fc89f174ff.patch'
patching file src/Util/Getopt.php

Hunk #1 FAILED at 35.
Hunk #2 FAILED at 94.
Hunk #3 FAILED at 139.

3 out of 3 hunks FAILED -- saving rejects to file src/Util/Getopt.php.rej

patch '-p0' --no-backup-if-mismatch -d '/opt/app/vendor/phpunit/phpunit' < '/tmp/626fc89f174ff.patch'
can't find file to patch at input line 5
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff --git a/src/Util/Getopt.php b/src/Util/Getopt.php
|index ba21be3..96931a3 100644
|--- a/src/Util/Getopt.php
|+++ b/src/Util/Getopt.php
--------------------------
File to patch: 
Skip this patch? [y] 
Skipping patch.

3 out of 3 hunks ignored

patch '-p2' --no-backup-if-mismatch -d '/opt/app/vendor/phpunit/phpunit' < '/tmp/626fc89f174ff.patch'
can't find file to patch at input line 5
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff --git a/src/Util/Getopt.php b/src/Util/Getopt.php
|index ba21be3..96931a3 100644
|--- a/src/Util/Getopt.php
|+++ b/src/Util/Getopt.php
--------------------------
File to patch: 
Skip this patch? [y] 
Skipping patch.

3 out of 3 hunks ignored

patch '-p4' --no-backup-if-mismatch -d '/opt/app/vendor/phpunit/phpunit' < '/tmp/626fc89f174ff.patch'
can't find file to patch at input line 5
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff --git a/src/Util/Getopt.php b/src/Util/Getopt.php
|index ba21be3..96931a3 100644
|--- a/src/Util/Getopt.php
|+++ b/src/Util/Getopt.php
--------------------------
File to patch: 
Skip this patch? [y] 
Skipping patch.

3 out of 3 hunks ignored

   Could not apply patch! Skipping. The error was: Cannot apply patch https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch

In Patches.php line 326:
                                                                                                              
  [Exception]                                                                                                 
  Cannot apply patch Fix PHP 7 compatibility (https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch)!  

I have a "phpunit/phpunit": "^8.0" in my require-dev section. Is Yii2 only supported with phpunit 4.8, as this repo seems to indicate?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.