Phpunit: L'isolation du processus sous phpdbg lève des exceptions

Créé le 30 nov. 2019  ·  3Commentaires  ·  Source: sebastianbergmann/phpunit

- Veuillez ne pas signaler un problème pour une version de PHPUnit qui n'est plus prise en charge. Une liste des versions actuellement prises en charge de PHPUnit est disponible sur https://phpunit.de/supported-versions.html. - Veuillez ne pas signaler un problème si vous utilisez une version de PHP qui n'est pas prise en charge par la version de PHPUnit que vous utilisez. Une liste qui montre quelle version de PHP est prise en charge par quelle version de PHPUnit est disponible sur https://phpunit.de/supported-versions.html. - Veuillez remplir ce modèle en fonction de votre problème. - Veuillez conserver le tableau ci-dessous en haut de votre problème. - Veuillez inclure la sortie de "composer info | sort" si vous avez installé PHPUnit à l'aide de Composer. - Veuillez poster le code sous forme de texte (en utilisant le balisage approprié). Ne publiez pas de captures d'écran de code. - Visitez https://phpunit.de/support.html si vous recherchez de l'aide. - Veuillez supprimer ce commentaire avant de soumettre votre problème.

| Q | UNE
| --------------------| ---------------
| Version PHPUnit | 8.4.3
| Version PHP | 7.4.0 (phpdbg SAPI)
| Méthode d'installation | Compositeur

Sommaire

L'utilisation de l'isolement de processus lève des exceptions sous phpdbg . Au début, je pensais que c'était une régression de #3772, mais cela semble être une cause distincte.

Je pense que j'ai pu localiser le bogue jusqu'à cette ligne dans TestCaseMethod.tpl (il y a aussi un code similaire dans TestCaseClass.tpl ). Ces deux lignes tentent de lire à partir de STDOUT , sans vérifier au préalable s'il s'agit d'un flux lisible.

Si je mets une instruction de débogage en utilisant stream_get_meta_data(STDOUT) , vous pouvez voir que STDOUT n'est pas lisible :

array(9) {
  ["timed_out"]=>
  bool(false)
  ["blocked"]=>
  bool(true)
  ["eof"]=>
  bool(false)
  ["wrapper_type"]=>
  string(3) "PHP"
  ["stream_type"]=>
  string(5) "STDIO"
  ["mode"]=>
  string(2) "wb"
  ["unread_bytes"]=>
  int(0)
  ["seekable"]=>
  bool(false)
  ["uri"]=>
  string(12) "php://stdout"
}

Voir également:

Comportement actuel

Tout test qui utilise l'isolation de processus sous phpdbg ne s'exécute pas et lève à la place une exception similaire à : PHPUnit\Framework\Exception: Notice: stream_get_contents(): read of 8192 bytes failed with errno=9 Bad file descriptor in Standard input code on line 336 .

Comment reproduire

Exécutez ce test sous phpdbg :

<?php

use PHPUnit\Framework\TestCase;

class ReproTest extends TestCase
{
    /**
     * <strong i="20">@doesNotPerformAssertions</strong>
     * <strong i="21">@runInSeparateProcess</strong>
     */
    public function testProcessIsolation()
    {
    }
}

Et voir cette sortie :

$ phpdbg -qrr vendor/bin/phpunit
PHPUnit 8.4.3 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 121 ms, Memory: 6.00 MB

There was 1 error:

1) ReproTest::testProcessIsolation
PHPUnit\Framework\Exception: Notice: stream_get_contents(): read of 8192 bytes failed with errno=9 Bad file descriptor in Standard input code on line 336

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Comportement prévisible

L'isolation des processus devrait fonctionner pour phpdbg de la même manière que pour les autres SAPI PHP.

Sortie de composer info | sort

doctrine/instantiator              1.3.0   A small, lightweight utility to instantiate objects in PHP without invoking their constructors
myclabs/deep-copy                  1.9.3   Create deep copies (clones) of your objects
phar-io/manifest                   1.0.3   Component for reading phar.io manifest information from a PHP Archive (PHAR)
phar-io/version                    2.0.1   Library for handling version information and constraints
phpdocumentor/reflection-common    2.0.0   Common reflection classes used by phpdocumentor to reflect the code structure
phpdocumentor/reflection-docblock  4.3.2   With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.
phpdocumentor/type-resolver        1.0.1   A PSR-5 based resolver of Class names, Types and Structural Element Names
phpspec/prophecy                   1.9.0   Highly opinionated mocking framework for PHP 5.3+
phpunit/php-code-coverage          7.0.10  Library that provides collection, processing, and rendering functionality for PHP code coverage information.
phpunit/php-file-iterator          2.0.2   FilterIterator implementation that filters files based on a list of suffixes.
phpunit/php-text-template          1.2.1   Simple template engine.
phpunit/php-timer                  2.1.2   Utility class for timing
phpunit/php-token-stream           3.1.1   Wrapper around PHP's tokenizer extension.
phpunit/phpunit                    8.4.3   The PHP Unit Testing framework.
sebastian/code-unit-reverse-lookup 1.0.1   Looks up which function or method a line of code belongs to
sebastian/comparator               3.0.2   Provides the functionality to compare PHP values for equality
sebastian/diff                     3.0.2   Diff implementation
sebastian/environment              4.2.3   Provides functionality to handle HHVM/PHP environments
sebastian/exporter                 3.1.2   Provides the functionality to export PHP variables for visualization
sebastian/global-state             3.0.0   Snapshotting of global state
sebastian/object-enumerator        3.0.3   Traverses array structures and object graphs to enumerate all referenced objects
sebastian/object-reflector         1.1.1   Allows reflection of object attributes, including inherited and non-public ones
sebastian/recursion-context        3.0.0   Provides functionality to recursively process PHP variables
sebastian/resource-operations      2.0.1   Provides a list of PHP built-in functions that operate on resources
sebastian/type                     1.1.3   Collection of value objects that represent the types of the PHP type system
sebastian/version                  2.0.1   Library that helps with managing the version number of Git-hosted PHP projects
symfony/polyfill-ctype             v1.13.0 Symfony polyfill for ctype functions
theseer/tokenizer                  1.1.3   A small library for converting tokenized PHP source code into XML and potentially other formats
webmozart/assert                   1.6.0   Assertions to validate method input/output with nice error messages.
featurprocess-isolation typbug

Tous les 3 commentaires

Je confirme.

Je n'investirai pas de temps dans le débogage d'un problème qui n'affecte que PHPDBG. Pour être honnête, je pense supprimer le support de php-code-coverage ainsi que PHPUnit lui-même.

Juste à titre d'exemple, lors de l'utilisation de PHP normal, le flux sera également signalé comme non lisible :

php -r 'echo stream_get_meta_data(STDOUT)["mode"], "\n";' | cat
// Outputs: wb

Ce problème est apparu pour la première fois dans PHP 7.4.0 . C'est peut-être un bug PHP, mais je ne sais pas mieux.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

nicklevett picture nicklevett  ·  4Commentaires

rentalhost picture rentalhost  ·  4Commentaires

greg0ire picture greg0ire  ·  4Commentaires

joubertredrat picture joubertredrat  ·  4Commentaires

sebastianbergmann picture sebastianbergmann  ·  3Commentaires