minitest-fork_executor 1.0.0 → 1.0.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.
@@ -1,23 +1,25 @@
1
1
  module Minitest
2
2
  class ForkExecutor
3
+ # Minitest runs individual test cases via Minitest.run_one_method. When
4
+ # ForkExecutor is started, we need to override it and implement the fork
5
+ # algorithm. See the detailed comments below to understand how it's done.
6
+ #
7
+ # Please keep in mind we support Ruby 1.9 and hence can't use conveniences
8
+ # offered by more modern Rubies.
3
9
  def start
4
- # Minitest runs test cases via Minitest.run_one_method. Each test case
5
- # in a test class is run separately. We need to override that method and
6
- # fork there. run_one_method is a method on the Minitest module so we need
7
- # to *prepend* our version so that it's called first.
8
- metaclass = (class << Minitest; self; end)
9
- metaclass.prepend ClassMethods
10
- end
10
+ # Store the reference to the original run_one_method singleton method.
11
+ original_run_one_method = Minitest.method(:run_one_method)
11
12
 
12
- def shutdown
13
- # Nothing to do here but required by Minitest.
14
- end
13
+ # Remove the original singleton method from Minitest in order to avoid
14
+ # method redefinition warnings when patching it in the next step.
15
+ class << Minitest
16
+ remove_method(:run_one_method)
17
+ end
15
18
 
16
- module ClassMethods
17
- # The updated version of Minitest.run_one_method that forks before
18
- # actually running a test case, makes the child run it and send the result
19
- # to the parent process.
20
- def run_one_method klass, method_name
19
+ # Define a new version of run_one_method that forks, calls the original
20
+ # run_one_method in the child process, and sends results back to the
21
+ # parent.
22
+ Minitest.define_singleton_method(:run_one_method) do |klass, method_name|
21
23
  read_io, write_io = IO.pipe
22
24
  read_io.binmode
23
25
  write_io.binmode
@@ -33,7 +35,7 @@ module Minitest
33
35
  else
34
36
  # Child: just run normally, dump the result, and exit the process to
35
37
  # avoid double-reporting.
36
- result = super
38
+ result = original_run_one_method.call(klass, method_name)
37
39
 
38
40
  read_io.close
39
41
  Marshal.dump(result, write_io)
@@ -44,5 +46,10 @@ module Minitest
44
46
  result
45
47
  end
46
48
  end
49
+
50
+ def shutdown
51
+ # Nothing to do here but required by Minitest. In a future version, we may
52
+ # reinstate the original Minitest.run_one_method here.
53
+ end
47
54
  end
48
55
  end
@@ -15,7 +15,7 @@ Minitest.parallel_executor = Minitest::ForkExecutor.new
15
15
  # 2. These processes are different from the parent process that spawned the
16
16
  # test suite - hence recording @@parent_pid at the top.
17
17
  class ForkTest < Minitest::Test
18
- @@log = Tempfile.new
18
+ @@log = Tempfile.new('pid')
19
19
  @@parent_pid = Process.pid
20
20
 
21
21
  def test_run_in_process_one
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-fork_executor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Greg Navis
@@ -13,31 +14,35 @@ dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: minitest
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - ">="
19
+ - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: '0'
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - ">="
27
+ - - ! '>='
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0'
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: rake
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - ">="
35
+ - - '='
32
36
  - !ruby/object:Gem::Version
33
- version: '0'
37
+ version: 12.2.1
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - ">="
43
+ - - '='
39
44
  - !ruby/object:Gem::Version
40
- version: '0'
45
+ version: 12.2.1
41
46
  description: Run each test_* method in a separate process thus eliminating test case
42
47
  interference.
43
48
  email: contact@gregnavis.com
@@ -50,25 +55,33 @@ files:
50
55
  homepage: https://github.com/gregnavis/minitest-fork_executor
51
56
  licenses:
52
57
  - MIT
53
- metadata: {}
54
58
  post_install_message:
55
59
  rdoc_options: []
56
60
  require_paths:
57
61
  - lib
58
62
  required_ruby_version: !ruby/object:Gem::Requirement
63
+ none: false
59
64
  requirements:
60
- - - ">="
65
+ - - ! '>='
61
66
  - !ruby/object:Gem::Version
62
67
  version: '0'
68
+ segments:
69
+ - 0
70
+ hash: -1027518140381874469
63
71
  required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
64
73
  requirements:
65
- - - ">="
74
+ - - ! '>='
66
75
  - !ruby/object:Gem::Version
67
76
  version: '0'
77
+ segments:
78
+ - 0
79
+ hash: -1027518140381874469
68
80
  requirements: []
69
- rubygems_version: 3.0.1
81
+ rubyforge_project:
82
+ rubygems_version: 1.8.23.2
70
83
  signing_key:
71
- specification_version: 4
84
+ specification_version: 3
72
85
  summary: Near-perfect process-level test case isolation.
73
86
  test_files:
74
87
  - test/minitest/fork_executor_test.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA256:
3
- metadata.gz: b399f50e3a52b2505c2125113c05ab712b1db59d26f00dd1075d7be2346c979b
4
- data.tar.gz: a3394aab364af126482879b30badfd400ab2168185b1e746305555c42ef84ff2
5
- SHA512:
6
- metadata.gz: b6014495cb3f12a88165cb983533be9a9b2f4e3188cbb67fa2e355577de3af285fc0ea6bf575e82e194d2526bedfa25ef979482be9377d96e1ca67082994a211
7
- data.tar.gz: d887d4b98c08f8c7ba5e5c41687b88875ea431c9dd4ea0fbf5cb546947a524c6326ea5212519c98dcf3c91bceb417cc8feaeb04c1ef6e00cf6face124e8fef62