xref: /aosp_15_r20/build/soong/rust/fuzz_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	"android/soong/cc"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workerfunc TestRustFuzz(t *testing.T) {
26*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
27*333d2b36SAndroid Build Coastguard Worker			rust_library {
28*333d2b36SAndroid Build Coastguard Worker				name: "libtest_fuzzing",
29*333d2b36SAndroid Build Coastguard Worker				crate_name: "test_fuzzing",
30*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.rs"],
31*333d2b36SAndroid Build Coastguard Worker			}
32*333d2b36SAndroid Build Coastguard Worker			rust_fuzz {
33*333d2b36SAndroid Build Coastguard Worker				name: "fuzz_libtest",
34*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.rs"],
35*333d2b36SAndroid Build Coastguard Worker				rustlibs: ["libtest_fuzzing"],
36*333d2b36SAndroid Build Coastguard Worker			}
37*333d2b36SAndroid Build Coastguard Worker			rust_fuzz_host {
38*333d2b36SAndroid Build Coastguard Worker				name: "host_fuzzer",
39*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.rs"],
40*333d2b36SAndroid Build Coastguard Worker			}
41*333d2b36SAndroid Build Coastguard Worker	`)
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker	// Check that appropriate dependencies are added and that the rustlib linkage is correct.
44*333d2b36SAndroid Build Coastguard Worker	fuzz_libtest_mod := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Module().(*Module)
45*333d2b36SAndroid Build Coastguard Worker	if !android.InList("liblibfuzzer_sys.rlib-std", fuzz_libtest_mod.Properties.AndroidMkRlibs) {
46*333d2b36SAndroid Build Coastguard Worker		t.Errorf("liblibfuzzer_sys rlib library dependency missing for rust_fuzz module. %#v", fuzz_libtest_mod.Properties.AndroidMkRlibs)
47*333d2b36SAndroid Build Coastguard Worker	}
48*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libtest_fuzzing.rlib-std", fuzz_libtest_mod.Properties.AndroidMkRlibs) {
49*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rustlibs not linked as rlib for rust_fuzz module.")
50*333d2b36SAndroid Build Coastguard Worker	}
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker	// Check that compiler flags are set appropriately .
53*333d2b36SAndroid Build Coastguard Worker	fuzz_libtest := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Rule("rustc")
54*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fuzz_libtest.Args["rustcFlags"], "-C passes='sancov-module'") ||
55*333d2b36SAndroid Build Coastguard Worker		!strings.Contains(fuzz_libtest.Args["rustcFlags"], "--cfg fuzzing") {
56*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_fuzz module does not contain the expected flags (sancov-module, cfg fuzzing).")
57*333d2b36SAndroid Build Coastguard Worker	}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker	// Check that host modules support fuzzing.
60*333d2b36SAndroid Build Coastguard Worker	host_fuzzer := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Rule("rustc")
61*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(host_fuzzer.Args["rustcFlags"], "-C passes='sancov-module'") ||
62*333d2b36SAndroid Build Coastguard Worker		!strings.Contains(host_fuzzer.Args["rustcFlags"], "--cfg fuzzing") {
63*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_fuzz_host module does not contain the expected flags (sancov-module, cfg fuzzing).")
64*333d2b36SAndroid Build Coastguard Worker	}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker	// Check that dependencies have 'fuzzer' variants produced for them as well.
67*333d2b36SAndroid Build Coastguard Worker	libtest_fuzzer := ctx.ModuleForTests("libtest_fuzzing", "android_arm64_armv8-a_rlib_rlib-std_fuzzer").Output("libtest_fuzzing.rlib")
68*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libtest_fuzzer.Args["rustcFlags"], "-C passes='sancov-module'") ||
69*333d2b36SAndroid Build Coastguard Worker		!strings.Contains(libtest_fuzzer.Args["rustcFlags"], "--cfg fuzzing") {
70*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_fuzz dependent library does not contain the expected flags (sancov-module, cfg fuzzing).")
71*333d2b36SAndroid Build Coastguard Worker	}
72*333d2b36SAndroid Build Coastguard Worker}
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Workerfunc TestRustFuzzDepBundling(t *testing.T) {
75*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
76*333d2b36SAndroid Build Coastguard Worker			cc_library {
77*333d2b36SAndroid Build Coastguard Worker				name: "libcc_transitive_dep",
78*333d2b36SAndroid Build Coastguard Worker			}
79*333d2b36SAndroid Build Coastguard Worker			cc_library {
80*333d2b36SAndroid Build Coastguard Worker				name: "libcc_direct_dep",
81*333d2b36SAndroid Build Coastguard Worker			}
82*333d2b36SAndroid Build Coastguard Worker			rust_library {
83*333d2b36SAndroid Build Coastguard Worker				name: "libtest_fuzzing",
84*333d2b36SAndroid Build Coastguard Worker				crate_name: "test_fuzzing",
85*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.rs"],
86*333d2b36SAndroid Build Coastguard Worker				shared_libs: ["libcc_transitive_dep"],
87*333d2b36SAndroid Build Coastguard Worker			}
88*333d2b36SAndroid Build Coastguard Worker			rust_fuzz {
89*333d2b36SAndroid Build Coastguard Worker				name: "fuzz_libtest",
90*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.rs"],
91*333d2b36SAndroid Build Coastguard Worker				rustlibs: ["libtest_fuzzing"],
92*333d2b36SAndroid Build Coastguard Worker				shared_libs: ["libcc_direct_dep"],
93*333d2b36SAndroid Build Coastguard Worker			}
94*333d2b36SAndroid Build Coastguard Worker	`)
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker	fuzz_libtest := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Module().(*Module)
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fuzz_libtest.FuzzSharedLibraries().String(), ":libcc_direct_dep.so") {
99*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_fuzz does not contain the expected bundled direct shared libs ('libcc_direct_dep'): %#v", fuzz_libtest.FuzzSharedLibraries().String())
100*333d2b36SAndroid Build Coastguard Worker	}
101*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fuzz_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") {
102*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_fuzz does not contain the expected bundled transitive shared libs ('libcc_transitive_dep'): %#v", fuzz_libtest.FuzzSharedLibraries().String())
103*333d2b36SAndroid Build Coastguard Worker	}
104*333d2b36SAndroid Build Coastguard Worker}
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Workerfunc TestCCFuzzDepBundling(t *testing.T) {
107*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
108*333d2b36SAndroid Build Coastguard Worker			cc_library {
109*333d2b36SAndroid Build Coastguard Worker				name: "libcc_transitive_dep",
110*333d2b36SAndroid Build Coastguard Worker			}
111*333d2b36SAndroid Build Coastguard Worker			rust_ffi {
112*333d2b36SAndroid Build Coastguard Worker				name: "libtest_fuzzing",
113*333d2b36SAndroid Build Coastguard Worker				crate_name: "test_fuzzing",
114*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.rs"],
115*333d2b36SAndroid Build Coastguard Worker				shared_libs: ["libcc_transitive_dep"],
116*333d2b36SAndroid Build Coastguard Worker			}
117*333d2b36SAndroid Build Coastguard Worker			rust_ffi_static {
118*333d2b36SAndroid Build Coastguard Worker				name: "libtest_fuzzing_static",
119*333d2b36SAndroid Build Coastguard Worker				crate_name: "test_fuzzing",
120*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.rs"],
121*333d2b36SAndroid Build Coastguard Worker				shared_libs: ["libcc_transitive_dep"],
122*333d2b36SAndroid Build Coastguard Worker			}
123*333d2b36SAndroid Build Coastguard Worker			cc_fuzz {
124*333d2b36SAndroid Build Coastguard Worker				name: "fuzz_shared_libtest",
125*333d2b36SAndroid Build Coastguard Worker				shared_libs: ["libtest_fuzzing"],
126*333d2b36SAndroid Build Coastguard Worker			}
127*333d2b36SAndroid Build Coastguard Worker			cc_fuzz {
128*333d2b36SAndroid Build Coastguard Worker				name: "fuzz_static_libtest",
129*333d2b36SAndroid Build Coastguard Worker				static_libs: ["libtest_fuzzing"],
130*333d2b36SAndroid Build Coastguard Worker			}
131*333d2b36SAndroid Build Coastguard Worker			cc_fuzz {
132*333d2b36SAndroid Build Coastguard Worker				name: "fuzz_staticffi_libtest",
133*333d2b36SAndroid Build Coastguard Worker				static_libs: ["libtest_fuzzing_static"],
134*333d2b36SAndroid Build Coastguard Worker			}
135*333d2b36SAndroid Build Coastguard Worker	`)
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker	fuzz_shared_libtest := ctx.ModuleForTests("fuzz_shared_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface)
138*333d2b36SAndroid Build Coastguard Worker	fuzz_static_libtest := ctx.ModuleForTests("fuzz_static_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface)
139*333d2b36SAndroid Build Coastguard Worker	fuzz_staticffi_libtest := ctx.ModuleForTests("fuzz_staticffi_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface)
140*333d2b36SAndroid Build Coastguard Worker
141*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fuzz_shared_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") {
142*333d2b36SAndroid Build Coastguard Worker		t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_shared ('libcc_transitive_dep'): %#v", fuzz_shared_libtest.FuzzSharedLibraries().String())
143*333d2b36SAndroid Build Coastguard Worker	}
144*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fuzz_static_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") {
145*333d2b36SAndroid Build Coastguard Worker		t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_static ('libcc_transitive_dep'): %#v", fuzz_static_libtest.FuzzSharedLibraries().String())
146*333d2b36SAndroid Build Coastguard Worker	}
147*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fuzz_staticffi_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") {
148*333d2b36SAndroid Build Coastguard Worker		t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_rlib ('libcc_transitive_dep'): %#v", fuzz_staticffi_libtest.FuzzSharedLibraries().String())
149*333d2b36SAndroid Build Coastguard Worker	}
150*333d2b36SAndroid Build Coastguard Worker}
151