first version using parallel(1)

to implement -jN option to cmdtest.
may need some cleanup/refactoring.
This commit is contained in:
Johan Holmberg 2015-08-17 23:03:42 +02:00
parent 225983f813
commit 5021972318
3 changed files with 128 additions and 33 deletions

View File

@ -288,10 +288,14 @@ module Cmdtest
if ! @opts.slave if ! @opts.slave
File.join(tmp_cmdtest_dir, "top") File.join(tmp_cmdtest_dir, "top")
else else
File.join(tmp_cmdtest_dir, @opts.slave) tmp_dir_slave(@opts.slave)
end end
end end
def tmp_dir_slave(slave_name)
File.join(tmp_cmdtest_dir, slave_name)
end
def tmp_work_dir def tmp_work_dir
File.join(tmp_dir, "work") File.join(tmp_dir, "work")
end end
@ -319,16 +323,75 @@ module Cmdtest
end end
end end
clog.notify("testsuite") do if @opts.parallel > 1
for adm_file in @adm_files json_files = []
clog.notify("testfile", adm_file.path) do nclasses = 0
File.open("tmp.sh", "w") do |f|
for adm_file in @adm_files
if ! @opts.quiet
f.puts "echo '### " + "=" * 40 + " " + adm_file.path + "'"
end
for adm_class in adm_file.adm_classes for adm_class in adm_file.adm_classes
clog.notify("testclass", adm_class.runtime_class.display_name) do nclasses += 1
for adm_method in adm_class.adm_methods if ! @opts.quiet
adm_method.run(clog, self) f.puts "echo '### " + "-" * 40 + " " + adm_class.as_filename + "'"
if $cmdtest_got_ctrl_c > 0 end
puts "cmdtest: exiting after Ctrl-C ..." for adm_method in adm_class.adm_methods
exit(1) slave_name = adm_method.as_filename
f.puts "#{$0} %s --slave %s %s" % [
(@opts.quiet ? "-q" : ""),
slave_name,
adm_file.path,
]
json_files << File.join(tmp_dir_slave(slave_name), "result.json")
end
end
end
end
cmd = "parallel -k -j%d < tmp.sh" % [@opts.parallel]
ok = system(cmd)
summary = Hash.new(0)
for file in json_files
File.open(file) do |f|
data = JSON.load(f)
for k,v in data
summary[k] += v
end
end
end
summary["classes"] = nclasses
if ! @opts.quiet
Cmdtest.print_summary(summary)
end
ok = summary["errors"] == 0 && summary["failures"] == 0
error_exit = ! @opts.no_exit_code && ! ok
exit( error_exit ? 1 : 0 )
elsif @opts.slave
for adm_file in @adm_files
for adm_class in adm_file.adm_classes
for adm_method in adm_class.adm_methods
if adm_method.as_filename == @opts.slave
adm_method.run(clog, self)
end
end
end
end
else
clog.notify("testsuite") do
for adm_file in @adm_files
clog.notify("testfile", adm_file.path) do
for adm_class in adm_file.adm_classes
clog.notify("testclass", adm_class.runtime_class.display_name) do
for adm_method in adm_class.adm_methods
adm_method.run(clog, self)
if $cmdtest_got_ctrl_c > 0
puts "cmdtest: exiting after Ctrl-C ..."
exit(1)
end
end end
end end
end end
@ -343,6 +406,21 @@ module Cmdtest
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def self.print_summary(summary)
puts
puts "%s %d test classes, %d test methods, %d commands, %d errors, %d fatals." % [
summary["failures"] == 0 && summary["errors"] == 0 ? "###" : "---",
summary["classes"],
summary["methods"],
summary["commands"],
summary["failures"],
summary["errors"],
]
puts
end
#----------------------------------------------------------------------
class ProjectDir class ProjectDir
ORIG_CWD = Dir.pwd ORIG_CWD = Dir.pwd
@ -420,7 +498,6 @@ module Cmdtest
class Main class Main
def initialize def initialize
_update_cmdtest_level
end end
def _parse_options def _parse_options
@ -442,6 +519,8 @@ module Cmdtest
def run def run
opts = _parse_options opts = _parse_options
_update_cmdtest_level(opts.slave ? 0 : 1)
files = [] files = []
for arg in opts.args for arg in opts.args
case case
@ -495,28 +574,43 @@ module Cmdtest
end end
@runner.run(clog) @runner.run(clog)
if ! opts.quiet if opts.slave
puts result = {
puts "%s %d test classes, %d test methods, %d commands, %d errors, %d fatals." % [ "classes" => error_logger.n_classes,
error_logger.n_failures == 0 && error_logger.n_errors == 0 ? "###" : "---", "methods" => error_logger.n_methods,
error_logger.n_classes, "commands" => error_logger.n_commands,
error_logger.n_methods, "failures" => error_logger.n_failures,
error_logger.n_commands, "errors" => error_logger.n_errors,
error_logger.n_failures, }
error_logger.n_errors result_file = File.join(@runner.tmp_dir, "result.json")
] File.open(result_file, "w") do |f|
puts f.puts JSON.pretty_generate(result)
end end
exit(0)
else
if ! opts.quiet
puts
puts "%s %d test classes, %d test methods, %d commands, %d errors, %d fatals." % [
error_logger.n_failures == 0 && error_logger.n_errors == 0 ? "###" : "---",
error_logger.n_classes,
error_logger.n_methods,
error_logger.n_commands,
error_logger.n_failures,
error_logger.n_errors,
]
puts
end
ok = error_logger.everything_ok? ok = error_logger.everything_ok?
error_exit = ! opts.no_exit_code && ! ok error_exit = ! opts.no_exit_code && ! ok
exit( error_exit ? 1 : 0 ) exit( error_exit ? 1 : 0 )
end
end end
private private
def _update_cmdtest_level def _update_cmdtest_level(inc)
$cmdtest_level = (ENV["CMDTEST_LEVEL"] || "0").to_i + 1 $cmdtest_level = (ENV["CMDTEST_LEVEL"] || "0").to_i + inc
ENV["CMDTEST_LEVEL"] = $cmdtest_level.to_s ENV["CMDTEST_LEVEL"] = $cmdtest_level.to_s
end end

