Use random port in test webserver

This commit is contained in:
Rob Wu 2015-11-10 19:08:52 +01:00
parent 1280b7b76b
commit ff8c334207
2 changed files with 16 additions and 2 deletions

View File

@ -60,7 +60,7 @@ function parseOptions() {
.example('$0 --b=firefox -t=issue5567 -t=issue5909', .example('$0 --b=firefox -t=issue5567 -t=issue5909',
'Run the reftest identified by issue5567 and issue5909 in Firefox.') 'Run the reftest identified by issue5567 and issue5909 in Firefox.')
.describe('port', 'The port the HTTP server should listen on.') .describe('port', 'The port the HTTP server should listen on.')
.default('port', 8000) .default('port', 0)
.describe('unitTest', 'Run the unit tests.') .describe('unitTest', 'Run the unit tests.')
.describe('fontTest', 'Run the font tests.') .describe('fontTest', 'Run the font tests.')
.describe('noDownload', 'Skips test PDFs downloading.') .describe('noDownload', 'Skips test PDFs downloading.')

View File

@ -44,7 +44,7 @@ var defaultMimeType = 'application/octet-stream';
function WebServer() { function WebServer() {
this.root = '.'; this.root = '.';
this.host = 'localhost'; this.host = 'localhost';
this.port = 8000; this.port = 0;
this.server = null; this.server = null;
this.verbose = false; this.verbose = false;
this.cacheExpirationTime = 0; this.cacheExpirationTime = 0;
@ -56,6 +56,7 @@ function WebServer() {
} }
WebServer.prototype = { WebServer.prototype = {
start: function (callback) { start: function (callback) {
this._ensureNonZeroPort();
this.server = http.createServer(this._handler.bind(this)); this.server = http.createServer(this._handler.bind(this));
this.server.listen(this.port, this.host, callback); this.server.listen(this.port, this.host, callback);
console.log( console.log(
@ -65,6 +66,19 @@ WebServer.prototype = {
this.server.close(callback); this.server.close(callback);
this.server = null; this.server = null;
}, },
_ensureNonZeroPort: function () {
if (!this.port) {
// If port is 0, a random port will be chosen instead. Do not set a host
// name to make sure that the port is synchronously set by .listen().
var server = http.createServer().listen(0);
var address = server.address();
// .address().port being available synchronously is merely an
// implementation detail. So we are defensive here and fall back to some
// fixed port when the address is not available yet.
this.port = address ? address.port : 8000;
server.close();
}
},
_handler: function (req, res) { _handler: function (req, res) {
var url = req.url; var url = req.url;
var urlParts = /([^?]*)((?:\?(.*))?)/.exec(url); var urlParts = /([^?]*)((?:\?(.*))?)/.exec(url);