forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			173 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const DATA_PDF = atob(
 | 
						|
  "JVBERi0xLjANCjEgMCBvYmo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI+PmVuZG9iaiAyIDAgb2JqPDwvVHlwZS9QYWdlcy9LaWRzWzMgMCBSXS9Db3VudCAxPj5lbmRvYmogMyAwIG9iajw8L1R5cGUvUGFnZS9NZWRpYUJveFswIDAgMyAzXT4+ZW5kb2JqDQp4cmVmDQowIDQNCjAwMDAwMDAwMDAgNjU1MzUgZg0KMDAwMDAwMDAxMCAwMDAwMCBuDQowMDAwMDAwMDUzIDAwMDAwIG4NCjAwMDAwMDAxMDIgMDAwMDAgbg0KdHJhaWxlcjw8L1NpemUgNC9Sb290IDEgMCBSPj4NCnN0YXJ0eHJlZg0KMTQ5DQolRU9G"
 | 
						|
);
 | 
						|
 | 
						|
const DOWNLOAD_TEMPLATE = {
 | 
						|
  source: {
 | 
						|
    url: "https://example.com/download",
 | 
						|
  },
 | 
						|
  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}`
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |