test-queue 0.10.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf82719e0483ccba7f40a8a66ffdd0d262bd2ff79cae203055e730988eed1219
4
- data.tar.gz: 584b68033ee5540cc1c2aaeeb1c391e04ff67b158e6c170975151397ea287c66
3
+ metadata.gz: 63e449555d271631ef49690393447ae267535a8c8506874ae3217d1992c51e47
4
+ data.tar.gz: 4f434b3bb3a7ca9040836751a0f1c08e198552aeda35956adb9353450b8b01dd
5
5
  SHA512:
6
- metadata.gz: 041b553cf8d565683e9bf304e043ca0e44346a14243969834d4dc5e3d98f8ada5c96ada0e42ad0da4d4ccc488322013b632b6f2cde4633908d7b526915c7af74
7
- data.tar.gz: ac21ecddc2d3236e5b7de2bc0d138ac791d420efea33a43286294169fba4082329de1540c614153273cc0783e8897b9700bd24469fbad660168c22ec86c9ae65
6
+ metadata.gz: 65cb68eb9661a6c6cfe813a41aed60f07962d7ba7b30a2b5ee178cc6c10fce481cfbb82ed83c7e9741dae71dc5d5be954b57f8fe1997c182497e332b5e342102
7
+ data.tar.gz: 7ab7dc0e7b758966cec5cb900e7e27d6538aee8639838401bedd781ae5457051085fa587d96c30d8c2e1b0c2a4a005f42af70533fe4464fb8e1956e4f8002271
@@ -4,57 +4,65 @@ require_relative '../runner'
4
4
 
5
5
  gem 'test-unit'
6
6
  require 'test/unit'
7
- require 'test/unit/collector/descendant'
8
- require 'test/unit/testresult'
9
- require 'test/unit/testsuite'
7
+ require 'test/unit/collector/load'
10
8
  require 'test/unit/ui/console/testrunner'
11
9
 
12
- class Test::Unit::TestSuite
13
- attr_accessor :iterator
14
-
15
- def run(result, &progress_block)
16
- @start_time = Time.now
17
- yield(STARTED, name)
18
- yield(STARTED_OBJECT, self)
19
- run_startup(result)
20
- (@iterator || @tests).each do |test|
21
- @n_tests += test.size
22
- run_test(test, result, &progress_block)
23
- @passed = false unless test.passed?
24
- end
25
- run_shutdown(result)
26
- ensure
27
- @elapsed_time = Time.now - @start_time
28
- yield(FINISHED, name)
29
- yield(FINISHED_OBJECT, self)
30
- end
31
-
32
- def failure_count
33
- (@iterator || @tests).sum { |t| t.instance_variable_get(:@_result).failure_count }
34
- end
35
- end
36
-
37
10
  module TestQueue
38
11
  class Runner
39
12
  class TestUnit < Runner
40
- def initialize
41
- if Test::Unit::Collector::Descendant.new.collect.tests.any?
42
- raise 'Do not `require` test files. Pass them via ARGV instead and they will be required as needed.'
13
+ class TestSuite < ::Test::Unit::TestSuite
14
+ def initialize(name, iterator)
15
+ super(name)
16
+ @tests = IteratorWrapper.new(iterator)
17
+ end
18
+
19
+ def run(*)
20
+ @started = true
21
+ super
22
+ end
23
+
24
+ def size
25
+ return 0 unless @started
26
+
27
+ super
28
+ end
29
+ end
30
+
31
+ class IteratorWrapper
32
+ def initialize(iterator)
33
+ @generator = Fiber.new do
34
+ iterator.each do |test|
35
+ Fiber.yield(test)
36
+ end
37
+ end
38
+ end
39
+
40
+ def shift
41
+ @generator.resume
42
+ rescue FiberError
43
+ nil
43
44
  end
44
45
 
46
+ def each
47
+ while (test = shift)
48
+ yield(test)
49
+ end
50
+ end
51
+ end
52
+
53
+ def initialize
45
54
  super(TestFramework::TestUnit.new)
46
55
  end
47
56
 
48
57
  def run_worker(iterator)
49
- @suite = Test::Unit::TestSuite.new('specified by test-queue master')
50
- @suite.iterator = iterator
58
+ @suite = TestSuite.new('specified by test-queue master', iterator)
51
59
  res = Test::Unit::UI::Console::TestRunner.new(@suite).start
52
60
  res.run_count - res.pass_count
53
61
  end
54
62
 
55
63
  def summarize_worker(worker)
56
64
  worker.summary = worker.output.split("\n").grep(/^\d+ tests?/).first
57
- worker.failure_output = worker.output.scan(/^Failure:\n(.*)\n=======================*/m).join("\n")
65
+ worker.failure_output = worker.output.scan(/^Failure:[^\n]*\n(.*?)\n=======================*/m).join("\n")
58
66
  end
59
67
  end
60
68
  end
@@ -66,11 +74,39 @@ module TestQueue
66
74
  end
67
75
 
68
76
  def suites_from_file(path)
69
- Test::Unit::TestCase::DESCENDANTS.clear
70
- require File.absolute_path(path)
71
- Test::Unit::Collector::Descendant.new.collect.tests.map { |suite|
72
- [suite.name, suite]
73
- }
77
+ test_suite = Test::Unit::Collector::Load.new.collect(path)
78
+ return [] unless test_suite
79
+ return test_suite.tests.map { [_1.name, _1] } unless split_groups?
80
+
81
+ split_groups(test_suite)
82
+ end
83
+
84
+ def split_groups?
85
+ return @split_groups if defined?(@split_groups)
86
+
87
+ @split_groups = ENV['TEST_QUEUE_SPLIT_GROUPS'] && ENV['TEST_QUEUE_SPLIT_GROUPS'].strip.downcase == 'true'
88
+ end
89
+
90
+ def split_groups(test_suite, groups = [])
91
+ unless splittable?(test_suite)
92
+ groups << [test_suite.name, test_suite]
93
+ return groups
94
+ end
95
+
96
+ test_suite.tests.each do |suite|
97
+ if suite.is_a?(Test::Unit::TestSuite)
98
+ split_groups(suite, groups)
99
+ else
100
+ groups << [suite.name, suite]
101
+ end
102
+ end
103
+ groups
104
+ end
105
+
106
+ def splittable?(test_suite)
107
+ test_suite.tests.none? do |test|
108
+ test.is_a?(Test::Unit::TestCase) && test[:no_split]
109
+ end
74
110
  end
75
111
  end
76
112
  end
@@ -282,7 +282,7 @@ module TestQueue
282
282
  @concurrency.times do |i|
283
283
  num = i + 1
284
284
 
285
- pid = fork do
285
+ pid = Process.fork do
286
286
  @server&.close
287
287
 
288
288
  iterator = Iterator.new(@test_framework, relay? ? @relay : @socket, method(:around_filter), early_failure_limit: @early_failure_limit, run_token: @run_token)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TestQueue
4
- VERSION = '0.10.0'
4
+ VERSION = '0.11.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aman Gupta
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-06-26 00:00:00.000000000 Z
11
+ date: 2023-12-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: minitest/rspec parallel test runner for CI environments
14
14
  email: ruby@tmm1.net
@@ -61,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  requirements: []
64
- rubygems_version: 3.4.10
64
+ rubygems_version: 3.4.19
65
65
  signing_key:
66
66
  specification_version: 4
67
67
  summary: parallel test runner