From 5ac126e01b7b9ab9de5d8568baa52ffcf1d31cff Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 10 Apr 2019 14:07:51 -0600 Subject: [PATCH] Add the ability to retry flaky tests to Jasmine 1.3 specs --- vendor/jasmine.js | 48 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/vendor/jasmine.js b/vendor/jasmine.js index ac443e1c8..2cec4bf76 100644 --- a/vendor/jasmine.js +++ b/vendor/jasmine.js @@ -2021,6 +2021,17 @@ jasmine.Queue = function(env) { this.abort = false; }; +jasmine.Queue.prototype.clone = function() { + var queue = new jasmine.Queue(this.env); + queue.ensured = this.ensured.slice(0) + queue.blocks = this.blocks.slice(0) + queue.running = this.running; + queue.index = this.index; + queue.offset = this.offset; + queue.abort = this.abort; + return queue; +} + jasmine.Queue.prototype.addBefore = function(block, ensure) { if (ensure === jasmine.undefined) { ensure = false; @@ -2269,7 +2280,11 @@ jasmine.Spec.prototype.addToQueue = function (block) { * @param {jasmine.ExpectationResult} result */ jasmine.Spec.prototype.addMatcherResult = function(result) { - this.results_.addResult(result); + if (this.retries > 0 && !result.passed_) { + this.retry(); + } else { + this.results_.addResult(result); + } }; jasmine.Spec.prototype.expect = function(actual) { @@ -2330,13 +2345,17 @@ jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessag return this; }; -jasmine.Spec.prototype.fail = function (e) { - var expectationResult = new jasmine.ExpectationResult({ - passed: false, - message: e ? jasmine.util.formatException(e) : 'Exception', - trace: { stack: e.stack } - }); - this.results_.addResult(expectationResult); +jasmine.Spec.prototype.fail = function (e, onComplete) { + if (this.retries > 0) { + this.retry() + } else { + var expectationResult = new jasmine.ExpectationResult({ + passed: false, + message: e ? jasmine.util.formatException(e) : 'Exception', + trace: { stack: e.stack } + }); + this.results_.addResult(expectationResult); + } }; jasmine.Spec.prototype.getMatchersClass_ = function() { @@ -2454,6 +2473,19 @@ jasmine.Spec.prototype.removeAllSpies = function() { this.spies_ = []; }; +jasmine.Spec.prototype.RETRY_FLAKY_TEST_AND_SLOW_DOWN_THE_BUILD = function() { + if (this.retries == null) { + this.retries = 5; + this.originalQueue = this.queue.clone(); + } +} + +jasmine.Spec.prototype.retry = function() { + this.retries--; + this.queue = this.originalQueue.clone(); + this.suite.queue.insertNext(this) +} + /** * Internal representation of a Jasmine suite. *