Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code Coverage (HTML Report) does not work correctly when Scoped PHAR is used #3751

Closed
sebastianbergmann opened this issue Jul 7, 2019 · 6 comments
Labels
type/bug Something is broken
Milestone

Comments

@sebastianbergmann
Copy link
Owner

Reproducing example

$ cd /tmp
$ git clone git@github.com:phar-io/manifest.git
$ cd manifest
diff --git a/composer.json b/composer.json
index 9888b5a..4a4d92b 100644
--- a/composer.json
+++ b/composer.json
@@ -38,8 +38,5 @@
     "branch-alias": {
         "dev-master": "1.0.x-dev"
     }
-  },
-  "require-dev": {
-    "phpunit/phpunit": "^8.2"
   }
 }
$ composer update
PHPUnit 8.3-dev by Sebastian Bergmann and contributors.

Runtime:       PHP 7.3.7 with PCOV 1.0.6
Configuration: /usr/local/src/manifest/phpunit.xml

...............................................................  63 / 135 ( 46%)
............................................................... 126 / 135 ( 93%)
.........                                                       135 / 135 (100%)

Time: 155 ms, Memory: 16.00 MB

OK (135 tests, 139 assertions)

Generating code coverage report in HTML format ... done [47 ms]

Actual

actual

Expected

expected

@sebastianbergmann
Copy link
Owner Author

sebastianbergmann commented Jul 7, 2019

@sebastianfeldmann I think the dynamic class names of php-token-stream that you referenced in #3750 (comment) may be to blame here.

@sebastianbergmann
Copy link
Owner Author

This is weird: Although we have 'PHP_Token*' in build/scoper.inc.php it appears that the code of php-token-stream is prefixed. For instance, I see the following in the scoped PHAR:

<?php
namespace PHPUnit;
// ...
class PHP_Token_Stream_CachingFactory

@theofidry Do we need to use a different syntax to configure 'PHP_Token*' for the whitelist as that code does not use namespaces?

@sebastianbergmann
Copy link
Owner Author

Even if I explicitly configure each and every class of php-token-stream using its name they are still prefixed.

