Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

const DATA_PDF = atob(
"JVBERi0xLjANCjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI+PmVuZG9iaiAyIDAgb2JqPDwvVHlwZS9QYWdlcy9LaWRzWzMgMCBSXS9Db3VudCAxPj5lbmRvYmogMyAwIG9iajw8L1R5cGUvUGFnZS9NZWRpYUJveFswIDAgMyAzXT4+ZW5kb2JqDQp4cmVmDQowIDQNCjAwMDAwMDAwMDAgNjU1MzUgZg0KMDAwMDAwMDAxMCAwMDAwMCBuDQowMDAwMDAwMDUzIDAwMDAwIG4NCjAwMDAwMDAxMDIgMDAwMDAgbg0KdHJhaWxlcjw8L1NpemUgNC9Sb290IDEgMCBSPj4NCnN0YXJ0eHJlZg0KMTQ5DQolRU9G"
);
const DOWNLOAD_TEMPLATE = {
source: {
},
target: {
path: "",
},
contentType: "text/plain",
succeeded: DownloadsCommon.DOWNLOAD_FINISHED,
canceled: false,
error: null,
hasPartialData: false,
hasBlockedData: false,
startTime: new Date(Date.now() - 1000),
};
const TESTFILES = {
"download-test.txt": "Text file contents\n",
"download-test.pdf": DATA_PDF,
"download-test.PDF": DATA_PDF,
"download-test.xxunknown": "Unknown file contents\n",
"download-test": "No extension file contents\n",
};
let gPublicList;
add_task(async function test_setup() {
let profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile).path;
Assert.ok(profileDir, "profileDir: " + profileDir);
for (let [filename, contents] of Object.entries(TESTFILES)) {
TESTFILES[filename] = await createDownloadedFile(
PathUtils.join(gDownloadDir, filename),
contents
);
}
gPublicList = await Downloads.getList(Downloads.PUBLIC);
});
const TESTCASES = [
{
name: "Check returned value is null when the download did not succeed",
testFile: "download-test.txt",
contentType: "text/plain",
succeeded: false,
expected: null,
},
{
name: "Check correct mime-info is returned when download contentType is unambiguous",
testFile: "download-test.txt",
contentType: "text/plain",
expected: {
type: "text/plain",
},
},
{
name: "Returns correct mime-info from file extension when download contentType is missing",
testFile: "download-test.pdf",
contentType: undefined,
expected: {
type: "application/pdf",
},
},
{
name: "Returns correct mime-info from file extension case-insensitively",
testFile: "download-test.PDF",
contentType: undefined,
expected: {
type: "application/pdf",
},
},
{
name: "Returns null when contentType is missing and file extension is unknown",
testFile: "download-test.xxunknown",
contentType: undefined,
expected: null,
},
{
name: "Returns contentType when contentType is ambiguous and file extension is unknown",
testFile: "download-test.xxunknown",
contentType: "application/octet-stream",
expected: {
type: "application/octet-stream",
},
},
{
name: "Returns contentType when contentType is ambiguous and there is no file extension",
testFile: "download-test",
contentType: "application/octet-stream",
expected: {
type: "application/octet-stream",
},
},
{
name: "Returns null when there's no contentType and no file extension",
testFile: "download-test",
contentType: undefined,
expected: null,
},
];
// add tests for each of the generic mime-types we recognize,
// to ensure they prefer the associated mime-type of the target file extension
for (let type of [
"application/octet-stream",
"binary/octet-stream",
"application/unknown",
]) {
TESTCASES.push({
name: `Returns correct mime-info from file extension when contentType is generic (${type})`,
testFile: "download-test.pdf",
contentType: type,
expected: {
type: "application/pdf",
},
});
}
for (let testData of TESTCASES) {
let tmp = {
async [testData.name]() {
info("testing with: " + JSON.stringify(testData));
await test_getMimeInfo_basic_function(testData);
},
};
add_task(tmp[testData.name]);
}
/**
* Sanity test the DownloadsCommon.getMimeInfo method with test parameters
*/
async function test_getMimeInfo_basic_function(testData) {
let downloadData = {
...DOWNLOAD_TEMPLATE,
source: "source" in testData ? testData.source : DOWNLOAD_TEMPLATE.source,
succeeded:
"succeeded" in testData
? testData.succeeded
: DOWNLOAD_TEMPLATE.succeeded,
target: TESTFILES[testData.testFile],
contentType: testData.contentType,
};
Assert.ok(downloadData.target instanceof Ci.nsIFile, "target is a nsIFile");
let download = await Downloads.createDownload(downloadData);
await gPublicList.add(download);
await download.refresh();
Assert.ok(
await IOUtils.exists(download.target.path),
"The file should actually exist."
);
let result = await DownloadsCommon.getMimeInfo(download);
if (testData.expected) {
Assert.equal(
result.type,
testData.expected.type,
"Got expected mimeInfo.type"
);
} else {
Assert.equal(
result,
null,
`Expected null, got object with type: ${result?.type}`
);
}
}