Merge "Add an "editor" extension type"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 14 Apr 2018 02:27:05 +0000 (02:27 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 14 Apr 2018 02:27:06 +0000 (02:27 +0000)
Gruntfile.js
includes/Storage/NameTableStore.php
includes/libs/rdbms/database/Database.php
includes/specialpage/LoginSignupSpecialPage.php
package.json
tests/phpunit/includes/Storage/NameTableStoreTest.php
tests/phpunit/includes/db/LoadBalancerTest.php
tests/selenium/selenium.sh [new file with mode: 0755]
tests/selenium/wdio.conf.jenkins.js [deleted file]
tests/selenium/wdio.conf.js

index cb9a20d..69a123c 100644 (file)
@@ -4,7 +4,6 @@ module.exports = function ( grunt ) {
 
        var wgServer = process.env.MW_SERVER,
                wgScriptPath = process.env.MW_SCRIPT_PATH,
-               WebdriverIOconfigFile,
                karmaProxy = {};
 
        grunt.loadNpmTasks( 'grunt-banana-checker' );
@@ -21,12 +20,6 @@ module.exports = function ( grunt ) {
                changeOrigin: true
        };
 
-       if ( process.env.JENKINS_HOME ) {
-               WebdriverIOconfigFile = './tests/selenium/wdio.conf.jenkins.js';
-       } else {
-               WebdriverIOconfigFile = './tests/selenium/wdio.conf.js';
-       }
-
        grunt.initConfig( {
                eslint: {
                        all: [
@@ -116,7 +109,7 @@ module.exports = function ( grunt ) {
                // Configure WebdriverIO task
                webdriver: {
                        test: {
-                               configFile: WebdriverIOconfigFile
+                               configFile: './tests/selenium/wdio.conf.js'
                        }
                }
 
index 465f299..ebce3da 100644 (file)
@@ -321,7 +321,8 @@ class NameTableStore {
                                'name' => $this->nameField
                        ],
                        [],
-                       __METHOD__
+                       __METHOD__,
+                       [ 'ORDER BY' => 'id' ]
                );
 
                $assocArray = [];
index f681795..1779880 100644 (file)
@@ -1181,8 +1181,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                        } else {
                                                # Nothing prior was there to lose from the transaction,
                                                # so just roll it back.
-                                               $this->doRollback( __METHOD__ . " ($fname)" );
-                                               $this->trxStatus = self::STATUS_TRX_OK;
+                                               $this->rollback( __METHOD__ . " ($fname)", self::FLUSHING_INTERNAL );
                                        }
                                        $this->trxStatusIgnoredCause = null;
                                } else {
index d6ace0a..1c54d13 100644 (file)
@@ -515,7 +515,6 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         * @private
         */
        protected function mainLoginForm( array $requests, $msg = '', $msgtype = 'error' ) {
-               $titleObj = $this->getPageTitle();
                $user = $this->getUser();
                $out = $this->getOutput();
 
index c33fb74..a282d69 100644 (file)
@@ -5,7 +5,7 @@
     "qunit": "grunt qunit",
     "doc": "jsduck",
     "postdoc": "grunt copy:jsduck",
-    "selenium": "killall -0 chromedriver 2>/dev/null || chromedriver --url-base=/wd/hub --port=4444 & grunt webdriver:test; killall chromedriver"
+    "selenium": "./tests/selenium/selenium.sh"
   },
   "devDependencies": {
     "bluebird": "3.5.1",
index 5276a14..0cd164b 100644 (file)
@@ -257,7 +257,7 @@ class NameTableStoreTest extends MediaWikiTestCase {
                $store->getMap();
                $table = $store->getMap();
 
-               $expected = [ 2 => 'bar', 1 => 'foo' ];
+               $expected = [ 1 => 'foo', 2 => 'bar' ];
                $this->assertSame( $expected, $table );
                // Make sure the table returned is the same as the cached table
                $this->assertSame( $expected, TestingAccessWrapper::newFromObject( $store )->tableCache );
index cb29975..88cf0e0 100644 (file)
@@ -51,6 +51,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
 
                $lb = new LoadBalancer( [
                        'servers' => $servers,
+                       'queryLogger' => MediaWiki\Logger\LoggerFactory::getInstance( 'DBQuery' ),
                        'localDomain' => new DatabaseDomain( $wgDBname, null, $this->dbPrefix() )
                ] );
 
@@ -120,6 +121,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $lb = new LoadBalancer( [
                        'servers' => $servers,
                        'localDomain' => new DatabaseDomain( $wgDBname, null, $this->dbPrefix() ),
+                       'queryLogger' => MediaWiki\Logger\LoggerFactory::getInstance( 'DBQuery' ),
                        'loadMonitorClass' => LoadMonitorNull::class
                ] );
 
@@ -175,8 +177,6 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                // re-throw original error, to preserve stack trace
                                throw $ex;
                        }
-               } finally {
-                       $db->rollback( __METHOD__, 'flush' );
                }
        }
 
@@ -184,6 +184,14 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $table = $db->tableName( 'some_table' );
                try {
                        $db->dropTable( 'some_table' ); // clear for sanity
+
+                       // Trigger DBO_TRX to create a transaction so the flush below will
+                       // roll everything here back in sqlite. But don't actually do the
+                       // code below inside an atomic section becaue MySQL and Oracle
+                       // auto-commit transactions for DDL statements like CREATE TABLE.
+                       $db->startAtomic( __METHOD__ );
+                       $db->endAtomic( __METHOD__ );
+
                        // Use only basic SQL and trivial types for these queries for compatibility
                        $this->assertNotSame(
                                false,
@@ -195,12 +203,10 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                $db->query( "DELETE FROM $table WHERE id=57634126", __METHOD__ ),
                                "delete query"
                        );
-                       $this->assertNotSame(
-                               false,
-                               $db->query( "DROP TABLE $table", __METHOD__ ),
-                               "table dropped"
-                       );
                } finally {
+                       // Drop the table to clean up, ignoring any error.
+                       $db->query( "DROP TABLE $table", __METHOD__, true );
+                       // Rollback the DBO_TRX transaction for sqlite's benefit.
                        $db->rollback( __METHOD__, 'flush' );
                }
        }
diff --git a/tests/selenium/selenium.sh b/tests/selenium/selenium.sh
new file mode 100755 (executable)
index 0000000..519b7be
--- /dev/null
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+set -euo pipefail
+chromedriver --url-base=/wd/hub --port=4444 &
+# Make sure it is killed to prevent file descriptors leak
+function kill_chromedriver() {
+    killall chromedriver > /dev/null
+}
+trap kill_chromedriver EXIT
+./node_modules/.bin/grunt webdriver:test
diff --git a/tests/selenium/wdio.conf.jenkins.js b/tests/selenium/wdio.conf.jenkins.js
deleted file mode 100644 (file)
index de2b738..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-const merge = require( 'deepmerge' ),
-       password = 'testpass',
-       username = 'WikiAdmin',
-       wdioConf = require( './wdio.conf.js' );
-
-// Overwrite default settings
-exports.config = merge( wdioConf.config, {
-       username: process.env.MEDIAWIKI_USER === undefined ?
-               username :
-               process.env.MEDIAWIKI_USER,
-       password: process.env.MEDIAWIKI_PASSWORD === undefined ?
-               password :
-               process.env.MEDIAWIKI_PASSWORD,
-       screenshotPath: '../log/',
-       baseUrl: process.env.MW_SERVER + process.env.MW_SCRIPT_PATH,
-       exclude: [
-               './extensions/CirrusSearch/tests/selenium/specs/**/*.js'
-       ],
-       reporters: [ 'spec', 'junit' ],
-       reporterOptions: {
-               junit: {
-                       outputDir: '../log/'
-               }
-       }
-} );
index 0b374c8..0930a0f 100644 (file)
@@ -1,9 +1,21 @@
 'use strict';
 
-const password = 'vagrant',
-       fs = require( 'fs' ),
-       path = require( 'path' ),
+const fs = require( 'fs' ),
+       path = require( 'path' );
+
+let logPath, password, username;
+
+// username and password will be used only if
+// MEDIAWIKI_USER or MEDIAWIKI_PASSWORD environment variables are not set
+if ( process.env.JENKINS_HOME ) {
+       logPath = '../log/';
+       password = 'testpass';
+       username = 'WikiAdmin';
+} else {
+       logPath = './log/';
+       password = 'vagrant';
        username = 'Admin';
+}
 
 function relPath( foo ) {
        return path.resolve( __dirname, '../..', foo );
@@ -49,7 +61,7 @@ exports.config = {
        ],
        // Patterns to exclude.
        exclude: [
-       // 'path/to/excluded/files'
+               './extensions/CirrusSearch/tests/selenium/specs/**/*.js'
        ],
        //
        // ============
@@ -117,7 +129,7 @@ exports.config = {
        bail: 0,
        //
        // Saves a screenshot to a given path if a command fails.
-       screenshotPath: './log/',
+       screenshotPath: logPath,
        //
        // Set a base URL in order to shorten url command calls. If your `url` parameter starts
        // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
@@ -177,7 +189,12 @@ exports.config = {
        // Test reporter for stdout.
        // The only one supported by default is 'dot'
        // see also: http://webdriver.io/guide/testrunner/reporters.html
-       reporters: [ 'spec' ],
+       reporters: [ 'spec', 'junit' ],
+       reporterOptions: {
+               junit: {
+                       outputDir: logPath
+               }
+       },
        //
        // Options to be passed to Mocha.
        // See the full list at http://mochajs.org/