Skip to content

Commit 2f9f5cc

Browse files
Add skipping for stale tests
1 parent 4508ec3 commit 2f9f5cc

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

ruby/lib/minitest/queue.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,13 @@ def run
435435
with_timestamps do
436436
begin
437437
return build_error_result(@load_error) if @load_error
438-
Minitest.run_one_method(runnable, @method_name)
438+
439+
klass = runnable
440+
unless klass.method_defined?(@method_name) || klass.private_method_defined?(@method_name)
441+
return build_stale_skip_result
442+
end
443+
444+
Minitest.run_one_method(klass, @method_name)
439445
rescue StandardError, ScriptError => error
440446
build_error_result(error)
441447
end
@@ -506,6 +512,19 @@ def build_error_result(error)
506512
result
507513
end
508514

515+
def build_stale_skip_result
516+
$stderr.puts "[ci-queue] Skipping stale preresolved entry: #{@class_name}##{@method_name} " \
517+
"(method no longer exists in #{@file_path || 'unknown file'})"
518+
519+
result_class = defined?(Minitest::Result) ? Minitest::Result : Minitest::Test
520+
result = result_class.new(@method_name)
521+
result.klass = @class_name if result.respond_to?(:klass=)
522+
result.failures << Minitest::Skip.new(
523+
"[ci-queue] Stale preresolved entry: #{@class_name}##{@method_name} no longer exists"
524+
)
525+
result
526+
end
527+
509528
def current_timestamp
510529
CI::Queue.time_now.to_i
511530
end

ruby/test/minitest/queue/lazy_single_example_test.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,33 @@ def test_run_handles_script_error
5454
end
5555
end
5656

57+
def test_run_skips_stale_preresolved_entry
58+
Dir.mktmpdir do |dir|
59+
class_name = "StaleEntry#{Process.pid}#{rand(1000)}"
60+
file_path = File.join(dir, "stale_entry_test.rb")
61+
File.write(
62+
file_path,
63+
"class #{class_name} < Minitest::Test\n" \
64+
" def test_exists\n" \
65+
" assert true\n" \
66+
" end\n" \
67+
"end\n"
68+
)
69+
70+
loader = CI::Queue::FileLoader.new
71+
resolver = CI::Queue::ClassResolver
72+
example = LazySingleExample.new(class_name, 'test_no_longer_exists', file_path, loader: loader, resolver: resolver)
73+
74+
result = example.run
75+
76+
assert result.skipped?
77+
assert_match(/Stale preresolved entry/, result.failure.message)
78+
assert_match(/test_no_longer_exists/, result.failure.message)
79+
ensure
80+
Object.send(:remove_const, class_name) if Object.const_defined?(class_name)
81+
end
82+
end
83+
5784
def test_marshal_round_trip
5885
Dir.mktmpdir do |dir|
5986
class_name = "LazyMarshal#{Process.pid}#{rand(1000)}"

0 commit comments

Comments
 (0)