You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
6.3 KiB
258 lines
6.3 KiB
var common = require('../common'); |
|
var assert = common.assert; |
|
var fake = common.fake.create(); |
|
var retry = require(common.dir.lib + '/retry'); |
|
|
|
(function testReset() { |
|
var error = new Error('some error'); |
|
var operation = retry.operation([1, 2, 3]); |
|
var attempts = 0; |
|
|
|
var finalCallback = fake.callback('finalCallback'); |
|
fake.expectAnytime(finalCallback); |
|
|
|
var expectedFinishes = 1; |
|
var finishes = 0; |
|
|
|
var fn = function() { |
|
operation.attempt(function(currentAttempt) { |
|
attempts++; |
|
assert.equal(currentAttempt, attempts); |
|
if (operation.retry(error)) { |
|
return; |
|
} |
|
|
|
finishes++ |
|
assert.equal(expectedFinishes, finishes); |
|
assert.strictEqual(attempts, 4); |
|
assert.strictEqual(operation.attempts(), attempts); |
|
assert.strictEqual(operation.mainError(), error); |
|
|
|
if (finishes < 2) { |
|
attempts = 0; |
|
expectedFinishes++; |
|
operation.reset(); |
|
fn() |
|
} else { |
|
finalCallback(); |
|
} |
|
}); |
|
}; |
|
|
|
fn(); |
|
})(); |
|
|
|
(function testErrors() { |
|
var operation = retry.operation(); |
|
|
|
var error = new Error('some error'); |
|
var error2 = new Error('some other error'); |
|
operation._errors.push(error); |
|
operation._errors.push(error2); |
|
|
|
assert.deepEqual(operation.errors(), [error, error2]); |
|
})(); |
|
|
|
(function testMainErrorReturnsMostFrequentError() { |
|
var operation = retry.operation(); |
|
var error = new Error('some error'); |
|
var error2 = new Error('some other error'); |
|
|
|
operation._errors.push(error); |
|
operation._errors.push(error2); |
|
operation._errors.push(error); |
|
|
|
assert.strictEqual(operation.mainError(), error); |
|
})(); |
|
|
|
(function testMainErrorReturnsLastErrorOnEqualCount() { |
|
var operation = retry.operation(); |
|
var error = new Error('some error'); |
|
var error2 = new Error('some other error'); |
|
|
|
operation._errors.push(error); |
|
operation._errors.push(error2); |
|
|
|
assert.strictEqual(operation.mainError(), error2); |
|
})(); |
|
|
|
(function testAttempt() { |
|
var operation = retry.operation(); |
|
var fn = new Function(); |
|
|
|
var timeoutOpts = { |
|
timeout: 1, |
|
cb: function() {} |
|
}; |
|
operation.attempt(fn, timeoutOpts); |
|
|
|
assert.strictEqual(fn, operation._fn); |
|
assert.strictEqual(timeoutOpts.timeout, operation._operationTimeout); |
|
assert.strictEqual(timeoutOpts.cb, operation._operationTimeoutCb); |
|
})(); |
|
|
|
(function testRetry() { |
|
var error = new Error('some error'); |
|
var operation = retry.operation([1, 2, 3]); |
|
var attempts = 0; |
|
|
|
var finalCallback = fake.callback('finalCallback'); |
|
fake.expectAnytime(finalCallback); |
|
|
|
var fn = function() { |
|
operation.attempt(function(currentAttempt) { |
|
attempts++; |
|
assert.equal(currentAttempt, attempts); |
|
if (operation.retry(error)) { |
|
return; |
|
} |
|
|
|
assert.strictEqual(attempts, 4); |
|
assert.strictEqual(operation.attempts(), attempts); |
|
assert.strictEqual(operation.mainError(), error); |
|
finalCallback(); |
|
}); |
|
}; |
|
|
|
fn(); |
|
})(); |
|
|
|
(function testRetryForever() { |
|
var error = new Error('some error'); |
|
var operation = retry.operation({ retries: 3, forever: true }); |
|
var attempts = 0; |
|
|
|
var finalCallback = fake.callback('finalCallback'); |
|
fake.expectAnytime(finalCallback); |
|
|
|
var fn = function() { |
|
operation.attempt(function(currentAttempt) { |
|
attempts++; |
|
assert.equal(currentAttempt, attempts); |
|
if (attempts !== 6 && operation.retry(error)) { |
|
return; |
|
} |
|
|
|
assert.strictEqual(attempts, 6); |
|
assert.strictEqual(operation.attempts(), attempts); |
|
assert.strictEqual(operation.mainError(), error); |
|
finalCallback(); |
|
}); |
|
}; |
|
|
|
fn(); |
|
})(); |
|
|
|
(function testRetryForeverNoRetries() { |
|
var error = new Error('some error'); |
|
var delay = 50 |
|
var operation = retry.operation({ |
|
retries: null, |
|
forever: true, |
|
minTimeout: delay, |
|
maxTimeout: delay |
|
}); |
|
|
|
var attempts = 0; |
|
var startTime = new Date().getTime(); |
|
|
|
var finalCallback = fake.callback('finalCallback'); |
|
fake.expectAnytime(finalCallback); |
|
|
|
var fn = function() { |
|
operation.attempt(function(currentAttempt) { |
|
attempts++; |
|
assert.equal(currentAttempt, attempts); |
|
if (attempts !== 4 && operation.retry(error)) { |
|
return; |
|
} |
|
|
|
var endTime = new Date().getTime(); |
|
var minTime = startTime + (delay * 3); |
|
var maxTime = minTime + 20 // add a little headroom for code execution time |
|
assert(endTime >= minTime) |
|
assert(endTime < maxTime) |
|
assert.strictEqual(attempts, 4); |
|
assert.strictEqual(operation.attempts(), attempts); |
|
assert.strictEqual(operation.mainError(), error); |
|
finalCallback(); |
|
}); |
|
}; |
|
|
|
fn(); |
|
})(); |
|
|
|
(function testStop() { |
|
var error = new Error('some error'); |
|
var operation = retry.operation([1, 2, 3]); |
|
var attempts = 0; |
|
|
|
var finalCallback = fake.callback('finalCallback'); |
|
fake.expectAnytime(finalCallback); |
|
|
|
var fn = function() { |
|
operation.attempt(function(currentAttempt) { |
|
attempts++; |
|
assert.equal(currentAttempt, attempts); |
|
|
|
if (attempts === 2) { |
|
operation.stop(); |
|
|
|
assert.strictEqual(attempts, 2); |
|
assert.strictEqual(operation.attempts(), attempts); |
|
assert.strictEqual(operation.mainError(), error); |
|
finalCallback(); |
|
} |
|
|
|
if (operation.retry(error)) { |
|
return; |
|
} |
|
}); |
|
}; |
|
|
|
fn(); |
|
})(); |
|
|
|
(function testMaxRetryTime() { |
|
var error = new Error('some error'); |
|
var maxRetryTime = 30; |
|
var operation = retry.operation({ |
|
minTimeout: 1, |
|
maxRetryTime: maxRetryTime |
|
}); |
|
var attempts = 0; |
|
|
|
var finalCallback = fake.callback('finalCallback'); |
|
fake.expectAnytime(finalCallback); |
|
|
|
var longAsyncFunction = function (wait, callback){ |
|
setTimeout(callback, wait); |
|
}; |
|
|
|
var fn = function() { |
|
var startTime = new Date().getTime(); |
|
operation.attempt(function(currentAttempt) { |
|
attempts++; |
|
assert.equal(currentAttempt, attempts); |
|
|
|
if (attempts !== 2) { |
|
if (operation.retry(error)) { |
|
return; |
|
} |
|
} else { |
|
var curTime = new Date().getTime(); |
|
longAsyncFunction(maxRetryTime - (curTime - startTime - 1), function(){ |
|
if (operation.retry(error)) { |
|
assert.fail('timeout should be occurred'); |
|
return; |
|
} |
|
|
|
assert.strictEqual(operation.mainError(), error); |
|
finalCallback(); |
|
}); |
|
} |
|
}); |
|
}; |
|
|
|
fn(); |
|
})();
|
|
|