commit af8865f3f38cc19f6112ac0ed1c94f2e1299598f
parent c099bd432a71a2a688a120fc186cd8c6c4776707
Author: Dan Stillman <dstillman@zotero.org>
Date: Wed, 24 Feb 2016 01:02:30 -0500
Fix behavior of Zotero.Utilities.Internal.delayGenerator and add tests
Also convert to an ES6 generator
Diffstat:
3 files changed, 62 insertions(+), 10 deletions(-)
diff --git a/chrome/content/zotero/xpcom/sync/syncAPIClient.js b/chrome/content/zotero/xpcom/sync/syncAPIClient.js
@@ -587,7 +587,7 @@ Zotero.Sync.APIClient.prototype = {
this.failureDelayIntervals, 60 * 60 * 1000
);
}
- let keepGoing = yield failureDelayGenerator.next();
+ let keepGoing = yield failureDelayGenerator.next().value;
if (!keepGoing) {
Zotero.logError("Failed too many times");
throw lastError;
diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js
@@ -461,25 +461,23 @@ Zotero.Utilities.Internal = {
* promise will return false. Before maxTime has elapsed, or if
* maxTime isn't specified, the promises will yield true.
*/
- "delayGenerator": function (intervals, maxTime) {
+ "delayGenerator": function* (intervals, maxTime) {
var totalTime = 0;
- var lastInterval = intervals[intervals.length - 1];
+ var last = false;
while (true) {
let interval = intervals.shift();
if (interval) {
- delay = lastInterval = interval;
+ delay = interval;
}
- else if (infinite) {
- delay = lastInterval;
- }
- else {
- break;
+
+ if (maxTime && (totalTime + delay) > maxTime) {
+ yield Zotero.Promise.resolve(false);
}
totalTime += delay;
Zotero.debug("Delaying " + delay + " ms");
- yield Zotero.Promise.delay(delay).return(!maxTime || totalTime <= maxTime);
+ yield Zotero.Promise.delay(delay).return(true);
}
},
diff --git a/test/tests/utilities_internalTest.js b/test/tests/utilities_internalTest.js
@@ -10,4 +10,58 @@ describe("Zotero.Utilities.Internal", function () {
);
})
})
+
+
+ describe("#delayGenerator", function () {
+ var spy;
+
+ before(function () {
+ spy = sinon.spy(Zotero.Promise, "delay");
+ });
+
+ afterEach(function () {
+ spy.reset();
+ });
+
+ after(function () {
+ spy.restore();
+ });
+
+ it("should delay for given amounts of time without limit", function* () {
+ var intervals = [1, 2];
+ var gen = Zotero.Utilities.Internal.delayGenerator(intervals);
+
+ // When intervals are exhausted, keep using last interval
+ var testIntervals = intervals.slice();
+ testIntervals.push(intervals[intervals.length - 1]);
+
+ for (let i of testIntervals) {
+ let val = yield gen.next().value;
+ assert.isTrue(val);
+ assert.isTrue(spy.calledWith(i));
+ spy.reset();
+ }
+ });
+
+ it("should return false when maxTime is reached", function* () {
+ var intervals = [5, 10];
+ var gen = Zotero.Utilities.Internal.delayGenerator(intervals, 30);
+
+ // When intervals are exhausted, keep using last interval
+ var testIntervals = intervals.slice();
+ testIntervals.push(intervals[intervals.length - 1]);
+
+ for (let i of testIntervals) {
+ let val = yield gen.next().value;
+ assert.isTrue(val);
+ assert.isTrue(spy.calledWith(i));
+ spy.reset();
+ }
+
+ // Another interval would put us over maxTime, so return false immediately
+ let val = yield gen.next().value;
+ assert.isFalse(val);
+ assert.isFalse(spy.called);
+ });
+ })
})