View File

@ -28,7 +28,7 @@ class CMDTEST_summery < Cmdtest::Testcase
' exit_zero', ' exit_zero',
' end', ' end',
' cmd "true" do', ' cmd "true" do',
' exit_nonzero', ' exit_nonzero', # +1 errors
' end', ' end',
' end', ' end',
'', '',
@ -36,25 +36,25 @@ class CMDTEST_summery < Cmdtest::Testcase
' cmd "true" do', ' cmd "true" do',
' exit_zero', ' exit_zero',
' end', ' end',
' non_existing_method', ' non_existing_method', # +1 fatals
' end', ' end',
'', '',
' def test_foo3', ' def test_foo3',
' cmd "true" do', ' cmd "true" do',
' exit_zero', ' exit_zero',
' end', ' end',
' non_existing_method', ' non_existing_method', # +1 fatals
' end', ' end',
'', '',
' def test_foo4', ' def test_foo4',
' cmd "true" do', ' cmd "true" do',
' exit_nonzero', ' exit_nonzero', # +1 errors
' end', ' end',
' end', ' end',
'', '',
' def test_foo5', ' def test_foo5',
' cmd "true" do', ' cmd "true" do',
' exit_nonzero', ' exit_nonzero', # +1 errors
' end', ' end',
' end', ' end',
'', '',

View File

@ -12,6 +12,7 @@ module SelftestUtils
end end
def setup def setup
ignore_file "**/tmp.sh"
ignore_file "**/.cmdtest-filter" ignore_file "**/.cmdtest-filter"
ignore_file "tmp-cmdtest-2/" ignore_file "tmp-cmdtest-2/"
ignore_file "tmp-cmdtest-2/TIMESTAMP" ignore_file "tmp-cmdtest-2/TIMESTAMP"