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