aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorFabian Meumertzheim <fabian@meumertzhe.im>2022-09-11 02:26:36 +0200
committerGitHub <noreply@github.com>2022-09-10 17:26:36 -0700
commitd94e692a7dd9afb71628b58e8268ebeecb505802 (patch)
treeebc615b2d31b9f4e38ba8e229450315308094daf /tests
parentcf20167d606377a36aadc98f9ede16687e3c716a (diff)
downloadbazelbuild-rules_go-d94e692a7dd9afb71628b58e8268ebeecb505802.tar.gz
Collect coverage for other languages (#3287)
When using `--combined_report=lcov`, the coverage report for a `go_test` will also include coverage for data dependencies executed by the test, e.g. `java_binary` or `cc_binary` tools run in an integration test. Note: This commit does *not* make it so that coverage is collected for `go_binary`s executed by `go_test`s - Go doesn't provide exit hooks, so this would be rather involved to implement.
Diffstat (limited to 'tests')
-rw-r--r--tests/core/coverage/lcov_coverage_test.go120
-rw-r--r--tests/core/coverage/lcov_test_main_coverage_test.go2
2 files changed, 120 insertions, 2 deletions
diff --git a/tests/core/coverage/lcov_coverage_test.go b/tests/core/coverage/lcov_coverage_test.go
index 4f2c5af8..95800f85 100644
--- a/tests/core/coverage/lcov_coverage_test.go
+++ b/tests/core/coverage/lcov_coverage_test.go
@@ -47,6 +47,18 @@ go_test(
srcs = ["lib_test.go"],
deps = [":lib"],
)
+
+java_binary(
+ name = "Tool",
+ srcs = ["Tool.java"],
+)
+
+go_test(
+ name = "lib_with_tool_test",
+ srcs = ["lib_with_tool_test.go"],
+ data = [":Tool"],
+ deps = [":lib"],
+)
-- src/lib.go --
package lib
@@ -90,6 +102,40 @@ func TestLib(t *testing.T) {
t.Error("Expected a newline in the output")
}
}
+-- src/Tool.java --
+public class Tool {
+ public static void main(String[] args) {
+ if (args.length != 0) {
+ System.err.println("Expected no arguments");
+ System.exit(1);
+ }
+ System.err.println("Hello, world!");
+ }
+}
+-- src/lib_with_tool_test.go --
+package lib_test
+
+import (
+ "os/exec"
+ "strings"
+ "testing"
+
+ "example.com/lib"
+)
+
+func TestLib(t *testing.T) {
+ if !strings.Contains(lib.HelloFromLib(false), "\n") {
+ t.Error("Expected a newline in the output")
+ }
+}
+
+func TestTool(t *testing.T) {
+ err := exec.Command("Tool").Run()
+ if err != nil {
+ t.Error(err)
+ }
+}
+
`,
})
}
@@ -120,7 +166,7 @@ func testLcovCoverage(t *testing.T, extraArgs ...string) {
if err != nil {
t.Fatal(err)
}
- for _, expectedIndividualCoverage := range expectedIndividualCoverages {
+ for _, expectedIndividualCoverage := range expectedGoCoverage {
if !strings.Contains(string(individualCoverageData), expectedIndividualCoverage) {
t.Errorf(
"%s: does not contain:\n\n%s\nactual content:\n\n%s",
@@ -146,8 +192,54 @@ func testLcovCoverage(t *testing.T, extraArgs ...string) {
}
}
-var expectedIndividualCoverages = []string{
+func TestLcovCoverageWithTool(t *testing.T) {
+ args := append([]string{
+ "coverage",
+ "--combined_report=lcov",
+ "//src:lib_with_tool_test",
+ })
+
+ if err := bazel_testing.RunBazel(args...); err != nil {
+ t.Fatal(err)
+ }
+
+ individualCoveragePath := filepath.FromSlash("bazel-testlogs/src/lib_with_tool_test/coverage.dat")
+ individualCoverageData, err := ioutil.ReadFile(individualCoveragePath)
+ if err != nil {
+ t.Fatal(err)
+ }
+ expectedCoverage := append(expectedGoCoverage, expectedToolCoverage)
+ for _, expected := range expectedCoverage {
+ if !strings.Contains(string(individualCoverageData), expected) {
+ t.Errorf(
+ "%s: does not contain:\n\n%s\nactual content:\n\n%s",
+ individualCoveragePath,
+ expected,
+ string(individualCoverageData),
+ )
+ }
+ }
+
+ combinedCoveragePath := filepath.FromSlash("bazel-out/_coverage/_coverage_report.dat")
+ combinedCoverageData, err := ioutil.ReadFile(combinedCoveragePath)
+ if err != nil {
+ t.Fatal(err)
+ }
+ for _, include := range []string{
+ "SF:src/lib.go\n",
+ "SF:src/other_lib.go\n",
+ "SF:src/Tool.java\n",
+ } {
+ if !strings.Contains(string(combinedCoverageData), include) {
+ t.Errorf("%s: does not contain %q\n", combinedCoverageData, include)
+ }
+ }
+}
+
+var expectedGoCoverage = []string{
`SF:src/other_lib.go
+FNF:0
+FNH:0
DA:3,1
DA:4,1
DA:5,0
@@ -158,6 +250,8 @@ LF:5
end_of_record
`,
`SF:src/lib.go
+FNF:0
+FNH:0
DA:9,1
DA:10,1
DA:11,1
@@ -171,3 +265,25 @@ LH:8
LF:9
end_of_record
`}
+
+const expectedToolCoverage = `SF:src/Tool.java
+FN:1,Tool::<init> ()V
+FN:3,Tool::main ([Ljava/lang/String;)V
+FNDA:0,Tool::<init> ()V
+FNDA:1,Tool::main ([Ljava/lang/String;)V
+FNF:2
+FNH:1
+BRDA:3,0,0,1
+BRDA:3,0,1,0
+BRF:2
+BRH:1
+DA:1,0
+DA:3,1
+DA:4,0
+DA:5,0
+DA:7,1
+DA:8,1
+LH:3
+LF:6
+end_of_record
+`
diff --git a/tests/core/coverage/lcov_test_main_coverage_test.go b/tests/core/coverage/lcov_test_main_coverage_test.go
index 3597713d..57aafd28 100644
--- a/tests/core/coverage/lcov_test_main_coverage_test.go
+++ b/tests/core/coverage/lcov_test_main_coverage_test.go
@@ -108,6 +108,8 @@ func TestLcovCoverageWithTestMain(t *testing.T) {
}
const expectedIndividualCoverage = `SF:src/lib.go
+FNF:0
+FNH:0
DA:3,1
DA:4,1
DA:5,0