minitest-parallel_fork 1.1.2 → 1.2.0
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 +4 -4
- data/CHANGELOG +6 -0
- data/README.rdoc +9 -0
- data/lib/minitest/parallel_fork.rb +26 -6
- data/spec/minitest_parallel_fork_example.rb +10 -2
- data/spec/minitest_parallel_fork_spec.rb +14 -1
- metadata +17 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c152ef9216b8cbc9700f7f7e0281847695b325e660b51268b0d148a44e5aba2
|
4
|
+
data.tar.gz: 9d0739abeb8ccfaeb0ed023cb75b4fe30bb3f6e509af6d952204042229356649
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e075bac95ab8dd13987e59533ace22ff48d878db63399659764f7af6c553cf835282b39044b50592ec776ab5ebc2d1af095bc9d8df955c0b230cce3cfe58a2e3
|
7
|
+
data.tar.gz: 57448ca69342f474102377fb287c67d298db98147bef22450d721cdae0acc4e9f65aad7d3e3937fc834118fd10e6200ced55d04609bc7ac43527dc1d6b63f5c7
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 1.2.0 (2021-08-16)
|
2
|
+
|
3
|
+
* Work correctly with Minitest 5.14+ (jeremyevans)
|
4
|
+
|
5
|
+
* Add on_parallel_fork_marshal_failure hook for handling marshal failures (child process exiting) (jeremyevans)
|
6
|
+
|
1
7
|
=== 1.1.2 (2018-07-05)
|
2
8
|
|
3
9
|
* Handle raised exceptions containing unmarshallable data (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -59,6 +59,15 @@ disconnected, and after forking, the database name is changed in each child to r
|
|
59
59
|
a child-specific database, so that the child processes do not share a database and are
|
60
60
|
thus independent.
|
61
61
|
|
62
|
+
There is also a hook for debugging. +on_parallel_fork_marshal_failure+ is called if
|
63
|
+
there is an error unmarshalling data sent from the child process to the parent process.
|
64
|
+
This can happen if one of the child processes exits unexpected during the test, before
|
65
|
+
it reports results.
|
66
|
+
|
67
|
+
Minitest.on_parallel_fork_marshal_failure do
|
68
|
+
# Gather relevant logs for more debugging
|
69
|
+
end
|
70
|
+
|
62
71
|
== ActiveRecord
|
63
72
|
|
64
73
|
To use this with Rails/ActiveRecord, you probably want to use hooks similar to:
|
@@ -6,11 +6,19 @@ module Minitest
|
|
6
6
|
def self.before_parallel_fork(&block)
|
7
7
|
@before_parallel_fork = block
|
8
8
|
end
|
9
|
+
@before_parallel_fork = nil
|
9
10
|
|
10
11
|
# Set the after_parallel_fork block to the given block
|
11
12
|
def self.after_parallel_fork(i=nil, &block)
|
12
13
|
@after_parallel_fork = block
|
13
14
|
end
|
15
|
+
@after_parallel_fork = nil
|
16
|
+
|
17
|
+
# Set the on_parallel_fork_marshal_failure block to the given block
|
18
|
+
def self.on_parallel_fork_marshal_failure(&block)
|
19
|
+
@on_parallel_fork_marshal_failure = block
|
20
|
+
end
|
21
|
+
@on_parallel_fork_marshal_failure = nil
|
14
22
|
|
15
23
|
module Unparallelize
|
16
24
|
define_method(:run_one_method, &Minitest::Test.method(:run_one_method))
|
@@ -28,7 +36,7 @@ module Minitest
|
|
28
36
|
|
29
37
|
n = (ENV['NCPU'] || 4).to_i
|
30
38
|
reads = []
|
31
|
-
if
|
39
|
+
if @before_parallel_fork
|
32
40
|
@before_parallel_fork.call
|
33
41
|
end
|
34
42
|
n.times do |i|
|
@@ -36,7 +44,7 @@ module Minitest
|
|
36
44
|
reads << read
|
37
45
|
fork do
|
38
46
|
read.close
|
39
|
-
if
|
47
|
+
if @after_parallel_fork
|
40
48
|
@after_parallel_fork.call(i)
|
41
49
|
end
|
42
50
|
|
@@ -60,12 +68,17 @@ module Minitest
|
|
60
68
|
data[-1].each do |result|
|
61
69
|
result.failures.each do |failure|
|
62
70
|
if failure.is_a?(Minitest::UnexpectedError)
|
63
|
-
e = failure.exception
|
71
|
+
e = failure.respond_to?(:error) ? failure.error : failure.exception
|
64
72
|
begin
|
65
73
|
Marshal.dump(e)
|
66
74
|
rescue TypeError
|
67
|
-
|
68
|
-
|
75
|
+
e2 = RuntimeError.new("Wrapped undumpable exception for: #{e.class}: #{e.message}")
|
76
|
+
e2.set_backtrace(e.backtrace)
|
77
|
+
if failure.respond_to?(:error=)
|
78
|
+
failure.error = e2
|
79
|
+
else
|
80
|
+
failure.exception = e2
|
81
|
+
end
|
69
82
|
end
|
70
83
|
end
|
71
84
|
end
|
@@ -78,7 +91,14 @@ module Minitest
|
|
78
91
|
end
|
79
92
|
|
80
93
|
reads.map{|read| Thread.new(read, &:read)}.map(&:value).each do |data|
|
81
|
-
|
94
|
+
begin
|
95
|
+
count, assertions, results = Marshal.load(data)
|
96
|
+
rescue ArgumentError
|
97
|
+
if @on_parallel_fork_marshal_failure
|
98
|
+
@on_parallel_fork_marshal_failure.call
|
99
|
+
end
|
100
|
+
raise
|
101
|
+
end
|
82
102
|
stat_reporter.count += count
|
83
103
|
stat_reporter.assertions += assertions
|
84
104
|
stat_reporter.results.concat(results)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
gem 'minitest'
|
2
|
-
require 'minitest/autorun'
|
2
|
+
require 'minitest/global_expectations/autorun'
|
3
3
|
require 'minitest/parallel_fork'
|
4
4
|
|
5
5
|
a = nil
|
@@ -12,6 +12,12 @@ Minitest.after_parallel_fork do |i|
|
|
12
12
|
print ":child#{i}#{a}"
|
13
13
|
end
|
14
14
|
|
15
|
+
if ENV['MPF_TEST_CHILD_FAILURE']
|
16
|
+
Minitest.on_parallel_fork_marshal_failure do |i|
|
17
|
+
print ":child-failure#{i}#{a}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
15
21
|
class MyExceptionClass < StandardError
|
16
22
|
attr_reader :something
|
17
23
|
end
|
@@ -27,7 +33,8 @@ end
|
|
27
33
|
end
|
28
34
|
|
29
35
|
it "should work" do
|
30
|
-
sleep(1)
|
36
|
+
sleep(1)
|
37
|
+
1.must_equal 1
|
31
38
|
end
|
32
39
|
|
33
40
|
it "should fail" do
|
@@ -35,6 +42,7 @@ end
|
|
35
42
|
end
|
36
43
|
|
37
44
|
it "should raise" do
|
45
|
+
exit(1) if ENV['MPF_TEST_CHILD_FAILURE']
|
38
46
|
raise
|
39
47
|
end
|
40
48
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
ENV['MT_NO_PLUGINS'] = '1'
|
2
2
|
gem 'minitest'
|
3
|
-
require 'minitest/autorun'
|
3
|
+
require 'minitest/global_expectations/autorun'
|
4
4
|
|
5
5
|
describe 'minitest/parallel_fork' do
|
6
6
|
[[nil, ''],
|
@@ -24,4 +24,17 @@ describe 'minitest/parallel_fork' do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
it "should call on_parallel_fork_marshal_failure on failure" do
|
29
|
+
t = Time.now
|
30
|
+
ENV['NCPU'] = '4'
|
31
|
+
ENV['MPF_TEST_CHILD_FAILURE'] = '1'
|
32
|
+
output = `#{ENV['RUBY']} -I lib spec/minitest_parallel_fork_example.rb 2>&1`
|
33
|
+
ENV.delete('MPF_TEST_CHILD_FAILURE')
|
34
|
+
|
35
|
+
time = (Time.now - t)
|
36
|
+
time.must_be :<, 4
|
37
|
+
output.must_match /:child-failurea/
|
38
|
+
output.must_match /marshal data too short/
|
39
|
+
end
|
27
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest-parallel_fork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 5.11.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest-global_expectations
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
description: |
|
28
42
|
minitest-parallel_fork adds fork-based parallelization to Minitest. Each test/spec
|
29
43
|
suite is run in one of the forks, allowing this to work correctly when using
|
@@ -72,8 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
86
|
- !ruby/object:Gem::Version
|
73
87
|
version: '0'
|
74
88
|
requirements: []
|
75
|
-
|
76
|
-
rubygems_version: 2.7.6
|
89
|
+
rubygems_version: 3.2.22
|
77
90
|
signing_key:
|
78
91
|
specification_version: 4
|
79
92
|
summary: Fork-based parallelization for minitest
|