Skip to content

Commit ce9a704

Browse files
Zenspider zenspider/minitest cleanup (#3604)
* Clean up minitest usage: use a subclass of Minitest::Test, hook run_one_method not run, etc This changes the test class in every file, so it looks ugly, but it should make things cleaner in the long run. test_helper.rb could use some more cleanup. It is still including into Minitest::Test when it could just PUT everything in TimeoutTestCase now. * Mark the one as allowed --------- Co-authored-by: Ryan Davis <ryand-ruby@zenspider.com>
1 parent 9058575 commit ce9a704

38 files changed

+87
-109
lines changed

.github/workflows/tests.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ jobs:
3030
PUMA_TEST_DEBUG: true
3131
TESTOPTS: -v
3232
PUMA_NO_RUBOCOP: true
33-
TERM: BugMinitest
3433

3534
runs-on: ${{ matrix.os }}
3635
if: |
@@ -142,7 +141,6 @@ jobs:
142141
PUMA_TEST_DEBUG: true
143142
TESTOPTS: -v
144143
PUMA_NO_RUBOCOP: true
145-
TERM: BugMinitest
146144

147145
runs-on: ${{ matrix.os }}
148146
if: |

.rubocop.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require:
22
- rubocop-performance
3+
- ./cops/tests_must_timeout.rb
34

45
AllCops:
56
DisabledByDefault: true
@@ -82,3 +83,6 @@ Style/TrailingCommaInArguments:
8283

8384
Style/WhileUntilModifier:
8485
Enabled: true
86+
87+
Puma/TestsMustTimeout:
88+
Enabled: true

cops/tests_must_timeout.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
require 'rubocop'
2+
3+
module RuboCop
4+
module Cop
5+
module Puma
6+
class TestsMustTimeout < Base
7+
extend AutoCorrector
8+
9+
MSG = 'Inherit from TimeoutTestCase instead of Minitest::Test'
10+
11+
def_node_matcher :inherits_from_minitest_test?, <<~PATTERN
12+
(class _ (const (const nil? :Minitest) :Test) ...)
13+
PATTERN
14+
15+
def on_class(node)
16+
return unless inherits_from_minitest_test?(node)
17+
18+
add_offense(node.children[1]) do |corrector|
19+
corrector.replace(node.children[1], 'TimeoutTestCase')
20+
end
21+
end
22+
end
23+
end
24+
end
25+
end

test/helper.rb

Lines changed: 10 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -87,68 +87,23 @@ def self.call(host = '127.0.0.1')
8787

8888
require "timeout"
8989

90-
if Minitest::VERSION < '5.25'
91-
module TimeoutEveryTestCase
92-
# our own subclass so we never confuse different timeouts
93-
class TestTookTooLong < Timeout::Error
94-
end
95-
96-
def run
97-
with_info_handler do
98-
time_it do
99-
capture_exceptions do
100-
::Timeout.timeout($test_case_timeout, TestTookTooLong) do
101-
before_setup; setup; after_setup
102-
self.send self.name
103-
end
104-
end
105-
106-
capture_exceptions do
107-
::Timeout.timeout($test_case_timeout, TestTookTooLong) do
108-
Minitest::Test::TEARDOWN_METHODS.each { |hook| self.send hook }
109-
end
110-
end
111-
if respond_to? :clean_tmp_paths
112-
clean_tmp_paths
113-
end
114-
end
115-
end
90+
class TimeoutTestCase < Minitest::Test # rubocop:disable Puma/TestsMustTimeout
91+
# our own subclass so we never confuse different timeouts
92+
class TestTookTooLong < Timeout::Error
93+
end
11694

117-
Minitest::Result.from self # per contract
95+
def self.run_one_method(klass, method_name, reporter)
96+
::Timeout.timeout($test_case_timeout, TestTookTooLong) do
97+
super
11898
end
11999
end
120-
else
121-
module TimeoutEveryTestCase
122-
# our own subclass so we never confuse different timeouts
123-
class TestTookTooLong < Timeout::Error
124-
end
125-
126-
def run
127-
time_it do
128-
capture_exceptions do
129-
::Timeout.timeout($test_case_timeout, TestTookTooLong) do
130-
Minitest::Test::SETUP_METHODS.each { |hook| self.send hook }
131-
self.send self.name
132-
end
133-
end
134100

135-
capture_exceptions do
136-
::Timeout.timeout($test_case_timeout, TestTookTooLong) do
137-
Minitest::Test::TEARDOWN_METHODS.each { |hook| self.send hook }
138-
end
139-
end
140-
if respond_to? :clean_tmp_paths
141-
clean_tmp_paths
142-
end
143-
end
144-
145-
Minitest::Result.from self # per contract
146-
end
101+
def teardown
102+
super
103+
clean_tmp_paths if respond_to? :clean_tmp_paths
147104
end
148105
end
149106

150-
Minitest::Test.prepend TimeoutEveryTestCase
151-
152107
if ENV['CI']
153108
require 'minitest/retry'
154109

test/helpers/integration.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
# Only single mode tests go here. Cluster and pumactl tests
99
# have their own files, use those instead
10-
class TestIntegration < Minitest::Test
10+
class TestIntegration < TimeoutTestCase
1111
include TmpPath
1212
HOST = "127.0.0.1"
1313
TOKEN = "xxyyzz"

test/test_app_status.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
require "puma/app/status"
66
require "rack"
77

8-
class TestAppStatus < Minitest::Test
9-
8+
class TestAppStatus < TimeoutTestCase
109
class FakeServer
1110
def initialize
1211
@status = :running

test/test_binder.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
require "puma/events"
99
require "puma/configuration"
1010

11-
class TestBinderBase < Minitest::Test
11+
class TestBinderBase < TimeoutTestCase
1212
include SSLHelper if ::Puma::HAS_SSL
1313
include TmpPath
1414

test/test_bundle_pruner.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
require 'puma/events'
44

5-
class TestBundlePruner < Minitest::Test
5+
class TestBundlePruner < TimeoutTestCase
66

77
PUMA_VERS = "puma-#{Puma::Const::PUMA_VERSION}"
88

test/test_busy_worker.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
require_relative "helper"
22
require_relative "helpers/test_puma/puma_socket"
33

4-
class TestBusyWorker < Minitest::Test
5-
4+
class TestBusyWorker < TimeoutTestCase
65
include ::TestPuma::PumaSocket
76

87
def setup

test/test_cli.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
require "json"
88
require "psych"
99

10-
class TestCLI < Minitest::Test
10+
class TestCLI < TimeoutTestCase
1111
include SSLHelper if ::Puma::HAS_SSL
1212
include TmpPath
1313
include TestPuma::PumaSocket

0 commit comments

Comments
 (0)