aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common.mk12
-rw-r--r--defs/gmake.mk1
-rw-r--r--test/lib/test/unit.rb33
3 files changed, 40 insertions, 6 deletions
diff --git a/common.mk b/common.mk
index eee5886dd5..5b654ded88 100644
--- a/common.mk
+++ b/common.mk
@@ -11,6 +11,8 @@ Q = $(Q1:0=@)
ECHO0 = $(ECHO1:0=echo)
ECHO = @$(ECHO0)
+gnumake_recursive =
+
UNICODE_VERSION = 9.0.0
### set the following environment variable or uncomment the line if
@@ -624,7 +626,7 @@ yes-test-knownbug: prog PHONY
test-testframework: $(TEST_RUNNABLE)-test-testframework
yes-test-testframework: prog PHONY
- $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TESTOPTS) testunit minitest
+ $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TESTOPTS) testunit minitest
no-test-testframework: PHONY
test-sample: test-basic # backward compatibility for mswin-build
@@ -634,20 +636,20 @@ test: btest-ruby test-knownbug test-basic
# for example, make test-all TESTOPTS="-j2 -v -n test-name -- test-file-name"
test-all: $(TEST_RUNNABLE)-test-all
yes-test-all: prog PHONY
- $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(TESTS)
+ $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(TESTS)
TESTS_BUILD = mkmf
no-test-all: PHONY
- $(MINIRUBY) -I"$(srcdir)/lib" "$(srcdir)/test/runner.rb" $(TESTOPTS) $(TESTS_BUILD)
+ $(gnumake_recursive)$(MINIRUBY) -I"$(srcdir)/lib" "$(srcdir)/test/runner.rb" $(TESTOPTS) $(TESTS_BUILD)
test-almost: $(TEST_RUNNABLE)-test-almost
yes-test-almost: prog PHONY
- $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(EXCLUDE_TESTFRAMEWORK) $(TESTS)
+ $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(EXCLUDE_TESTFRAMEWORK) $(TESTS)
no-test-almost: PHONY
test-ruby: $(TEST_RUNNABLE)-test-ruby
no-test-ruby: PHONY
yes-test-ruby: prog encs PHONY
- $(RUNRUBY) "$(srcdir)/test/runner.rb" $(TEST_EXCLUDES) $(TESTOPTS) -- ruby -ext-
+ $(gnumake_recursive)$(RUNRUBY) "$(srcdir)/test/runner.rb" $(TEST_EXCLUDES) $(TESTOPTS) -- ruby -ext-
extconf: $(PREP)
$(Q) $(MAKEDIRS) "$(EXTCONFDIR)"
diff --git a/defs/gmake.mk b/defs/gmake.mk
index 2233627f8c..3f2bba4d05 100644
--- a/defs/gmake.mk
+++ b/defs/gmake.mk
@@ -1,5 +1,6 @@
# -*- makefile-gmake -*-
gnumake = yes
+override gnumake_recursive := +
CHECK_TARGETS := exam love check%
TEST_TARGETS := $(filter check test check% test% btest%,$(MAKECMDGOALS))
diff --git a/test/lib/test/unit.rb b/test/lib/test/unit.rb
index ad7620313d..2be96fe600 100644
--- a/test/lib/test/unit.rb
+++ b/test/lib/test/unit.rb
@@ -134,6 +134,23 @@ module Test
options
end
+ def non_options(files, options)
+ if !options[:parallel] and
+ /(?:\A|\s)--jobserver-auth=(\d+),(\d+)/ =~ ENV["MAKEFLAGS"]
+ begin
+ r = IO.for_fd($1.to_i(10), "rb", autoclose: false)
+ w = IO.for_fd($2.to_i(10), "wb", autoclose: false)
+ rescue
+ r.close if r
+ nil
+ else
+ @jobserver = [r, w]
+ options[:parallel] ||= 1
+ end
+ end
+ super
+ end
+
def status(*args)
result = super
raise @interrupt if @interrupt
@@ -173,9 +190,11 @@ module Test
class Worker
def self.launch(ruby,args=[])
+ opts = {}
+ @jobserver.each {|fd| opts[fd] = fd} if @jobserver
io = IO.popen([*ruby, "-W1",
"#{File.dirname(__FILE__)}/unit/parallel.rb",
- *args], "rb+")
+ *args], "rb+", opts)
new(io, io.pid, :waiting)
end
@@ -417,6 +436,7 @@ module Test
@workers = [] # Array of workers.
@workers_hash = {} # out-IO => worker
@ios = [] # Array of worker IOs
+ job_tokens = String.new(encoding: Encoding::ASCII_8BIT) if @jobserver
begin
[@tasks.size, @options[:parallel]].min.times {launch_worker}
@@ -426,6 +446,13 @@ module Test
(deal(io, type, result, rep).nil? and
!@workers.any? {|x| [:running, :prepare].include? x.status})
end
+ if job_tokens and !@tasks.empty? and !@workers.any? {|x| x.status == :ready}
+ t = @jobserver[0].read_nonblock([@tasks.size, @options[:parallel]].min, exception: false)
+ if String === t
+ job_tokens << t
+ t.size.times {launch_worker}
+ end
+ end
end
rescue Interrupt => ex
@interrupt = ex
@@ -439,6 +466,10 @@ module Test
end
quit_workers
+ if @jobserver
+ @jobserver[1] << job_tokens
+ job_tokens.clear
+ end
unless @interrupt || !@options[:retry] || @need_quit
parallel = @options[:parallel]