Page MenuHomePhabricator

MediaWiki code coverage fails on Zend PHP 7.0 due to a database error
Closed, ResolvedPublic


I have crafted Jenkins job mediawiki-core-code-coverage-php7 which runs the PHPUnit suite with phpdbg on Jessie and with Zend PHP 7.0. It fails with a database error though:

Mon Oct 10 8:43:43 UTC 2016     integration-slave-jessie-1004   jenkins_u0_mw-unittest_
  Block::newLoad  [Null]  1       no such table: unittest_ipblocks
  SELECT  * FROM unittest_ipblocks    WHERE ipb_address = 'UTBlockee'  

Mon Oct 10 8:43:57 UTC 2016     integration-slave-jessie-1004   jenkins_u0_mw-unittest_
  User::loadFromDatabase  [Null]  1       no such table: unittest_user
  SELECT * FROM unittest_user    WHERE user_id = '2'  LIMIT 1
2016-10-10 08:43:57 integration-slave-jessie-1004 jenkins_u0_mw-unittest_:
  [2605549f1fb07ed4ac21da84] [no req]
  DBQueryError from line 1037 of includes/libs/rdbms/database/Database.php:
    A database query error has occurred. Did you forget to run your application's database schema updater after upgrading?
      SELECT *  
      FROM unittest_user
      WHERE user_id = '2'  LIMIT 1

Function: User::loadFromDatabase
Error: 1 no such table: unittest_user

 #0 includes/libs/rdbms/database/Database.php(895): Database->reportQueryError(string, integer, string, string, boolean)
 #1 includes/libs/rdbms/database/Database.php(1237): Database->query(string, string)
 #2 includes/libs/rdbms/database/Database.php(1305): Database->select(string, array, array, string, array, array)
 #3 includes/user/User.php(1236): Database->selectRow(string, array, array, string, array)
 #4 includes/user/User.php(480): User->loadFromDatabase(integer)
 #5 includes/libs/objectcache/WANObjectCache.php(880): User->{closure}(boolean, integer, array, NULL)
 #6 includes/libs/objectcache/WANObjectCache.php(997): WANObjectCache->{closure}(boolean, integer, array, NULL)
 #7 includes/libs/objectcache/WANObjectCache.php(883): WANObjectCache->doGetWithSetCallback(string, integer, Closure, array, NULL)
 #8 includes/user/User.php(494): WANObjectCache->getWithSetCallback(string, integer, Closure, array)
 #9 includes/user/User.php(436): User->loadFromCache()
#10 includes/user/User.php(396): User->loadFromId(integer)
#11 includes/user/User.php(2088): User->load()
#12 tests/phpunit/includes/BlockTest.php(18): User->getId()
#13 tests/phpunit/MediaWikiTestCase.php(388): BlockTest->addDBData()
#14 vendor/phpunit/phpunit/src/Framework/TestSuite.php(747): MediaWikiTestCase->run(PHPUnit_Framework_TestResult)
#15 vendor/phpunit/phpunit/src/Framework/TestSuite.php(747): PHPUnit_Framework_TestSuite->run(PHPUnit_Framework_TestResult)
#16 vendor/phpunit/phpunit/src/Framework/TestSuite.php(747): PHPUnit_Framework_TestSuite->run(PHPUnit_Framework_TestResult)
#17 vendor/phpunit/phpunit/src/TextUI/TestRunner.php(440): PHPUnit_Framework_TestSuite->run(PHPUnit_Framework_TestResult)
#18 vendor/phpunit/phpunit/src/TextUI/Command.php(149): PHPUnit_TextUI_TestRunner->doRun(PHPUnit_Framework_TestSuite, array)
#19 vendor/phpunit/phpunit/src/TextUI/Command.php(100): PHPUnit_TextUI_Command->run(array, boolean)
#20 tests/phpunit/phpunit.php(133): PHPUnit_TextUI_Command::main()
#21 maintenance/doMaintenance.php(110): PHPUnitMaintClass->execute()
#22 tests/phpunit/phpunit.php(163): require(string)
#23 {main}

The cloned tables with a unittest_ prefix are not available, either because they are not cloned properly or the test suite somehow switch to a new database connection which would not have the tables available (they are temporary ones).

Event Timeline

And mediawiki db name is MW_DB=jenkins_u0_mw

Not sure, but this could be linked to T155147 - I say that because MediaWikiTestCase::needsDB() and addDBData() are mentionned, just like in the other task. In a nutshell, the other task is about not reinitializing the DB in tests but there are bad interactions between static and non-static methods, and given this task is about tests not initializing the DB, perhaps there are common root causes.

Legoktm added a subscriber: Legoktm.

This was resolved at some point, running the coverage job on PHP 7 works fine:

The coverage result is a bit different though, 21.3% (44784/210421 elements) on PHP 5 versus 20.5% (38354/187470 elements) on PHP 7. But it's also nearly twice as fast, which is probably worth pursuing further.