Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Tests for file:/// producing a directory/drive listing on all platforms. */
"use strict";
const { AppConstants } = ChromeUtils.importESModule(
"resource://gre/modules/AppConstants.sys.mjs"
);
function openChannelRead(chan) {
return new Promise((resolve, reject) => {
let buffer = "";
chan.asyncOpen({
onStartRequest() {},
onDataAvailable(request, stream, offset, count) {
buffer += read_stream(stream, count);
},
onStopRequest(request, status) {
if (!Components.isSuccessCode(status)) {
reject(new Error("Channel failed: 0x" + status.toString(16)));
return;
}
resolve(buffer);
},
QueryInterface: ChromeUtils.generateQI([
"nsIStreamListener",
"nsIRequestObserver",
]),
});
});
}
add_task(async function test_listing_content_type() {
const chan = NetUtil.newChannel({
uri: "file:///",
loadUsingSystemPrincipal: true,
contentPolicyType: Ci.nsIContentPolicy.TYPE_DOCUMENT,
});
await openChannelRead(chan);
Assert.equal(
chan.contentType,
"application/http-index-format",
"file:/// must return application/http-index-format"
);
});
add_task(async function test_windows_drive_listing_format() {
if (AppConstants.platform != "win") {
return;
}
const chan = NetUtil.newChannel({
uri: "file:///",
loadUsingSystemPrincipal: true,
contentPolicyType: Ci.nsIContentPolicy.TYPE_DOCUMENT,
});
const data = await openChannelRead(chan);
const lines = data.split("\n");
Assert.equal(
lines[0],
"200: filename content-length last-modified file-type",
"First line must be the http-index-format header"
);
const driveLines = lines.filter(l => l.startsWith("201: "));
Assert.greater(driveLines.length, 0, "At least one drive must be listed");
const driveRe =
/^201: [A-Z]:\/\s+0\s+Thu,%2001%20Jan%201970%2000:00:00%20GMT DIRECTORY$/;
for (const line of driveLines) {
Assert.ok(driveRe.test(line), `Drive line has expected format: "${line}"`);
}
Assert.ok(
driveLines.some(l => l.startsWith("201: C:/")),
"C: drive must appear in the listing"
);
});
add_task(async function test_posix_root_listing_format() {
if (AppConstants.platform == "win") {
return;
}
const chan = NetUtil.newChannel({
uri: "file:///",
loadUsingSystemPrincipal: true,
contentPolicyType: Ci.nsIContentPolicy.TYPE_DOCUMENT,
});
const data = await openChannelRead(chan);
const lines = data.split("\n");
Assert.equal(
lines[0],
"200: filename content-length last-modified file-type",
"First line must be the http-index-format header"
);
const driveLines = lines.filter(l => l.startsWith("201: "));
Assert.greater(driveLines.length, 0, "Root directory must have entries");
const entryRe = /^201: \S+ \d+ \S+ (FILE|DIRECTORY|SYMBOLIC-LINK) $/;
for (const line of driveLines) {
Assert.ok(entryRe.test(line), `Entry has expected format: "${line}"`);
}
const names = new Set(driveLines.map(l => l.split(" ")[1]));
Assert.ok(names.has("etc"), "'etc' must appear in the root listing");
Assert.ok(names.has("tmp"), "'tmp' must appear in the root listing");
});