remove parallel-, revive incremental-support

This commit is contained in:
Johan Holmberg 2015-07-29 16:02:26 +02:00
parent 1765eda504
commit 651b613ba0
6 changed files with 175 additions and 185 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"