[code coverage] Skip line that starts with skipped region
This CL fixes a bug that sometimes a uncoverable line is incorrectly
marked as not covered.
Bug: 930360
Change-Id: I122c6009c2294ad6a8db80b0fed58ab9b4b1d10a
Reviewed-on: https://chromium-review.googlesource.com/c/1495395
Reviewed-by: Roberto Carrillo <robertocn@chromium.org>
Commit-Queue: Yuke Liao <liaoyuke@chromium.org>
diff --git a/scripts/slave/recipe_modules/clang_coverage/resources/generate_coverage_metadata.py b/scripts/slave/recipe_modules/clang_coverage/resources/generate_coverage_metadata.py
index a3bc547..7fd6436 100644
--- a/scripts/slave/recipe_modules/clang_coverage/resources/generate_coverage_metadata.py
+++ b/scripts/slave/recipe_modules/clang_coverage/resources/generate_coverage_metadata.py
@@ -84,8 +84,11 @@
line_starts_new_region = any(
[_is_start_of_region(segment) for segment in current_line_segments])
- is_coverable = ((wrap_segment and _has_count(wrap_segment)) or
- line_starts_new_region)
+ is_start_of_skipped_region = (
+ current_line_segments and not _has_count(current_line_segments[0]) and
+ _is_region_entry(current_line_segments[0]))
+ is_coverable = not is_start_of_skipped_region and (
+ (wrap_segment and _has_count(wrap_segment)) or line_starts_new_region)
if not is_coverable:
continue
diff --git a/scripts/slave/recipe_modules/clang_coverage/unittests/generate_coverage_metadata_test.py b/scripts/slave/recipe_modules/clang_coverage/unittests/generate_coverage_metadata_test.py
index 8814db2..10c9cec 100755
--- a/scripts/slave/recipe_modules/clang_coverage/unittests/generate_coverage_metadata_test.py
+++ b/scripts/slave/recipe_modules/clang_coverage/unittests/generate_coverage_metadata_test.py
@@ -63,6 +63,33 @@
self.assertDictEqual(expected_line_data, line_data)
self.assertDictEqual(expected_block_data, block_data)
+ # This test uses the following code, and the segments are based on execution
+ # on Linux platform.
+ #
+ # 1| |#include "testing/gtest/include/gtest/gtest.h"
+ # 2| |
+ # 3| 0|TEST(GUIDTest, DISABLED_GUIDGeneratesAllZeroes) {
+ # 4| 0|
+ # 5| | #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
+ # 6| | EXPECT_EQ(1, 1);
+ # 7| | #else
+ # 8| 0| EXPECT_EQ(2, 2);
+ # 9| 0| #endif
+ # 10| 0|}
+ #
+ # Where the first column is the line number and the second column is the
+ # expected number of times the line is executed.
+ def test_parse_exported_coverage_json_uncovered_macros(self):
+ segments = [[3, 49, 0, True, True], [5, 3, 0, False, True],
+ [8, 1, 0, True, False], [8, 5, 0, True, True],
+ [8, 14, 0, True, False], [10, 2, 0, False, False]]
+
+ expected_line_data = dict([(3, 0), (4, 0), (8, 0), (9, 0), (10, 0)])
+ expected_block_data = {}
+ line_data, block_data = generator._extract_coverage_info(segments)
+ self.assertDictEqual(expected_line_data, line_data)
+ self.assertDictEqual(expected_block_data, block_data)
+
# This test uses the following code:
# 1| 1|int main() {
# 2| 1| if ((2 > 1) || (3 > 2)) {