xref: /aosp_15_r20/build/soong/rust/coverage_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage rust
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker	"testing"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker// Test that coverage flags are being correctly generated.
25*333d2b36SAndroid Build Coastguard Workerfunc TestCoverageFlags(t *testing.T) {
26*333d2b36SAndroid Build Coastguard Worker	ctx := testRustCov(t, `
27*333d2b36SAndroid Build Coastguard Worker		rust_library {
28*333d2b36SAndroid Build Coastguard Worker			name: "libfoo_cov",
29*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
30*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
31*333d2b36SAndroid Build Coastguard Worker		}
32*333d2b36SAndroid Build Coastguard Worker		rust_binary {
33*333d2b36SAndroid Build Coastguard Worker			name: "fizz_cov",
34*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
35*333d2b36SAndroid Build Coastguard Worker		}
36*333d2b36SAndroid Build Coastguard Worker        rust_binary {
37*333d2b36SAndroid Build Coastguard Worker			name: "buzzNoCov",
38*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
39*333d2b36SAndroid Build Coastguard Worker			native_coverage: false,
40*333d2b36SAndroid Build Coastguard Worker		}
41*333d2b36SAndroid Build Coastguard Worker		rust_library {
42*333d2b36SAndroid Build Coastguard Worker			name: "libbar_nocov",
43*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
44*333d2b36SAndroid Build Coastguard Worker			crate_name: "bar",
45*333d2b36SAndroid Build Coastguard Worker			native_coverage: false,
46*333d2b36SAndroid Build Coastguard Worker		}`)
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	// Make sure native_coverage: false isn't creating a coverage variant.
49*333d2b36SAndroid Build Coastguard Worker	if android.InList("android_arm64_armv8-a_dylib_cov", ctx.ModuleVariantsForTests("libbar_nocov")) {
50*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("coverage variant created for module 'libbar_nocov' with native coverage disabled")
51*333d2b36SAndroid Build Coastguard Worker	}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker	// Just test the dylib variants unless the library coverage logic changes to distinguish between the types.
54*333d2b36SAndroid Build Coastguard Worker	libfooCov := ctx.ModuleForTests("libfoo_cov", "android_arm64_armv8-a_dylib_cov").Rule("rustc")
55*333d2b36SAndroid Build Coastguard Worker	libbarNoCov := ctx.ModuleForTests("libbar_nocov", "android_arm64_armv8-a_dylib").Rule("rustc")
56*333d2b36SAndroid Build Coastguard Worker	fizzCov := ctx.ModuleForTests("fizz_cov", "android_arm64_armv8-a_cov").Rule("rustc")
57*333d2b36SAndroid Build Coastguard Worker	buzzNoCov := ctx.ModuleForTests("buzzNoCov", "android_arm64_armv8-a").Rule("rustc")
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker	rustcCoverageFlags := []string{"-C instrument-coverage", " -g "}
60*333d2b36SAndroid Build Coastguard Worker	for _, flag := range rustcCoverageFlags {
61*333d2b36SAndroid Build Coastguard Worker		missingErrorStr := "missing rustc flag '%s' for '%s' module with coverage enabled; rustcFlags: %#v"
62*333d2b36SAndroid Build Coastguard Worker		containsErrorStr := "contains rustc flag '%s' for '%s' module with coverage disabled; rustcFlags: %#v"
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(fizzCov.Args["rustcFlags"], flag) {
65*333d2b36SAndroid Build Coastguard Worker			t.Fatalf(missingErrorStr, flag, "fizz_cov", fizzCov.Args["rustcFlags"])
66*333d2b36SAndroid Build Coastguard Worker		}
67*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(libfooCov.Args["rustcFlags"], flag) {
68*333d2b36SAndroid Build Coastguard Worker			t.Fatalf(missingErrorStr, flag, "libfoo_cov dylib", libfooCov.Args["rustcFlags"])
69*333d2b36SAndroid Build Coastguard Worker		}
70*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(buzzNoCov.Args["rustcFlags"], flag) {
71*333d2b36SAndroid Build Coastguard Worker			t.Fatalf(containsErrorStr, flag, "buzzNoCov", buzzNoCov.Args["rustcFlags"])
72*333d2b36SAndroid Build Coastguard Worker		}
73*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(libbarNoCov.Args["rustcFlags"], flag) {
74*333d2b36SAndroid Build Coastguard Worker			t.Fatalf(containsErrorStr, flag, "libbar_cov", libbarNoCov.Args["rustcFlags"])
75*333d2b36SAndroid Build Coastguard Worker		}
76*333d2b36SAndroid Build Coastguard Worker	}
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker	linkCoverageFlags := []string{"-fprofile-instr-generate=/data/misc/trace/clang-%p-%m.profraw", " -g "}
79*333d2b36SAndroid Build Coastguard Worker	for _, flag := range linkCoverageFlags {
80*333d2b36SAndroid Build Coastguard Worker		missingErrorStr := "missing rust linker flag '%s' for '%s' module with coverage enabled; rustcFlags: %#v"
81*333d2b36SAndroid Build Coastguard Worker		containsErrorStr := "contains rust linker flag '%s' for '%s' module with coverage disabled; rustcFlags: %#v"
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(fizzCov.Args["linkFlags"], flag) {
84*333d2b36SAndroid Build Coastguard Worker			t.Fatalf(missingErrorStr, flag, "fizz_cov", fizzCov.Args["linkFlags"])
85*333d2b36SAndroid Build Coastguard Worker		}
86*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(libfooCov.Args["linkFlags"], flag) {
87*333d2b36SAndroid Build Coastguard Worker			t.Fatalf(missingErrorStr, flag, "libfoo_cov dylib", libfooCov.Args["linkFlags"])
88*333d2b36SAndroid Build Coastguard Worker		}
89*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(buzzNoCov.Args["linkFlags"], flag) {
90*333d2b36SAndroid Build Coastguard Worker			t.Fatalf(containsErrorStr, flag, "buzzNoCov", buzzNoCov.Args["linkFlags"])
91*333d2b36SAndroid Build Coastguard Worker		}
92*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(libbarNoCov.Args["linkFlags"], flag) {
93*333d2b36SAndroid Build Coastguard Worker			t.Fatalf(containsErrorStr, flag, "libbar_cov", libbarNoCov.Args["linkFlags"])
94*333d2b36SAndroid Build Coastguard Worker		}
95*333d2b36SAndroid Build Coastguard Worker	}
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Workerfunc TestCoverageDeps(t *testing.T) {
100*333d2b36SAndroid Build Coastguard Worker	ctx := testRustCov(t, `
101*333d2b36SAndroid Build Coastguard Worker		rust_binary {
102*333d2b36SAndroid Build Coastguard Worker			name: "fizz",
103*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
104*333d2b36SAndroid Build Coastguard Worker		}`)
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker	fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a_cov").Rule("rustc")
107*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fizz.Args["linkFlags"], "libprofile-clang-extras.a") {
108*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("missing expected coverage 'libprofile-clang-extras' dependency in linkFlags: %#v", fizz.Args["linkFlags"])
109*333d2b36SAndroid Build Coastguard Worker	}
110*333d2b36SAndroid Build Coastguard Worker}
111