From 19c69ba7ce245c14ca56b11abceb3fda7374d64c Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 30 Jul 2009 22:24:04 +0000 Subject: [PATCH] * Parser test supports uploading results to remote CodeReview instance Now I just have to finish the CodeReview extension side of it... ;) --- RELEASE-NOTES | 1 + includes/DefaultSettings.php | 15 ++++++ maintenance/parserTests.inc | 90 ++++++++++++++++++++++++++++++++++++ maintenance/parserTests.php | 2 +- 4 files changed, 107 insertions(+), 1 deletion(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 2095a68706..2bc875773f 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -166,6 +166,7 @@ this. Was used when mwEmbed was going to be an extension. * (bug 9691) Add type (signup or login) parameter to AuthPlugin::ModifyUITemplate() * (bug 14454) "Member of group(s)" in Special:Preferences causes language difficulties * (bug 16697) Unicode combining characters are difficult to edit in some browsers +* Parser test supports uploading results to remote CodeReview instance === Bug fixes in 1.16 === diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 3ccddcdc82..14b817faf3 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -3813,6 +3813,21 @@ $wgParserTestFiles = array( "$IP/maintenance/parserTests.txt", ); +/** + * If configured, specifies target CodeReview installation to send test + * result data from 'parserTests.php --upload' + * + * Something like this: + * $wgParserTestRemote = array( + * 'api-url' => 'http://www.mediawiki.org/w/api.php', + * 'repo' => 'MediaWiki', + * 'suite' => 'ParserTests', + * 'path' => '/trunk/phase3', // not used client-side; for reference + * 'secret' => 'qmoicj3mc4mcklmqw', // Shared secret used in HMAC validation + * ); + */ +$wgParserTestRemote = false; + /** * Break out of framesets. This can be used to prevent external sites from * framing your site with ads. diff --git a/maintenance/parserTests.inc b/maintenance/parserTests.inc index 7246605f82..926e19e256 100644 --- a/maintenance/parserTests.inc +++ b/maintenance/parserTests.inc @@ -116,6 +116,8 @@ class ParserTest { $this->recorder = new DbTestRecorder( $this ); } elseif( isset( $options['compare'] ) ) { $this->recorder = new DbTestPreviewer( $this ); + } elseif( isset( $options['upload'] ) ) { + $this->recorder = new RemoteTestRecorder( $this ); } else { $this->recorder = new TestRecorder( $this ); } @@ -1521,3 +1523,91 @@ class DbTestRecorder extends DbTestPreviewer { __METHOD__ ); } } + +class RemoteTestRecorder extends TestRecorder { + function start() { + parent::start(); + $this->results = array(); + $this->ping( 'running' ); + } + + function record( $test, $result ) { + parent::record( $test, $result ); + $this->results[$test] = (bool)$result; + } + + function end() { + $this->ping( 'complete', $this->results ); + parent::end(); + } + + /** + * Inform a CodeReview instance that we've started or completed a test run... + * @param $remote array: info on remote target + * @param $status string: "running" - tell it we've started + * "complete" - provide test results array + * "abort" - something went horribly awry + * @param $data array of test name => true/false + */ + function ping( $status, $results=false ) { + global $wgParserTestRemote, $IP; + + $remote = $wgParserTestRemote; + $revId = SpecialVersion::getSvnRevision( $IP ); + $jsonResults = json_encode( $results ); + + if( !$remote ) { + print "Can't do remote upload without configuring \$wgParserTestRemote!\n"; + exit( 1 ); + } + + // Generate a hash MAC to validate our credentials + $message = array( + $remote['repo'], + $remote['suite'], + $revId, + $status, + ); + if( $status == "complete" ) { + $message[] = $jsonResults; + } + $hmac = hash_hmac( "sha1", implode( "|", $message ), $remote['secret'] ); + + $postData = array( + 'action' => 'codetestupload', + 'format' => 'json', + 'repo' => $remote['repo'], + 'suite' => $remote['suite'], + 'rev' => $revId, + 'status' => $status, + 'hmac' => $hmac, + ); + if( $status == "complete" ) { + $postData['results'] = $jsonResults; + } + $response = $this->post( $remote['api-url'], $postData ); + + if( $response === false ) { + print "CodeReview info upload failed to reach server.\n"; + exit( 1 ); + } + $responseData = json_decode( $response, true ); + if( !is_array( $responseData ) ) { + print "CodeReview API response not recognized...\n"; + wfDebug( "Unrecognized CodeReview API response: $response\n" ); + exit( 1 ); + } + if( isset( $responseData['error'] ) ) { + $code = $responseData['error']['code']; + $info = $responseData['error']['info']; + print "CodeReview info upload failed: $code $info\n"; + exit( 1 ); + } + } + + function post( $url, $data ) { + // @fixme: for whatever reason, I get a 417 fail when using CURL's multipart form submit. + // If we do form URL encoding ourselves, though, it should work. + return Http::post( $url, array( 'postdata' => wfArrayToCGI( $data ) ) ); + } +} diff --git a/maintenance/parserTests.php b/maintenance/parserTests.php index 41f5d73f88..83bc1f90f5 100644 --- a/maintenance/parserTests.php +++ b/maintenance/parserTests.php @@ -47,7 +47,7 @@ Options: --seed Start the fuzz test from the specified seed --help Show this help message --run-disabled run disabled tests - + --upload Upload test results to remote wiki (per \$wgParserTestRemote) ENDS; exit( 0 ); -- 2.20.1