1 var request = require( "request" ),
2 querystring = require( "querystring" ).stringify,
3 url = require( "url" );
5 function extend( a, b ) {
12 function baseUrl( config ) {
13 // make sure there's always a trailing slash
14 return url.format( config.urlParts).replace( /\/$/, "" ) + "/";
17 function continueRunning( job ) {
18 return job.runs.filter(function( run ) {
19 return Object.keys(run.uaRuns).filter(function( uaRun ) {
20 return (/new|progress/).test( run.uaRuns[ uaRun ].runStatus );
25 function runStats( uaID, uaRun ) {
26 var base = uaID + ": " + uaRun.runStatus;
27 if ( uaRun.runResultsUrl ) {
28 base += " (" + uaRun.runResultsLabel + ")" + ": " + uaRun.runResultsUrl;
33 function logResults( config, job, state ) {
35 console.log( "Job " + job.jobInfo.id + ":\n\t" + job.jobInfo.name + "\nState:\n\t" + state );
36 console.log( "\nResults: " );
37 job.runs.filter(function( run ) {
39 console.log( "\n - " + run.info.name + ":" );
40 for ( uaID in run.uaRuns ) {
41 console.log( runStats( uaID, run.uaRuns[uaID] ) );
42 // "new", "failed", "error", "timedout", ..
43 if ( run.uaRuns[uaID].runStatus !== "passed" ) {
48 config.done( passed );
51 function pollResults( config, job ) {
52 process.stdout.write( "." );
53 request.get( baseUrl( config ) + "api.php?" + querystring({
56 }), function ( error, response, body ) {
60 var result = JSON.parse( body );
62 console.log( "API returned error, can't continue. Response was: " + body );
66 if ( continueRunning( result.job ) ) {
67 if ( config.started + config.timeout < +new Date() ) {
68 process.stdout.write( "\n\n" );
69 logResults( config, result.job, "Timed out after " + config.timeout + 'ms' );
71 setTimeout(function () {
72 pollResults( config, job );
73 }, config.pollInterval );
75 process.stdout.write( "\n\n" );
76 logResults( config, result.job, "Finished" );
81 module.exports = function ( config, addjobParams ) {
84 // url: {String} required, no default
85 // done: {Function} required, no default
88 timeout: 1000 * 60 * 15,
90 urlParts: url.parse( config.url )
92 addjobParams = extend(addjobParams, {
96 url: baseUrl( config ) + "api.php",
98 }, function ( error, response, body ) {
104 result = JSON.parse( body );
106 console.log( "Failed parsing body as json, was: " + body );
107 config.done( false );
109 if ( !result.addjob ) {
110 console.log( "API returned error, can't continue. Response was: " + body );
111 config.done( false );
114 jobInfo = result.addjob;
115 console.log( "Submited job " + jobInfo.id + " " + baseUrl( config ) + "job/" + jobInfo.id );
116 process.stdout.write( "Polling for results" );
117 pollResults( config, jobInfo );