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