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