From 011f09e941c08c54878f231cbc81bd7d875225ea Mon Sep 17 00:00:00 2001 From: Andrey Marchenko Date: Tue, 27 Feb 2024 11:51:23 +0100 Subject: [PATCH] coverage using TracePoint class --- lib/datadog/ci/itr/coverage/collector.rb | 28 +++++++++++++++++----- lib/datadog/ci/test_visibility/recorder.rb | 8 +++---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/lib/datadog/ci/itr/coverage/collector.rb b/lib/datadog/ci/itr/coverage/collector.rb index 0c4c4460..564e22f8 100644 --- a/lib/datadog/ci/itr/coverage/collector.rb +++ b/lib/datadog/ci/itr/coverage/collector.rb @@ -1,9 +1,8 @@ # frozen_string_literal: true -require "coverage" +require "set" require_relative "../../utils/git" -require_relative "../../../../ddcov/ddcov" module Datadog module CI @@ -11,13 +10,24 @@ module Itr module Coverage class Collector def initialize(mode: :files, enabled: true) - # TODO: make this thread local # modes available: :files, :lines @mode = mode @enabled = enabled + @regex = /\A#{Regexp.escape(Utils::Git.root + File::SEPARATOR)}/i.freeze + + @coverage = {} if @enabled - @ddcov = DDCov.new(root: Utils::Git.root, mode: mode) + @tracepoint = TracePoint.new(:line) do |tp| + next unless tp.path =~ @regex + + if @mode == :files + @coverage[tp.path] = true + elsif @mode == :lines + @coverage[tp.path] ||= Set.new + @coverage[tp.path] << tp.lineno + end + end end end @@ -30,11 +40,17 @@ def setup end def start - @ddcov.start if @enabled + return unless @enabled + + @tracepoint.enable end def stop - @ddcov.stop if @enabled + return unless @enabled + @tracepoint.disable + res = @coverage + @coverage = {} + res end end end diff --git a/lib/datadog/ci/test_visibility/recorder.rb b/lib/datadog/ci/test_visibility/recorder.rb index bf444e01..5d004060 100644 --- a/lib/datadog/ci/test_visibility/recorder.rb +++ b/lib/datadog/ci/test_visibility/recorder.rb @@ -341,15 +341,15 @@ def on_test_end(test) coverage.each do |filename, lines| f.write("#{filename}\n") - sorted_lines = lines.uniq.sort + sorted_lines = lines.to_a.sort f.write("#{sorted_lines}\n") end f.write("---------------------------------------------------\n") end end - # p "FILTERED" - # p coverage.count - # p coverage + p "FILTERED" + p coverage.count + p coverage # move this to the code coverage transport # files_covered = coverage.keys.map { |filename| Utils::Git.relative_to_root(filename) } test.set_tag("_test.coverage", coverage)