diff --git a/build/scoper.inc.php b/build/scoper.inc.php
index 827dbbece..ef590f936 100644
--- a/build/scoper.inc.php
+++ b/build/scoper.inc.php
@@ -12,7 +12,178 @@
     'whitelist' => [
         'PHPUnit\*',
         'SebastianBergmann\CodeCoverage\*',
-        'PHP_Token*',
         'Prophecy\*',
+        'PHP_Token',
+        'PHP_TokenWithScope',
+        'PHP_TokenWithScopeAndVisibility',
+        'PHP_Token_ABSTRACT',
+        'PHP_Token_AMPERSAND',
+        'PHP_Token_AND_EQUAL',
+        'PHP_Token_ARRAY',
+        'PHP_Token_ARRAY_CAST',
+        'PHP_Token_AS',
+        'PHP_Token_AT',
+        'PHP_Token_BACKTICK',
+        'PHP_Token_BAD_CHARACTER',
+        'PHP_Token_BOOLEAN_AND',
+        'PHP_Token_BOOLEAN_OR',
+        'PHP_Token_BOOL_CAST',
+        'PHP_Token_BREAK',
+        'PHP_Token_CALLABLE',
+        'PHP_Token_CARET',
+        'PHP_Token_CASE',
+        'PHP_Token_CATCH',
+        'PHP_Token_CHARACTER',
+        'PHP_Token_CLASS',
+        'PHP_Token_CLASS_C',
+        'PHP_Token_CLASS_NAME_CONSTANT',
+        'PHP_Token_CLONE',
+        'PHP_Token_CLOSE_BRACKET',
+        'PHP_Token_CLOSE_CURLY',
+        'PHP_Token_CLOSE_SQUARE',
+        'PHP_Token_CLOSE_TAG',
+        'PHP_Token_COALESCE',
+        'PHP_Token_COLON',
+        'PHP_Token_COMMA',
+        'PHP_Token_COMMENT',
+        'PHP_Token_CONCAT_EQUAL',
+        'PHP_Token_CONST',
+        'PHP_Token_CONSTANT_ENCAPSED_STRING',
+        'PHP_Token_CONTINUE',
+        'PHP_Token_CURLY_OPEN',
+        'PHP_Token_DEC',
+        'PHP_Token_DECLARE',
+        'PHP_Token_DEFAULT',
+        'PHP_Token_DIR',
+        'PHP_Token_DIV',
+        'PHP_Token_DIV_EQUAL',
+        'PHP_Token_DNUMBER',
+        'PHP_Token_DO',
+        'PHP_Token_DOC_COMMENT',
+        'PHP_Token_DOLLAR',
+        'PHP_Token_DOLLAR_OPEN_CURLY_BRACES',
+        'PHP_Token_DOT',
+        'PHP_Token_DOUBLE_ARROW',
+        'PHP_Token_DOUBLE_CAST',
+        'PHP_Token_DOUBLE_COLON',
+        'PHP_Token_DOUBLE_QUOTES',
+        'PHP_Token_ECHO',
+        'PHP_Token_ELLIPSIS',
+        'PHP_Token_ELSE',
+        'PHP_Token_ELSEIF',
+        'PHP_Token_EMPTY',
+        'PHP_Token_ENCAPSED_AND_WHITESPACE',
+        'PHP_Token_ENDDECLARE',
+        'PHP_Token_ENDFOR',
+        'PHP_Token_ENDFOREACH',
+        'PHP_Token_ENDIF',
+        'PHP_Token_ENDSWITCH',
+        'PHP_Token_ENDWHILE',
+        'PHP_Token_END_HEREDOC',
+        'PHP_Token_EQUAL',
+        'PHP_Token_EVAL',
+        'PHP_Token_EXCLAMATION_MARK',
+        'PHP_Token_EXIT',
+        'PHP_Token_EXTENDS',
+        'PHP_Token_FILE',
+        'PHP_Token_FINAL',
+        'PHP_Token_FINALLY',
+        'PHP_Token_FOR',
+        'PHP_Token_FOREACH',
+        'PHP_Token_FUNCTION',
+        'PHP_Token_FUNC_C',
+        'PHP_Token_GLOBAL',
+        'PHP_Token_GOTO',
+        'PHP_Token_GT',
+        'PHP_Token_HALT_COMPILER',
+        'PHP_Token_IF',
+        'PHP_Token_IMPLEMENTS',
+        'PHP_Token_INC',
+        'PHP_Token_INCLUDE',
+        'PHP_Token_INCLUDE_ONCE',
+        'PHP_Token_INLINE_HTML',
+        'PHP_Token_INSTANCEOF',
+        'PHP_Token_INSTEADOF',
+        'PHP_Token_INTERFACE',
+        'PHP_Token_INT_CAST',
+        'PHP_Token_ISSET',
+        'PHP_Token_IS_EQUAL',
+        'PHP_Token_IS_GREATER_OR_EQUAL',
+        'PHP_Token_IS_IDENTICAL',
+        'PHP_Token_IS_NOT_EQUAL',
+        'PHP_Token_IS_NOT_IDENTICAL',
+        'PHP_Token_IS_SMALLER_OR_EQUAL',
+        'PHP_Token_Includes',
+        'PHP_Token_LINE',
+        'PHP_Token_LIST',
+        'PHP_Token_LNUMBER',
+        'PHP_Token_LOGICAL_AND',
+        'PHP_Token_LOGICAL_OR',
+        'PHP_Token_LOGICAL_XOR',
+        'PHP_Token_LT',
+        'PHP_Token_METHOD_C',
+        'PHP_Token_MINUS',
+        'PHP_Token_MINUS_EQUAL',
+        'PHP_Token_MOD_EQUAL',
+        'PHP_Token_MULT',
+        'PHP_Token_MUL_EQUAL',
+        'PHP_Token_NAMESPACE',
+        'PHP_Token_NEW',
+        'PHP_Token_NS_C',
+        'PHP_Token_NS_SEPARATOR',
+        'PHP_Token_NUM_STRING',
+        'PHP_Token_OBJECT_CAST',
+        'PHP_Token_OBJECT_OPERATOR',
+        'PHP_Token_OPEN_BRACKET',
+        'PHP_Token_OPEN_CURLY',
+        'PHP_Token_OPEN_SQUARE',
+        'PHP_Token_OPEN_TAG',
+        'PHP_Token_OPEN_TAG_WITH_ECHO',
+        'PHP_Token_OR_EQUAL',
+        'PHP_Token_PAAMAYIM_NEKUDOTAYIM',
+        'PHP_Token_PERCENT',
+        'PHP_Token_PIPE',
+        'PHP_Token_PLUS',
+        'PHP_Token_PLUS_EQUAL',
+        'PHP_Token_POW',
+        'PHP_Token_POW_EQUAL',
+        'PHP_Token_PRINT',
+        'PHP_Token_PRIVATE',
+        'PHP_Token_PROTECTED',
+        'PHP_Token_PUBLIC',
+        'PHP_Token_QUESTION_MARK',
+        'PHP_Token_REQUIRE',
+        'PHP_Token_REQUIRE_ONCE',
+        'PHP_Token_RETURN',
+        'PHP_Token_SEMICOLON',
+        'PHP_Token_SL',
+        'PHP_Token_SL_EQUAL',
+        'PHP_Token_SPACESHIP',
+        'PHP_Token_SR',
+        'PHP_Token_SR_EQUAL',
+        'PHP_Token_START_HEREDOC',
+        'PHP_Token_STATIC',
+        'PHP_Token_STRING',
+        'PHP_Token_STRING_CAST',
+        'PHP_Token_STRING_VARNAME',
+        'PHP_Token_SWITCH',
+        'PHP_Token_Stream',
+        'PHP_Token_Stream_CachingFactory',
+        'PHP_Token_THROW',
+        'PHP_Token_TILDE',
+        'PHP_Token_TRAIT',
+        'PHP_Token_TRAIT_C',
+        'PHP_Token_TRY',
+        'PHP_Token_UNSET',
+        'PHP_Token_UNSET_CAST',
+        'PHP_Token_USE',
+        'PHP_Token_USE_FUNCTION',
+        'PHP_Token_VAR',
+        'PHP_Token_VARIABLE',
+        'PHP_Token_WHILE',
+        'PHP_Token_WHITESPACE',
+        'PHP_Token_XOR_EQUAL',
+        'PHP_Token_YIELD',
+        'PHP_Token_YIELD_FROM',
     ],
 ];

@sebastianbergmann
Copy link
Owner Author

Forgot about how whitelisting is implemented and looked at this wrong.

@sebastianbergmann
Copy link
Owner Author

This is indeed related to php-token-stream which has code like so

foreach ($this->tokens as $token) {
    switch (get_class($token)) {
        case 'PHP_Token_HALT_COMPILER':

With the scoped phpunit.phar, get_class($token) returns PHPUnit\PHP_Token_HALT_COMPILER, for instance, and not PHP_Token_HALT_COMPILER. Thus none of the case statements that operate on get_class($token) ever trigger.

@sebastianbergmann
Copy link
Owner Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type/bug Something is broken
Projects
None yet
Development

No branches or pull requests

1 participant