Add tests for Zotero.File.download #2216
This test covers couple of scenarios downloading a 16MB file from a local http server (simple and concurrently) using Zotero.File.download. When running current implementation, this seems to fail persistently. In real-world usage, current implementation seems to work intermittently, failing more often for larger files. This intermittent behaviour is most likely cause of #2216.
This commit is contained in:
parent
e09f1ba5d2
commit
a08c3dee14
1 changed files with 75 additions and 0 deletions
|
@ -429,4 +429,79 @@ describe("Zotero.File", function () {
|
||||||
throw new Error("Error not thrown");
|
throw new Error("Error not thrown");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#download()', function () {
|
||||||
|
const sizeInMB = 16; // size of the generated text file
|
||||||
|
let port, httpd, baseURL;
|
||||||
|
|
||||||
|
before(async function () {
|
||||||
|
// Real HTTP server
|
||||||
|
Components.utils.import("resource://zotero-unit/httpd.js");
|
||||||
|
port = 16213;
|
||||||
|
httpd = new HttpServer();
|
||||||
|
baseURL = `http://127.0.0.1:${port}`;
|
||||||
|
httpd.start(port);
|
||||||
|
httpd.registerPathHandler(
|
||||||
|
'/file1.txt',
|
||||||
|
{
|
||||||
|
handle: function (request, response) {
|
||||||
|
const text1KB = Array.from({ length: 64 }, _ => "lorem ipsum foo\n").join('');
|
||||||
|
const text16MB = Array.from({ length: 1024 * sizeInMB }, _ => text1KB).join('');
|
||||||
|
response.setStatusLine(null, 200, "OK");
|
||||||
|
response.setHeader('Content-Type', 'text/plain', false);
|
||||||
|
response.write(text16MB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
after(function* () {
|
||||||
|
var defer = new Zotero.Promise.defer();
|
||||||
|
httpd.stop(() => defer.resolve());
|
||||||
|
yield defer.promise;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should download a file", async function () {
|
||||||
|
const url = `${baseURL}/file1.txt`;
|
||||||
|
const path = OS.Path.join(Zotero.getTempDirectory().path, 'zotero.txt');
|
||||||
|
await Zotero.File.download(url, path);
|
||||||
|
const fileSize = (await OS.File.stat(path)).size;
|
||||||
|
assert.equal(fileSize, 1024 * 1024 * sizeInMB);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should concurrently download three large files", async function () {
|
||||||
|
const url = `${baseURL}/file1.txt`;
|
||||||
|
|
||||||
|
var caller = new ConcurrentCaller({
|
||||||
|
numConcurrent: 3,
|
||||||
|
Promise: Zotero.Promise,
|
||||||
|
});
|
||||||
|
|
||||||
|
let failed = false;
|
||||||
|
|
||||||
|
const fetchFile = async (srcUrl, targetPath) => {
|
||||||
|
try {
|
||||||
|
await Zotero.File.download(srcUrl, targetPath);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
failed = true;
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
caller.add(() => fetchFile(url, OS.Path.join(Zotero.getTempDirectory().path, 'zotero-1.txt')));
|
||||||
|
caller.add(() => fetchFile(url, OS.Path.join(Zotero.getTempDirectory().path, 'zotero-2.txt')));
|
||||||
|
caller.add(() => fetchFile(url, OS.Path.join(Zotero.getTempDirectory().path, 'zotero-3.txt')));
|
||||||
|
|
||||||
|
await caller.runAll();
|
||||||
|
|
||||||
|
assert.isFalse(failed);
|
||||||
|
for (let i = 1; i < 4; i++) {
|
||||||
|
const path = OS.Path.join(Zotero.getTempDirectory().path, `zotero-${i}.txt`);
|
||||||
|
const fileSize = (await OS.File.stat(path)).size;
|
||||||
|
assert.equal(fileSize, 1024 * 1024 * sizeInMB);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue