remove parallel-, revive incremental-support
This commit is contained in:
parent
1765eda504
commit
651b613ba0
167
bin/cmdtest.rb
167
bin/cmdtest.rb
@ -32,7 +32,6 @@ $:.unshift(lib_dir) if File.directory?(File.join(lib_dir, "cmdtest"))
|
||||
require "cmdtest/baselogger"
|
||||
require "cmdtest/consolelogger"
|
||||
require "cmdtest/junitlogger"
|
||||
require "cmdtest/notify"
|
||||
require "cmdtest/testcase"
|
||||
require "cmdtest/workdir"
|
||||
require "cmdtest/methodfilter"
|
||||
@ -51,15 +50,15 @@ module Cmdtest
|
||||
|
||||
module LogBaseMixin
|
||||
def assert_success
|
||||
_queue_notify [:assert_success]
|
||||
process_item [:assert_success]
|
||||
end
|
||||
|
||||
|
||||
def assert_failure(str)
|
||||
_queue_notify [:assert_failure, str]
|
||||
process_item [:assert_failure, str]
|
||||
end
|
||||
|
||||
def assert_error(str)
|
||||
_queue_notify [:assert_error, str]
|
||||
process_item [:assert_error, str]
|
||||
end
|
||||
|
||||
def notify(method, *args)
|
||||
@ -73,44 +72,31 @@ module Cmdtest
|
||||
end
|
||||
|
||||
def _notify_once(method, *args)
|
||||
_queue_notify [:call, method, args]
|
||||
process_item [:call, method, args]
|
||||
end
|
||||
end
|
||||
|
||||
class LogBackground < NotifyBackground
|
||||
include LogBaseMixin
|
||||
end
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
class LogClient < NotifyForeground
|
||||
class LogClient
|
||||
include LogBaseMixin
|
||||
|
||||
def background_class
|
||||
LogBackground
|
||||
end
|
||||
|
||||
def _init
|
||||
def initialize
|
||||
@listeners = []
|
||||
@n_assert_failures = 0
|
||||
@n_assert_errors = 0
|
||||
@n_assert_successes = 0
|
||||
end
|
||||
|
||||
def add_listener(listener)
|
||||
@listeners << listener
|
||||
end
|
||||
|
||||
def process_queue_item(e)
|
||||
def process_item(e)
|
||||
cmd, *rest = e
|
||||
case cmd
|
||||
when :assert_success
|
||||
@n_assert_successes += 1
|
||||
# nothing
|
||||
when :assert_failure
|
||||
@n_assert_failures += 1
|
||||
_distribute("assert_failure", rest)
|
||||
when :assert_error
|
||||
@n_assert_errors += 1
|
||||
_distribute("assert_error", rest)
|
||||
when :call
|
||||
method, args = rest
|
||||
@ -126,8 +112,22 @@ module Cmdtest
|
||||
end
|
||||
end
|
||||
|
||||
def everything_ok?
|
||||
@n_assert_errors == 0 && @n_assert_failures == 0
|
||||
end
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
class MethodId
|
||||
|
||||
attr_reader :file
|
||||
|
||||
def initialize(file, klass, method)
|
||||
@file = file
|
||||
@klass = klass
|
||||
@method = method
|
||||
end
|
||||
|
||||
def key
|
||||
@file + ":" + @klass + "." + @method.to_s
|
||||
end
|
||||
|
||||
end
|
||||
@ -151,7 +151,7 @@ module Cmdtest
|
||||
end
|
||||
|
||||
def method_id
|
||||
[@test_class.file, @test_class.testcase_class, @test_method]
|
||||
MethodId.new(@test_class.file.path, @test_class.testcase_class.display_name, @test_method)
|
||||
end
|
||||
|
||||
def skip?(runner)
|
||||
@ -159,41 +159,33 @@ module Cmdtest
|
||||
selected = (patterns.size == 0 ||
|
||||
patterns.any? {|pattern| pattern =~ @test_method } )
|
||||
|
||||
!selected || runner.method_filter.skip?(*method_id)
|
||||
return !selected || runner.method_filter.skip?(method_id)
|
||||
end
|
||||
|
||||
@@t1 = Time.now
|
||||
|
||||
def run(clog, runner)
|
||||
clog.background do |clog2|
|
||||
clog2.notify("testmethod", @test_method) do
|
||||
obj = @test_class.testcase_class.new(self, clog2, runner)
|
||||
if runner.opts.parallel == 1
|
||||
Dir.chdir(obj._work_dir.path)
|
||||
end
|
||||
obj.setup
|
||||
begin
|
||||
obj.send(@test_method)
|
||||
clog2.assert_success
|
||||
rescue Cmdtest::AssertFailed => e
|
||||
clog2.assert_failure(e.message)
|
||||
runner.method_filter.error(*method_id)
|
||||
rescue => e
|
||||
io = StringIO.new
|
||||
io.puts "CAUGHT EXCEPTION:"
|
||||
io.puts " " + e.message + " (#{e.class})"
|
||||
io.puts "BACKTRACE:"
|
||||
io.puts e.backtrace.map {|line| " " + line }
|
||||
clog2.assert_error(io.string)
|
||||
runner.method_filter.error(*method_id)
|
||||
end
|
||||
obj.teardown
|
||||
clog.notify("testmethod", @test_method) do
|
||||
obj = @test_class.testcase_class.new(self, clog, runner)
|
||||
if runner.opts.parallel == 1
|
||||
Dir.chdir(obj._work_dir.path)
|
||||
end
|
||||
if false
|
||||
t2 = Time.now
|
||||
puts "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- %s : %d" % [@test_method, t2-@@t1]
|
||||
@@t1 = t2
|
||||
obj.setup
|
||||
begin
|
||||
obj.send(@test_method)
|
||||
clog.assert_success
|
||||
runner.method_filter.success(method_id)
|
||||
rescue Cmdtest::AssertFailed => e
|
||||
clog.assert_failure(e.message)
|
||||
rescue => e
|
||||
io = StringIO.new
|
||||
io.puts "CAUGHT EXCEPTION:"
|
||||
io.puts " " + e.message + " (#{e.class})"
|
||||
io.puts "BACKTRACE:"
|
||||
io.puts e.backtrace.map {|line| " " + line }
|
||||
clog.assert_error(io.string)
|
||||
end
|
||||
obj.teardown
|
||||
end
|
||||
end
|
||||
|
||||
@ -261,7 +253,7 @@ module Cmdtest
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
@ -270,12 +262,10 @@ module Cmdtest
|
||||
|
||||
attr_reader :opts, :orig_cwd, :method_filter
|
||||
|
||||
FILTER_FILENAME = ".cmdtest-filter"
|
||||
|
||||
def initialize(project_dir, opts)
|
||||
def initialize(project_dir, incremental, opts)
|
||||
@project_dir = project_dir
|
||||
@opts = opts
|
||||
@method_filter = MethodFilter.new(FILTER_FILENAME, self)
|
||||
@method_filter = MethodFilter.new(Dir.pwd, incremental, self)
|
||||
end
|
||||
|
||||
def _path_separator
|
||||
@ -475,28 +465,47 @@ module Cmdtest
|
||||
exit(1)
|
||||
end
|
||||
|
||||
the_clog = LogClient.new(@parallel) do |clog|
|
||||
Util.opts = self
|
||||
@project_dir = ProjectDir.new(files)
|
||||
@runner = Runner.new(@project_dir, self)
|
||||
logger = ConsoleLogger.new(self)
|
||||
clog.add_listener(logger)
|
||||
if @xml
|
||||
clog.add_listener(JunitLogger.new(self, @xml))
|
||||
end
|
||||
clog = LogClient.new
|
||||
Util.opts = self
|
||||
|
||||
$cmdtest_got_ctrl_c = 0
|
||||
trap("INT") do
|
||||
puts "cmdtest: got ctrl-C ..."
|
||||
$cmdtest_got_ctrl_c += 1
|
||||
if $cmdtest_got_ctrl_c > 3
|
||||
puts "cmdtest: several Ctrl-C, exiting ..."
|
||||
exit(1)
|
||||
end
|
||||
end
|
||||
@runner.run(clog)
|
||||
error_logger = ErrorLogger.new(self)
|
||||
clog.add_listener(error_logger)
|
||||
|
||||
logger = ConsoleLogger.new(self)
|
||||
clog.add_listener(logger)
|
||||
|
||||
if @xml
|
||||
clog.add_listener(JunitLogger.new(self, @xml))
|
||||
end
|
||||
ok = the_clog.everything_ok?
|
||||
|
||||
@project_dir = ProjectDir.new(files)
|
||||
@runner = Runner.new(@project_dir, @incremental, self)
|
||||
|
||||
$cmdtest_got_ctrl_c = 0
|
||||
trap("INT") do
|
||||
puts "cmdtest: got ctrl-C ..."
|
||||
$cmdtest_got_ctrl_c += 1
|
||||
if $cmdtest_got_ctrl_c > 3
|
||||
puts "cmdtest: several Ctrl-C, exiting ..."
|
||||
exit(1)
|
||||
end
|
||||
end
|
||||
@runner.run(clog)
|
||||
|
||||
if ! @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?
|
||||
error_exit = @set_exit_code && ! ok
|
||||
exit( error_exit ? 1 : 0 )
|
||||
end
|
||||
|
@ -20,17 +20,58 @@
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
module Cmdtest
|
||||
|
||||
class BaseLogger
|
||||
|
||||
@@debug = false
|
||||
|
||||
attr_reader :opts
|
||||
|
||||
def initialize(opts)
|
||||
@opts = opts
|
||||
end
|
||||
|
||||
def testsuite_begin
|
||||
end
|
||||
|
||||
def testsuite_end
|
||||
end
|
||||
|
||||
def testfile_begin(file)
|
||||
end
|
||||
|
||||
def testfile_end(file)
|
||||
end
|
||||
|
||||
def testclass_begin(testcase_class)
|
||||
end
|
||||
|
||||
def testclass_end(testcase_class)
|
||||
end
|
||||
|
||||
def testmethod_begin(method)
|
||||
end
|
||||
|
||||
def testmethod_end(method)
|
||||
end
|
||||
|
||||
def cmdline(method, comment)
|
||||
end
|
||||
|
||||
def assert_failure(str)
|
||||
end
|
||||
|
||||
def assert_error(str)
|
||||
end
|
||||
end
|
||||
|
||||
class ErrorLogger < BaseLogger
|
||||
|
||||
@@debug = false
|
||||
|
||||
attr_reader :n_suites, :n_files, :n_classes
|
||||
attr_reader :n_methods, :n_commands, :n_failures, :n_errors
|
||||
|
||||
def initialize(opts)
|
||||
@opts = opts
|
||||
super
|
||||
|
||||
@n_suites = 0
|
||||
@n_files = 0
|
||||
@ -42,53 +83,36 @@ module Cmdtest
|
||||
end
|
||||
|
||||
def testsuite_begin
|
||||
p :testsuite_begin if @@debug
|
||||
@n_suites += 1
|
||||
end
|
||||
|
||||
def testsuite_end
|
||||
p :testsuite_end if @@debug
|
||||
end
|
||||
|
||||
|
||||
def testfile_begin(file)
|
||||
p [:testfile_begin, file] if @@debug
|
||||
@n_files += 1
|
||||
end
|
||||
|
||||
def testfile_end(file)
|
||||
p :testfile_end if @@debug
|
||||
end
|
||||
|
||||
|
||||
def testclass_begin(testcase_class)
|
||||
p [:testclass_begin, testcase_class] if @@debug
|
||||
@n_classes += 1
|
||||
end
|
||||
|
||||
def testclass_end(testcase_class)
|
||||
p :testclass_end if @@debug
|
||||
end
|
||||
|
||||
|
||||
def testmethod_begin(method)
|
||||
p [:testmethod_begin, method] if @@debug
|
||||
@n_methods += 1
|
||||
end
|
||||
|
||||
def testmethod_end(method)
|
||||
p :testmethod_end if @@debug
|
||||
end
|
||||
|
||||
def cmdline(method, comment)
|
||||
p :testmethod_end if @@debug
|
||||
@n_commands += 1
|
||||
end
|
||||
|
||||
def assert_failure
|
||||
|
||||
def assert_failure(msg)
|
||||
@n_failures += 1
|
||||
end
|
||||
|
||||
def assert_error
|
||||
def assert_error(str)
|
||||
@n_errors += 1
|
||||
end
|
||||
|
||||
def everything_ok?
|
||||
@n_errors == 0 && @n_failures == 0
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
@ -25,27 +25,22 @@ module Cmdtest
|
||||
class ConsoleLogger < BaseLogger
|
||||
|
||||
def _banner(ch, str)
|
||||
puts "### " + ch * 40 + " " + str
|
||||
puts "### " + ch * 40 + " " + str
|
||||
end
|
||||
|
||||
def testfile_begin(file)
|
||||
super
|
||||
_banner "=", file if ! opts.quiet
|
||||
end
|
||||
|
||||
def testclass_begin(testcase_class_name)
|
||||
super
|
||||
_banner "-", testcase_class_name if ! opts.quiet
|
||||
end
|
||||
|
||||
def testmethod_begin(method)
|
||||
super
|
||||
_banner ".", method.to_s if ! opts.quiet
|
||||
end
|
||||
|
||||
def cmdline(cmdline_arg, comment)
|
||||
super
|
||||
|
||||
if opts.verbose
|
||||
first = comment || "..."
|
||||
puts "### %s" % [first]
|
||||
@ -57,26 +52,12 @@ module Cmdtest
|
||||
end
|
||||
|
||||
def assert_failure(str)
|
||||
super()
|
||||
puts str.gsub(/^/, "--- ")
|
||||
end
|
||||
|
||||
def assert_error(str)
|
||||
super()
|
||||
puts str.gsub(/^/, "--- ")
|
||||
end
|
||||
|
||||
def testsuite_end
|
||||
super
|
||||
if ! opts.quiet
|
||||
puts
|
||||
puts "%s %d test classes, %d test methods, %d commands, %d errors, %d fatals." % [
|
||||
n_failures == 0 && n_errors == 0 ? "###" : "---",
|
||||
n_classes, n_methods, n_commands, n_failures, n_errors
|
||||
]
|
||||
puts
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
@ -34,27 +34,16 @@ module Cmdtest
|
||||
@jf = JunitFile.new(@file)
|
||||
end
|
||||
|
||||
def testfile_begin(file)
|
||||
super
|
||||
end
|
||||
|
||||
def testclass_begin(testcase_class_name)
|
||||
super
|
||||
@testcase_class_name = testcase_class_name
|
||||
@ts = @jf.new_testsuite("CMDTEST", testcase_class_name)
|
||||
end
|
||||
|
||||
def testclass_end(testcase_class_name)
|
||||
super
|
||||
end
|
||||
|
||||
def testmethod_begin(method)
|
||||
super
|
||||
@err_assertions = []
|
||||
end
|
||||
|
||||
def testmethod_end(method)
|
||||
super
|
||||
if @err_assertions.size > 0
|
||||
message = @err_assertions[0].split(/\n/)[0]
|
||||
type = "assert"
|
||||
@ -69,25 +58,17 @@ module Cmdtest
|
||||
"CMDTEST." + @testcase_class_name
|
||||
end
|
||||
|
||||
def cmdline(cmdline_arg, comment)
|
||||
super
|
||||
end
|
||||
|
||||
def assert_failure(str)
|
||||
super()
|
||||
@err_assertions << str
|
||||
end
|
||||
|
||||
def assert_error(str)
|
||||
super()
|
||||
@err_assertions << str
|
||||
end
|
||||
|
||||
def testsuite_end
|
||||
super
|
||||
@jf.write
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -19,67 +19,66 @@
|
||||
# along with "cmdtest". If not, see <http://www.gnu.org/licenses/>.
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
require "json"
|
||||
|
||||
module Cmdtest
|
||||
class MethodFilter
|
||||
|
||||
def initialize(filter_filename, runner)
|
||||
@filter_filename = filter_filename
|
||||
def initialize(cwd, incremental, runner)
|
||||
@incremental = incremental
|
||||
@cwd = cwd
|
||||
@filter_filename = File.expand_path(".cmdtest-filter", @cwd)
|
||||
|
||||
@runner = runner
|
||||
@filter = {}
|
||||
|
||||
if @runner.opts.incremental && File.file?(@filter_filename)
|
||||
File.open(filter_filename, "r") do |f|
|
||||
while line = f.gets
|
||||
line.chomp!
|
||||
key, signature = line.split(/\t/, 2)
|
||||
@filter[key] = signature
|
||||
end
|
||||
File.open(@filter_filename, "r") do |f|
|
||||
@filter = JSON.load(f)
|
||||
end
|
||||
else
|
||||
@filter = {}
|
||||
end
|
||||
|
||||
@files_read = {}
|
||||
@signatures = {}
|
||||
@new_filter = {}
|
||||
@new_filter = @filter.dup
|
||||
end
|
||||
|
||||
def write
|
||||
File.open(@filter_filename, "w") do |f|
|
||||
for key in @new_filter.keys.sort
|
||||
f.puts "%s\t%s" % [
|
||||
key,
|
||||
@new_filter[key] || "unknown",
|
||||
]
|
||||
end
|
||||
f.puts JSON.pretty_generate(@new_filter)
|
||||
end
|
||||
end
|
||||
|
||||
def skip?(file, klass, method)
|
||||
_maybe_read_ruby_file(file.path)
|
||||
key = _method_key(file.path, klass.display_name, method)
|
||||
#p [:skip, key, @signatures[key], @filter[key]]
|
||||
@new_filter[key] = @signatures[key]
|
||||
return @new_filter[key] && @new_filter[key] == @filter[key]
|
||||
def _get_method_signature(method_id)
|
||||
_maybe_read_ruby_file(method_id.file)
|
||||
return @signatures[method_id.key] || "NO-SIGNATURE-FOUND"
|
||||
end
|
||||
|
||||
def error(file, klass, method)
|
||||
key = _method_key(file.path, klass.display_name, method)
|
||||
@new_filter.delete(key)
|
||||
def skip?(method_id)
|
||||
return @incremental && @new_filter[method_id.key] == _get_method_signature(method_id)
|
||||
end
|
||||
|
||||
def success(method_id)
|
||||
@new_filter[method_id.key] = _get_method_signature(method_id)
|
||||
end
|
||||
|
||||
def _maybe_read_ruby_file(file)
|
||||
return if @files_read[file]
|
||||
@files_read[file] = true
|
||||
|
||||
if File.file?(file)
|
||||
method_signatures = _collect_method_signatures(file)
|
||||
path = File.expand_path(file, @cwd)
|
||||
if File.file?(path)
|
||||
method_signatures = _collect_method_signatures(file, path)
|
||||
@signatures.merge!(method_signatures)
|
||||
end
|
||||
end
|
||||
|
||||
# Collect signatures of all methods, as found in the CMDTEST_*.rb file.
|
||||
|
||||
def _collect_method_signatures(file)
|
||||
def _collect_method_signatures(file, path)
|
||||
method_signatures = {}
|
||||
lines = File.readlines(file)
|
||||
lines = File.readlines(path)
|
||||
klass = klass_indent = klass_i = nil
|
||||
methods = method_indent = method_i = nil
|
||||
|
||||
@ -111,7 +110,7 @@ module Cmdtest
|
||||
when klass && methods && line =~ /^#{method_indent}end\b/ #...
|
||||
## p [:method_end, methods]
|
||||
for method in methods
|
||||
key = _method_key(file, klass, method)
|
||||
key = MethodId.new(file, klass, method).key
|
||||
method_signatures[key] = _method_signature(lines[method_i..i])
|
||||
end
|
||||
methods = nil
|
||||
@ -120,14 +119,10 @@ module Cmdtest
|
||||
end
|
||||
return method_signatures
|
||||
end
|
||||
|
||||
|
||||
def _method_signature(content)
|
||||
Digest::MD5.hexdigest(content.join)
|
||||
end
|
||||
|
||||
def _method_key(file, klass, method)
|
||||
file + ":" + klass + "." + method.to_s
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
@ -12,7 +12,7 @@ module SelftestUtils
|
||||
end
|
||||
|
||||
def setup
|
||||
ignore_file ".cmdtest-filter"
|
||||
ignore_file "**/.cmdtest-filter"
|
||||
ignore_file "tmp-cmdtest-2/"
|
||||
ignore_file "tmp-cmdtest-2/TIMESTAMP"
|
||||
ignore_file "tmp-cmdtest-2/tmp-command.sh"
|
||||
|
Loading…
x
Reference in New Issue
Block a user