Skip to content

Commit e089a26

Browse files
luke-gruberpeterzhu2118
authored andcommitted
test_all_ractors_multi_ractor: tmp commit
1 parent 643364e commit e089a26

3 files changed

Lines changed: 63 additions & 33 deletions

File tree

tool/lib/core_assertions.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ def assert_normal_exit(testsrc, message = '', child_env: nil, **opt)
286286
end
287287

288288
def assert_ruby_status(args, test_stdin="", message=nil, **opt)
289+
pend "#{__method__}" if non_main_ractor?
289290
out, _, status = EnvUtil.invoke_ruby(args, test_stdin, true, :merge_to_stdout, **opt)
290291
desc = FailDesc[status, message, out]
291292
assert(!status.signaled?, desc)

tool/lib/test/unit.rb

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,12 +1688,10 @@ def _run_suite suite, type
16881688
trace = true
16891689
end
16901690

1691-
run_tests_in_ractors = ENV["RUBY_TESTS_WITH_RACTORS"]
1692-
1691+
run_tests_inside_ractors_num = ENV["RUBY_TESTS_WITH_RACTORS"].to_i
16931692
tests_run = 0
16941693
assertions = all_test_methods.map { |method|
1695-
1696-
inst = suite.new method
1694+
inst = suite.new method.to_s
16971695
_start_method(inst)
16981696
inst._assertions = 0
16991697

@@ -1704,34 +1702,62 @@ def _run_suite suite, type
17041702
if trace
17051703
ObjectSpace.trace_object_allocations {inst.run self}
17061704
else
1707-
if run_tests_in_ractors
1708-
port = Ractor::Port.new
1709-
r = Ractor.new(port) do |p|
1710-
instance = Ractor.receive
1711-
runner = Ractor.receive
1712-
res = instance.run runner
1713-
movable_ivars = {:@_assertions => true, :@__passed__ => true, :@__name__ => true}
1714-
instance.instance_variables.each do |ivar|
1715-
unless movable_ivars[ivar]
1716-
instance.remove_instance_variable(ivar)
1705+
if run_tests_inside_ractors_num > 0
1706+
old_report = self.report
1707+
old_failures = self.failures
1708+
old_errors = self.errors
1709+
old_skips = self.skips
1710+
old_assertion_count = self.assertion_count
1711+
old_test_count = self.test_count
1712+
self.report = []
1713+
self.failures = 0
1714+
self.errors = 0
1715+
self.skips = 0
1716+
self.assertion_count = 0
1717+
self.test_count = 0
1718+
rs = run_tests_inside_ractors_num.times.map do
1719+
r = Ractor.new(inst, self) do |instance, runner|
1720+
res = instance.run runner
1721+
testcase_copyable_ivars = {:@_assertions => true, :@__passed__ => true, :@__name__ => true}
1722+
runner_copyable_ivars = {:@report => true, :@failures => true, :@errors => true, :@skips => true, :@assertion_count => true, :@test_count => true}
1723+
instance.instance_variables.each do |ivar|
1724+
unless testcase_copyable_ivars[ivar]
1725+
instance.remove_instance_variable(ivar)
1726+
end
17171727
end
1728+
runner.instance_variables.each do |ivar|
1729+
unless runner_copyable_ivars[ivar]
1730+
runner.remove_instance_variable(ivar)
1731+
end
1732+
end
1733+
[instance, runner, res]
17181734
end
1719-
p.send(instance, move: true)
1720-
p.send(runner)
1721-
res
17221735
end
1723-
r.send(inst, move: true)
1724-
r.send(self, move: false)
1725-
inst = port.receive
1726-
runner = port.receive
1727-
result = r.value
1728-
_merge_results_from_ractor(runner)
1729-
port.close
1730-
result
1736+
ractor_results = []
1737+
while rs.any?
1738+
r, obj = Ractor.select(*rs)
1739+
_inst, runner, res = *obj
1740+
ractor_results << [res, runner]
1741+
rs.delete(r)
1742+
end
1743+
# ractors done
1744+
self.report = old_report
1745+
self.failures = old_failures
1746+
self.errors = old_errors
1747+
self.skips = old_skips
1748+
self.assertion_count = old_assertion_count
1749+
self.test_count = old_test_count
1750+
res = ""
1751+
ractor_results.each do |(res0, runner)|
1752+
res += res0
1753+
_merge_results_from_ractor(runner)
1754+
end
1755+
res
17311756
else
17321757
inst.run self
17331758
end
17341759
end
1760+
17351761
tests_run += 1
17361762

17371763
print "%.2f s = " % (Time.now - start_time) if @verbose
@@ -1747,13 +1773,16 @@ def _run_suite suite, type
17471773
return assertions.size, assertions.inject(0) { |sum, n| sum + n }
17481774
end
17491775

1776+
def __init_runner(runner)
1777+
end
1778+
17501779
def _merge_results_from_ractor(runner_cpy)
1751-
@report = runner_cpy.report
1752-
@failures = runner_cpy.failures
1753-
@errors = runner_cpy.errors
1754-
@skips = runner_cpy.skips
1755-
@assertion_count = runner_cpy.assertion_count
1756-
@test_count = runner_cpy.test_count
1780+
@report += runner_cpy.report
1781+
@failures += runner_cpy.failures
1782+
@errors += runner_cpy.errors
1783+
@skips += runner_cpy.skips
1784+
@assertion_count += runner_cpy.assertion_count
1785+
@test_count += runner_cpy.test_count
17571786
end
17581787

17591788
def _start_method(inst)

tool/lib/test/unit/testcase.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,11 @@ def initialize name # :nodoc:
229229
@__name__ = name
230230
@__io__ = nil
231231
@__passed__ = nil
232-
@@__current__ = self # FIX: make thread local
232+
Ractor.current[:__test_current__] = self
233233
end
234234

235235
def self.current # :nodoc:
236-
@@__current__ # FIX: make thread local
236+
Ractor.current[:__test_current__]
237237
end
238238

239239
##

0 commit comments

Comments
 (0)