ruby-changes:47772
From: mame <ko1@a...>
Date: Thu, 14 Sep 2017 15:07:10 +0900 (JST)
Subject: [ruby-changes:47772] mame:r59890 (trunk): Measure branch and method coverage for `make test-all`
mame 2017-09-14 15:07:05 +0900 (Thu, 14 Sep 2017) New Revision: 59890 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=59890 Log: Measure branch and method coverage for `make test-all` To measure coverage of C code: `./configure --enable-gcov && make && make exam && make lcov` To measure coverage of Ruby code: `./configure && make && make exam COVERAGE=true && make lcov` To measure coverage of both languages at a time: `./configure --enable-gcov && make && make exam COVERAGE=true && make lcov` Modified files: trunk/test/ruby/test_thread.rb trunk/tool/run-lcov.rb trunk/tool/test-coverage.rb Index: tool/test-coverage.rb =================================================================== --- tool/test-coverage.rb (revision 59889) +++ tool/test-coverage.rb (revision 59890) @@ -1,6 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/test-coverage.rb#L1 require "coverage" -Coverage.start +ENV["COVERAGE_EXPERIMENTAL_MODE"] = "true" +Coverage.start(lines: true, branches: true, methods: true) TEST_COVERAGE_DATA_FILE = "test-coverage.dat" @@ -8,14 +9,22 @@ def merge_coverage_data(res1, res2) https://github.com/ruby/ruby/blob/trunk/tool/test-coverage.rb#L9 res1.each do |path, cov1| cov2 = res2[path] if cov2 - cov1.each_with_index do |count1, i| + cov1[:lines].each_with_index do |count1, i| next unless count1 - if cov2[i] - cov2[i] += count1 + add_count(cov2[:lines], i, count1) + end + cov1[:branches].each do |base_key, targets1| + if cov2[:branches][base_key] + targets1.each do |target_key, count1| + add_count(cov2[:branches][base_key], target_key, count1) + end else - cov2[i] = count1 + cov2[:branches][base_key] = targets1 end end + cov1[:methods].each do |key, count1| + add_count(cov2[:methods], key, count1) + end else res2[path] = cov1 end @@ -23,6 +32,14 @@ def merge_coverage_data(res1, res2) https://github.com/ruby/ruby/blob/trunk/tool/test-coverage.rb#L32 res2 end +def add_count(h, key, count) + if h[key] + h[key] += count + else + h[key] = count + end +end + def save_coverage_data(res1) File.open(TEST_COVERAGE_DATA_FILE, File::RDWR | File::CREAT | File::BINARY) do |f| f.flock(File::LOCK_EX) @@ -49,7 +66,7 @@ def invoke_simplecov_formatter https://github.com/ruby/ruby/blob/trunk/tool/test-coverage.rb#L66 res.each do |path, cov| next unless path.start_with?(base_dir) next if path.start_with?(File.join(base_dir, "test")) - simplecov_result[path] = cov + simplecov_result[path] = cov[:lines] end res = SimpleCov::Result.new(simplecov_result) Index: tool/run-lcov.rb =================================================================== --- tool/run-lcov.rb (revision 59889) +++ tool/run-lcov.rb (revision 59890) @@ -50,6 +50,61 @@ def gen_rb_lcov(file) https://github.com/ruby/ruby/blob/trunk/tool/run-lcov.rb#L50 end end +def gen_rb_lcov(file) + res = Marshal.load(File.binread(file)) + + open("lcov-rb-all.info", "w") do |f| + f.puts "TN:" # no test name + base_dir = File.dirname(File.dirname(__dir__)) + res.each do |path, cov| + next unless path.start_with?(base_dir) + next if path.start_with?(File.join(base_dir, "test")) + f.puts "SF:#{ path }" + + # function coverage + total = covered = 0 + cov[:methods].each do |(name, lineno), count| + f.puts "FN:#{ lineno },#{ name }" + total += 1 + covered += 1 if count > 0 + end + f.puts "FNF:#{ total }" + f.puts "FNF:#{ covered }" + cov[:methods].each do |(name, _), count| + f.puts "FNDA:#{ count },#{ name }" + end + + # line coverage + total = covered = 0 + cov[:lines].each_with_index do |count, lineno| + next unless count + f.puts "DA:#{ lineno + 1 },#{ count }" + total += 1 + covered += 1 if count > 0 + end + f.puts "LF:#{ total }" + f.puts "LH:#{ covered }" + + # branch coverage + total = covered = 0 + id = 0 + cov[:branches].each do |(base_type, base_lineno), targets| + i = 0 + targets.each do |(target_type, target_lineno), count| + f.puts "BRDA:#{ base_lineno },#{ id },#{ i },#{ count }" + total += 1 + covered += 1 if count > 0 + i += 1 + end + id += 1 + end + f.puts "BRF:#{ total }" + f.puts "BRH:#{ covered }" + f.puts "end_of_record" + end + end +end + gcda_files = Pathname.glob("**/*.gcda") ext_gcda_files = gcda_files.select {|f| f.fnmatch("ext/*") } rubyspec_temp_gcda_files = gcda_files.select {|f| f.fnmatch("rubyspec_temp/*") } @@ -67,16 +122,16 @@ backup_gcda_files(rubyspec_temp_gcda_fil https://github.com/ruby/ruby/blob/trunk/tool/run-lcov.rb#L122 end end if $info_files != [] - system("lcov", *$info_files.flat_map {|f| ["-a", f] }, "-o", "lcov-c-all.info") - system("genhtml", "--ignore-errors", "source", "lcov-c-all.info", "-o", "lcov-c-out") + system("lcov", *$info_files.flat_map {|f| ["-a", f] }, "--rc", "lcov_branch_coverage=1", "-o", "lcov-c-all.info") + system("genhtml", "--branch-coverage", "--ignore-errors", "source", "lcov-c-all.info", "-o", "lcov-c-out") end if File.readable?("test-coverage.dat") gen_rb_lcov("test-coverage.dat") - system("genhtml", "--ignore-errors", "source", "lcov-rb-all.info", "-o", "lcov-rb-out") + system("genhtml", "--branch-coverage", "--ignore-errors", "source", "lcov-rb-all.info", "-o", "lcov-rb-out") end if File.readable?("lcov-c-all.info") && File.readable?("lcov-rb-all.info") - system("lcov", "-a", "lcov-c-all.info", "-a", "lcov-rb-all.info", "-o", "lcov-all.info") || raise - system("genhtml", "--ignore-errors", "source", "lcov-all.info", "-o", "lcov-out") + system("lcov", "-a", "lcov-c-all.info", "-a", "lcov-rb-all.info", "--rc", "lcov_branch_coverage=1", "-o", "lcov-all.info") || raise + system("genhtml", "--branch-coverage", "--ignore-errors", "source", "lcov-all.info", "-o", "lcov-out") end Index: test/ruby/test_thread.rb =================================================================== --- test/ruby/test_thread.rb (revision 59889) +++ test/ruby/test_thread.rb (revision 59890) @@ -1148,7 +1148,7 @@ q.pop https://github.com/ruby/ruby/blob/trunk/test/ruby/test_thread.rb#L1148 end Process.wait2(f.pid) end - unless th.join(EnvUtil.apply_timeout_scale(3)) + unless th.join(EnvUtil.apply_timeout_scale(30)) Process.kill(:QUIT, f.pid) Process.kill(:KILL, f.pid) unless th.join(EnvUtil.apply_timeout_scale(1)) end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/