/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// We expect these to be defined in the global scope by runtest.py. /* global __LOCATION__, _PROFILE_PATH, _SERVER_PORT, _SERVER_ADDR, _DISPLAY_RESULTS,
_TEST_PREFIX, _HTTPD_PATH */ // Defined by xpcshell /* global quit */
// Set up a protocol substituion so that we can load the httpd.js file.
let protocolHandler = Services.io
.getProtocolHandler("resource")
.QueryInterface(Ci.nsIResProtocolHandler);
let httpdJSPath = PathUtils.toFileURI(_HTTPD_PATH);
// Disable automatic network detection, so tests work correctly when // not connected to a network. // eslint-disable-next-line mozilla/use-services var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
ios.manageOfflineStatus = false;
ios.offline = false;
var server; // for use in the shutdown handler, if necessary
var _quitting = false;
/** Quit when all activity has completed. */ function serverStopped() {
_quitting = true;
}
// // SCRIPT CODE //
runServer();
// We can only have gotten here if the /server/shutdown path was requested. if (_quitting) {
dumpn("HTTP server stopped, all pending requests complete");
quit(0);
}
// Impossible as the stop callback should have been called, but to be safe...
dumpn("TEST-UNEXPECTED-FAIL | failure to correctly shut down HTTP server");
quit(1);
var serverBasePath; var displayResults = true;
var gServerAddress; var SERVER_PORT;
// // SERVER SETUP // function runServer() {
serverBasePath = __LOCATION__.parent;
server = createMochitestServer(serverBasePath);
// verify server address // if a.b.c.d or 'localhost' if (typeof _SERVER_ADDR != "undefined") { if (_SERVER_ADDR == "localhost") {
gServerAddress = _SERVER_ADDR;
} else { var quads = _SERVER_ADDR.split("."); if (quads.length == 4) { var invalid = false; for (var i = 0; i < 4; i++) { if (quads[i] < 0 || quads[i] > 255) {
invalid = true;
}
} if (!invalid) {
gServerAddress = _SERVER_ADDR;
} else { thrownew Error( "invalid _SERVER_ADDR, please specify a valid IP Address"
);
}
}
}
} else { thrownew Error( "please define _SERVER_ADDR (as an ip address) before running server.js"
);
}
if (typeof _SERVER_PORT != "undefined") { if (parseInt(_SERVER_PORT) > 0 && parseInt(_SERVER_PORT) < 65536) {
SERVER_PORT = _SERVER_PORT;
}
} else { thrownew Error( "please define _SERVER_PORT (as a port number) before running server.js"
);
}
// If DISPLAY_RESULTS is not specified, it defaults to true if (typeof _DISPLAY_RESULTS != "undefined") {
displayResults = _DISPLAY_RESULTS;
}
server._start(SERVER_PORT, gServerAddress);
// touch a file in the profile directory to indicate we're alive var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(
Ci.nsIFileOutputStream
); var serverAlive = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
// Create a file to inform the harness that the server is ready if (serverAlive.exists()) {
serverAlive.append("server_alive.txt");
foStream.init(serverAlive, 0x02 | 0x08 | 0x20, 436, 0); // write, create, truncate var data = "It's alive!";
foStream.write(data, data.length);
foStream.close();
} else { thrownew Error( "Failed to create server_alive.txt because " +
serverAlive.path + " could not be found."
);
}
makeTags();
// // The following is threading magic to spin an event loop -- this has to // happen manually in xpcshell for the server to actually work. // varthread = Cc["@mozilla.org/thread-manager;1"].getService().currentThread; while (!server.isStopped()) { thread.processNextEvent(true);
}
// Server stopped by /server/shutdown handler -- go through pending events // and return.
// get rid of any pending requests while (thread.hasPendingEvents()) { thread.processNextEvent(true);
}
}
/** Creates and returns an HTTP server configured to serve Mochitests. */ function createMochitestServer(serverBasePath) { var server = new HttpServer();
var serverRoot = {
getFile: function getFile(path) { var file = serverBasePath.clone().QueryInterface(Ci.nsIFile);
path.split("/").forEach(function (p) {
file.appendRelativePath(p);
}); return file;
},
QueryInterface() { returnthis;
},
};
server.setObjectState("SERVER_ROOT", serverRoot);
processLocations(server);
return server;
}
/** * Notifies the HTTP server about all the locations at which it might receive * requests, so that it can properly respond to requests on any of the hosts it * serves.
*/ function processLocations(server) { var serverLocations = serverBasePath.clone();
serverLocations.append("server-locations.txt");
const PR_RDONLY = 0x01; var fis = new FileInputStream(
serverLocations,
PR_RDONLY,
292 /* 0444 */,
Ci.nsIFileInputStream.CLOSE_ON_EOF
);
var lis = new ConverterInputStream(fis, "UTF-8", 1024, 0x0);
lis.QueryInterface(Ci.nsIUnicharLineInputStream);
/** * Produce a normal directory listing.
*/ function regularListing(metadata, response) { var [links] = list(metadata.path, metadata.getProperty("directory"), false);
response.write( "\n" +
HTML(
HEAD(TITLE("mochitest index ", metadata.path)),
BODY(BR(), A({ href: ".." }, "Up a level"), UL(linksToListItems(links)))
)
);
}
/** * Read a manifestFile located at the root of the server's directory and turn * it into an object for creating a table of clickable links for each test.
*/ function convertManifestToTestLinks(root, manifest) { const { NetUtil } = ChromeUtils.importESModule( "resource://gre/modules/NetUtil.sys.mjs"
);
var manifestFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
manifestFile.initWithFile(serverBasePath);
manifestFile.append(manifest);
var manifestStream = Cc[ "@mozilla.org/network/file-input-stream;1"
].createInstance(Ci.nsIFileInputStream);
manifestStream.init(manifestFile, -1, 0, 0);
/** * Produce a test harness page containing all the test cases * below it, recursively.
*/ function testListing(metadata, response) { var links = {}; var count = 0; if (!metadata.queryString.includes("manifestFile")) {
[links, count] = list(
metadata.path,
metadata.getProperty("directory"), true
);
} elseif (typeof Components != "undefined") { var manifest = metadata.queryString.match(/manifestFile=([^&]+)/)[1];
/** * Respond to requests that match a file system directory. * Under the tests/ directory, return a test harness page.
*/ function defaultDirHandler(metadata, response) {
response.setStatusLine("1.1", 200, "OK");
response.setHeader("Content-type", "text/html;charset=utf-8", false); try { if (metadata.path.indexOf("/tests") != 0) {
regularListing(metadata, response);
} else {
testListing(metadata, response);
}
} catch (ex) {
response.write(ex);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.