aboutsummaryrefslogtreecommitdiffstats
path: root/tool/run-lcov.rb
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-14 06:07:05 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-14 06:07:05 +0000
commit1c982b2a49a1ce3ca979fbabecd16402f36611ed (patch)
treea817ce768cd90aeeb488dd7eaecbf2004f3d24e8 /tool/run-lcov.rb
parent33adf313bdae2b427a72e8b642962b91cdaf6523 (diff)
downloadruby-1c982b2a49a1ce3ca979fbabecd16402f36611ed.tar.gz
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` git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59890 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'tool/run-lcov.rb')
-rw-r--r--tool/run-lcov.rb65
1 files changed, 60 insertions, 5 deletions
diff --git a/tool/run-lcov.rb b/tool/run-lcov.rb
index daf52e69b3..47f4591463 100644
--- a/tool/run-lcov.rb
+++ b/tool/run-lcov.rb
@@ -50,6 +50,61 @@ def gen_rb_lcov(file)
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_files) do
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