123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- 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();
- })();
|