fix unnecessarily long gl.utils.backOff test

This commit is contained in:
Mike Greiling 2017-08-18 01:05:04 -05:00
parent 5a332c5974
commit d4cb1ec9e9
2 changed files with 31 additions and 29 deletions

View File

@ -378,15 +378,15 @@
w.gl.utils.backOff = (fn, timeout = 60000) => { w.gl.utils.backOff = (fn, timeout = 60000) => {
const maxInterval = 32000; const maxInterval = 32000;
let nextInterval = 2000; let nextInterval = 2000;
let timeElapsed = 0;
const startTime = Date.now();
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const stop = arg => ((arg instanceof Error) ? reject(arg) : resolve(arg)); const stop = arg => ((arg instanceof Error) ? reject(arg) : resolve(arg));
const next = () => { const next = () => {
if (Date.now() - startTime < timeout) { if (timeElapsed < timeout) {
setTimeout(fn.bind(null, next, stop), nextInterval); setTimeout(() => fn(next, stop), nextInterval);
timeElapsed += nextInterval;
nextInterval = Math.min(nextInterval + nextInterval, maxInterval); nextInterval = Math.min(nextInterval + nextInterval, maxInterval);
} else { } else {
reject(new Error('BACKOFF_TIMEOUT')); reject(new Error('BACKOFF_TIMEOUT'));

View File

@ -266,6 +266,12 @@ import '~/lib/utils/common_utils';
}); });
describe('gl.utils.backOff', () => { describe('gl.utils.backOff', () => {
beforeEach(() => {
// shortcut our timeouts otherwise these tests will take a long time to finish
const origSetTimeout = window.setTimeout;
spyOn(window, 'setTimeout').and.callFake(cb => origSetTimeout(cb, 0));
});
it('solves the promise from the callback', (done) => { it('solves the promise from the callback', (done) => {
const expectedResponseValue = 'Success!'; const expectedResponseValue = 'Success!';
gl.utils.backOff((next, stop) => ( gl.utils.backOff((next, stop) => (
@ -299,37 +305,33 @@ import '~/lib/utils/common_utils';
let numberOfCalls = 1; let numberOfCalls = 1;
const expectedResponseValue = 'Success!'; const expectedResponseValue = 'Success!';
gl.utils.backOff((next, stop) => ( gl.utils.backOff((next, stop) => (
new Promise((resolve) => { Promise.resolve(expectedResponseValue)
resolve(expectedResponseValue); .then((resp) => {
}).then((resp) => { if (numberOfCalls < 3) {
if (numberOfCalls < 3) { numberOfCalls += 1;
numberOfCalls += 1; next();
next(); } else {
} else { stop(resp);
stop(resp); }
} })
})
)).then((respBackoff) => { )).then((respBackoff) => {
const timeouts = window.setTimeout.calls.allArgs().map(([, timeout]) => timeout);
expect(timeouts).toEqual([2000, 4000]);
expect(respBackoff).toBe(expectedResponseValue); expect(respBackoff).toBe(expectedResponseValue);
expect(numberOfCalls).toBe(3);
done(); done();
}); });
}, 10000); });
it('rejects the backOff promise after timing out', (done) => { it('rejects the backOff promise after timing out', (done) => {
const expectedResponseValue = 'Success!'; gl.utils.backOff(next => next(), 64000)
gl.utils.backOff(next => ( .catch((errBackoffResp) => {
new Promise((resolve) => { const timeouts = window.setTimeout.calls.allArgs().map(([, timeout]) => timeout);
resolve(expectedResponseValue); expect(timeouts).toEqual([2000, 4000, 8000, 16000, 32000, 32000]);
}).then(() => { expect(errBackoffResp instanceof Error).toBe(true);
setTimeout(next(), 5000); // it will time out expect(errBackoffResp.message).toBe('BACKOFF_TIMEOUT');
}) done();
), 3000).catch((errBackoffResp) => { });
expect(errBackoffResp instanceof Error).toBe(true); });
expect(errBackoffResp.message).toBe('BACKOFF_TIMEOUT');
done();
});
}, 10000);
}); });
describe('gl.utils.setFavicon', () => { describe('gl.utils.setFavicon', () => {