lib/minitest/queue.rb in ci-queue-0.11.1 vs lib/minitest/queue.rb in ci-queue-0.12.0
- old
+ new
@@ -5,12 +5,13 @@
require 'minitest/queue/failure_formatter'
require 'minitest/queue/error_report'
require 'minitest/queue/local_requeue_reporter'
require 'minitest/queue/build_status_recorder'
require 'minitest/queue/build_status_reporter'
+require 'minitest/queue/order_reporter'
+require 'minitest/queue/junit_reporter'
-
module Minitest
class Requeue < Skip
attr_reader :failure
def initialize(failure)
@@ -33,10 +34,35 @@
def message
failure.message
end
end
+ class Flaked < Skip
+ attr_reader :failure
+
+ def initialize(failure)
+ super()
+ @failure = failure
+ end
+
+ def result_label
+ "Skipped"
+ end
+
+ def backtrace
+ failure.backtrace
+ end
+
+ def error
+ failure.error
+ end
+
+ def message
+ failure.message
+ end
+ end
+
module Requeueing
# Make requeues acts as skips for reporters not aware of the difference.
def skipped?
super || requeued?
end
@@ -48,10 +74,29 @@
def requeue!
self.failures.unshift(Requeue.new(self.failures.shift))
end
end
+ module Flakiness
+ # Make failed flaky tests acts as skips for reporters not aware of the difference.
+ def skipped?
+ super || flaked?
+ end
+
+ def flaked?
+ !!((Flaked === failure) || @flaky)
+ end
+
+ def mark_as_flaked!
+ if passed?
+ @flaky = true
+ else
+ self.failures.unshift(Flaked.new(self.failures.shift))
+ end
+ end
+ end
+
module Queue
class SingleExample
def initialize(runnable, method_name)
@runnable = runnable
@method_name = method_name
@@ -66,10 +111,14 @@
end
def run
Minitest.run_one_method(@runnable, @method_name)
end
+
+ def flaky?
+ Minitest.queue.flaky?(self)
+ end
end
attr_reader :queue
def queue=(queue)
@@ -101,10 +150,16 @@
def run_from_queue(reporter, *)
queue.poll do |example|
result = example.run
failed = !(result.passed? || result.skipped?)
+
+ if example.flaky?
+ result.mark_as_flaked!
+ failed = false
+ end
+
if failed && queue.requeue(example)
result.requeue!
reporter.record(result)
elsif queue.acknowledge(example) || !failed
# If the test was already acknowledged by another worker (we timed out)
@@ -117,9 +172,21 @@
end
MiniTest.singleton_class.prepend(MiniTest::Queue)
if defined? MiniTest::Result
MiniTest::Result.prepend(MiniTest::Requeueing)
+ MiniTest::Result.prepend(MiniTest::Flakiness)
else
MiniTest::Test.prepend(MiniTest::Requeueing)
- MiniTest::Test.send(:alias_method, :klass, :class)
+ MiniTest::Test.prepend(MiniTest::Flakiness)
+
+ module MinitestBackwardCompatibility
+ def source_location
+ method(name).source_location
+ end
+
+ def klass
+ self.class.name
+ end
+ end
+ MiniTest::Test.prepend(MinitestBackwardCompatibility)
end