xref: /aosp_15_r20/build/soong/rust/rust_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 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	"os"
19*333d2b36SAndroid Build Coastguard Worker	"runtime"
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker	"testing"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
26*333d2b36SAndroid Build Coastguard Worker	"android/soong/genrule"
27*333d2b36SAndroid Build Coastguard Worker)
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) {
30*333d2b36SAndroid Build Coastguard Worker	os.Exit(m.Run())
31*333d2b36SAndroid Build Coastguard Worker}
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Workervar prepareForRustTest = android.GroupFixturePreparers(
34*333d2b36SAndroid Build Coastguard Worker	android.PrepareForTestWithArchMutator,
35*333d2b36SAndroid Build Coastguard Worker	android.PrepareForTestWithDefaults,
36*333d2b36SAndroid Build Coastguard Worker	android.PrepareForTestWithPrebuilts,
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	genrule.PrepareForTestWithGenRuleBuildComponents,
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Worker	PrepareForIntegrationTestWithRust,
41*333d2b36SAndroid Build Coastguard Worker)
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Workervar rustMockedFiles = android.MockFS{
44*333d2b36SAndroid Build Coastguard Worker	"foo.rs":                       nil,
45*333d2b36SAndroid Build Coastguard Worker	"foo.c":                        nil,
46*333d2b36SAndroid Build Coastguard Worker	"src/bar.rs":                   nil,
47*333d2b36SAndroid Build Coastguard Worker	"src/any.h":                    nil,
48*333d2b36SAndroid Build Coastguard Worker	"c_includes/c_header.h":        nil,
49*333d2b36SAndroid Build Coastguard Worker	"rust_includes/rust_headers.h": nil,
50*333d2b36SAndroid Build Coastguard Worker	"proto.proto":                  nil,
51*333d2b36SAndroid Build Coastguard Worker	"proto/buf.proto":              nil,
52*333d2b36SAndroid Build Coastguard Worker	"buf.proto":                    nil,
53*333d2b36SAndroid Build Coastguard Worker	"foo.proto":                    nil,
54*333d2b36SAndroid Build Coastguard Worker	"liby.so":                      nil,
55*333d2b36SAndroid Build Coastguard Worker	"libz.so":                      nil,
56*333d2b36SAndroid Build Coastguard Worker	"data.txt":                     nil,
57*333d2b36SAndroid Build Coastguard Worker	"liblog.map.txt":               nil,
58*333d2b36SAndroid Build Coastguard Worker}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Worker// testRust returns a TestContext in which a basic environment has been setup.
61*333d2b36SAndroid Build Coastguard Worker// This environment contains a few mocked files. See rustMockedFiles for the list of these files.
62*333d2b36SAndroid Build Coastguard Workerfunc testRust(t *testing.T, bp string) *android.TestContext {
63*333d2b36SAndroid Build Coastguard Worker	t.Helper()
64*333d2b36SAndroid Build Coastguard Worker	skipTestIfOsNotSupported(t)
65*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
66*333d2b36SAndroid Build Coastguard Worker		prepareForRustTest,
67*333d2b36SAndroid Build Coastguard Worker		rustMockedFiles.AddToFixture(),
68*333d2b36SAndroid Build Coastguard Worker	).
69*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
70*333d2b36SAndroid Build Coastguard Worker	return result.TestContext
71*333d2b36SAndroid Build Coastguard Worker}
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Workerconst (
74*333d2b36SAndroid Build Coastguard Worker	sharedVendorVariant        = "android_vendor_arm64_armv8-a_shared"
75*333d2b36SAndroid Build Coastguard Worker	rlibVendorVariant          = "android_vendor_arm64_armv8-a_rlib_rlib-std"
76*333d2b36SAndroid Build Coastguard Worker	rlibDylibStdVendorVariant  = "android_vendor_arm64_armv8-a_rlib_rlib-std"
77*333d2b36SAndroid Build Coastguard Worker	dylibVendorVariant         = "android_vendor_arm64_armv8-a_dylib"
78*333d2b36SAndroid Build Coastguard Worker	sharedRecoveryVariant      = "android_recovery_arm64_armv8-a_shared"
79*333d2b36SAndroid Build Coastguard Worker	rlibRecoveryVariant        = "android_recovery_arm64_armv8-a_rlib_dylib-std"
80*333d2b36SAndroid Build Coastguard Worker	rlibRlibStdRecoveryVariant = "android_recovery_arm64_armv8-a_rlib_rlib-std"
81*333d2b36SAndroid Build Coastguard Worker	dylibRecoveryVariant       = "android_recovery_arm64_armv8-a_dylib"
82*333d2b36SAndroid Build Coastguard Worker	binaryCoreVariant          = "android_arm64_armv8-a"
83*333d2b36SAndroid Build Coastguard Worker	binaryVendorVariant        = "android_vendor_arm64_armv8-a"
84*333d2b36SAndroid Build Coastguard Worker	binaryProductVariant       = "android_product_arm64_armv8-a"
85*333d2b36SAndroid Build Coastguard Worker	binaryRecoveryVariant      = "android_recovery_arm64_armv8-a"
86*333d2b36SAndroid Build Coastguard Worker)
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Worker// testRustCov returns a TestContext in which a basic environment has been
89*333d2b36SAndroid Build Coastguard Worker// setup. This environment explicitly enables coverage.
90*333d2b36SAndroid Build Coastguard Workerfunc testRustCov(t *testing.T, bp string) *android.TestContext {
91*333d2b36SAndroid Build Coastguard Worker	skipTestIfOsNotSupported(t)
92*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
93*333d2b36SAndroid Build Coastguard Worker		prepareForRustTest,
94*333d2b36SAndroid Build Coastguard Worker		rustMockedFiles.AddToFixture(),
95*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(
96*333d2b36SAndroid Build Coastguard Worker			func(variables android.FixtureProductVariables) {
97*333d2b36SAndroid Build Coastguard Worker				variables.ClangCoverage = proptools.BoolPtr(true)
98*333d2b36SAndroid Build Coastguard Worker				variables.Native_coverage = proptools.BoolPtr(true)
99*333d2b36SAndroid Build Coastguard Worker				variables.NativeCoveragePaths = []string{"*"}
100*333d2b36SAndroid Build Coastguard Worker			},
101*333d2b36SAndroid Build Coastguard Worker		),
102*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
103*333d2b36SAndroid Build Coastguard Worker	return result.TestContext
104*333d2b36SAndroid Build Coastguard Worker}
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker// testRustError ensures that at least one error was raised and its value
107*333d2b36SAndroid Build Coastguard Worker// matches the pattern provided. The error can be either in the parsing of the
108*333d2b36SAndroid Build Coastguard Worker// Blueprint or when generating the build actions.
109*333d2b36SAndroid Build Coastguard Workerfunc testRustError(t *testing.T, pattern string, bp string) {
110*333d2b36SAndroid Build Coastguard Worker	skipTestIfOsNotSupported(t)
111*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
112*333d2b36SAndroid Build Coastguard Worker		prepareForRustTest,
113*333d2b36SAndroid Build Coastguard Worker		rustMockedFiles.AddToFixture(),
114*333d2b36SAndroid Build Coastguard Worker	).
115*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
116*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
117*333d2b36SAndroid Build Coastguard Worker}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker// testRustCtx is used to build a particular test environment. Unless your
120*333d2b36SAndroid Build Coastguard Worker// tests requires a specific setup, prefer the wrapping functions: testRust,
121*333d2b36SAndroid Build Coastguard Worker// testRustCov or testRustError.
122*333d2b36SAndroid Build Coastguard Workertype testRustCtx struct {
123*333d2b36SAndroid Build Coastguard Worker	bp     string
124*333d2b36SAndroid Build Coastguard Worker	fs     map[string][]byte
125*333d2b36SAndroid Build Coastguard Worker	env    map[string]string
126*333d2b36SAndroid Build Coastguard Worker	config *android.Config
127*333d2b36SAndroid Build Coastguard Worker}
128*333d2b36SAndroid Build Coastguard Worker
129*333d2b36SAndroid Build Coastguard Workerfunc skipTestIfOsNotSupported(t *testing.T) {
130*333d2b36SAndroid Build Coastguard Worker	// TODO (b/140435149)
131*333d2b36SAndroid Build Coastguard Worker	if runtime.GOOS != "linux" {
132*333d2b36SAndroid Build Coastguard Worker		t.Skip("Rust Soong tests can only be run on Linux hosts currently")
133*333d2b36SAndroid Build Coastguard Worker	}
134*333d2b36SAndroid Build Coastguard Worker}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker// Test that we can extract the link path from a lib path.
137*333d2b36SAndroid Build Coastguard Workerfunc TestLinkPathFromFilePath(t *testing.T) {
138*333d2b36SAndroid Build Coastguard Worker	barPath := android.PathForTesting("out/soong/.intermediates/external/libbar/libbar/linux_glibc_x86_64_shared/libbar.so")
139*333d2b36SAndroid Build Coastguard Worker	libName := linkPathFromFilePath(barPath)
140*333d2b36SAndroid Build Coastguard Worker	expectedResult := "out/soong/.intermediates/external/libbar/libbar/linux_glibc_x86_64_shared/"
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Worker	if libName != expectedResult {
143*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libNameFromFilePath returned the wrong name; expected '%#v', got '%#v'", expectedResult, libName)
144*333d2b36SAndroid Build Coastguard Worker	}
145*333d2b36SAndroid Build Coastguard Worker}
146*333d2b36SAndroid Build Coastguard Worker
147*333d2b36SAndroid Build Coastguard Worker// Test to make sure dependencies are being picked up correctly.
148*333d2b36SAndroid Build Coastguard Workerfunc TestDepsTracking(t *testing.T) {
149*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
150*333d2b36SAndroid Build Coastguard Worker		cc_library {
151*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
152*333d2b36SAndroid Build Coastguard Worker			name: "cc_stubs_dep",
153*333d2b36SAndroid Build Coastguard Worker		}
154*333d2b36SAndroid Build Coastguard Worker		cc_library_host_static {
155*333d2b36SAndroid Build Coastguard Worker			name: "libstatic",
156*333d2b36SAndroid Build Coastguard Worker		}
157*333d2b36SAndroid Build Coastguard Worker		cc_library_host_static {
158*333d2b36SAndroid Build Coastguard Worker			name: "libwholestatic",
159*333d2b36SAndroid Build Coastguard Worker		}
160*333d2b36SAndroid Build Coastguard Worker		rust_ffi_host_shared {
161*333d2b36SAndroid Build Coastguard Worker			name: "libshared",
162*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
163*333d2b36SAndroid Build Coastguard Worker			crate_name: "shared",
164*333d2b36SAndroid Build Coastguard Worker		}
165*333d2b36SAndroid Build Coastguard Worker		rust_library_host_rlib {
166*333d2b36SAndroid Build Coastguard Worker			name: "librlib",
167*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
168*333d2b36SAndroid Build Coastguard Worker			crate_name: "rlib",
169*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libstatic"],
170*333d2b36SAndroid Build Coastguard Worker			whole_static_libs: ["libwholestatic"],
171*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["cc_stubs_dep"],
172*333d2b36SAndroid Build Coastguard Worker		}
173*333d2b36SAndroid Build Coastguard Worker		rust_proc_macro {
174*333d2b36SAndroid Build Coastguard Worker			name: "libpm",
175*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
176*333d2b36SAndroid Build Coastguard Worker			crate_name: "pm",
177*333d2b36SAndroid Build Coastguard Worker		}
178*333d2b36SAndroid Build Coastguard Worker		rust_binary_host {
179*333d2b36SAndroid Build Coastguard Worker			name: "fizz-buzz",
180*333d2b36SAndroid Build Coastguard Worker			rlibs: ["librlib"],
181*333d2b36SAndroid Build Coastguard Worker			proc_macros: ["libpm"],
182*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libstatic"],
183*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libshared"],
184*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
185*333d2b36SAndroid Build Coastguard Worker		}
186*333d2b36SAndroid Build Coastguard Worker	`)
187*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("fizz-buzz", "linux_glibc_x86_64").Module().(*Module)
188*333d2b36SAndroid Build Coastguard Worker	rustc := ctx.ModuleForTests("librlib", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc")
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker	// Since dependencies are added to AndroidMk* properties, we can check these to see if they've been picked up.
191*333d2b36SAndroid Build Coastguard Worker	if !android.InList("librlib.rlib-std", module.Properties.AndroidMkRlibs) {
192*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Rlib dependency not detected (dependency missing from AndroidMkRlibs)")
193*333d2b36SAndroid Build Coastguard Worker	}
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libpm", module.Properties.AndroidMkProcMacroLibs) {
196*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Proc_macro dependency not detected (dependency missing from AndroidMkProcMacroLibs)")
197*333d2b36SAndroid Build Coastguard Worker	}
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libshared", module.transitiveAndroidMkSharedLibs.ToList()) {
200*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Shared library dependency not detected (dependency missing from AndroidMkSharedLibs)")
201*333d2b36SAndroid Build Coastguard Worker	}
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libstatic", module.Properties.AndroidMkStaticLibs) {
204*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Static library dependency not detected (dependency missing from AndroidMkStaticLibs)")
205*333d2b36SAndroid Build Coastguard Worker	}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(rustc.Args["rustcFlags"], "-lstatic=wholestatic") {
208*333d2b36SAndroid Build Coastguard Worker		t.Errorf("-lstatic flag not being passed to rustc for static library %#v", rustc.Args["rustcFlags"])
209*333d2b36SAndroid Build Coastguard Worker	}
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(rustc.Args["linkFlags"], "cc_stubs_dep.so") {
212*333d2b36SAndroid Build Coastguard Worker		t.Errorf("shared cc_library not being passed to rustc linkFlags %#v", rustc.Args["linkFlags"])
213*333d2b36SAndroid Build Coastguard Worker	}
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(rustc.OrderOnly.Strings(), "cc_stubs_dep.so") {
216*333d2b36SAndroid Build Coastguard Worker		t.Errorf("shared cc dep not being passed as order-only to rustc %#v", rustc.OrderOnly.Strings())
217*333d2b36SAndroid Build Coastguard Worker	}
218*333d2b36SAndroid Build Coastguard Worker
219*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(rustc.Implicits.Strings(), "cc_stubs_dep.so.toc") {
220*333d2b36SAndroid Build Coastguard Worker		t.Errorf("shared cc dep TOC not being passed as implicit to rustc %#v", rustc.Implicits.Strings())
221*333d2b36SAndroid Build Coastguard Worker	}
222*333d2b36SAndroid Build Coastguard Worker}
223*333d2b36SAndroid Build Coastguard Worker
224*333d2b36SAndroid Build Coastguard Workerfunc TestSourceProviderDeps(t *testing.T) {
225*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
226*333d2b36SAndroid Build Coastguard Worker		rust_binary {
227*333d2b36SAndroid Build Coastguard Worker			name: "fizz-buzz-dep",
228*333d2b36SAndroid Build Coastguard Worker			srcs: [
229*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
230*333d2b36SAndroid Build Coastguard Worker				":my_generator",
231*333d2b36SAndroid Build Coastguard Worker				":libbindings",
232*333d2b36SAndroid Build Coastguard Worker			],
233*333d2b36SAndroid Build Coastguard Worker			rlibs: ["libbindings"],
234*333d2b36SAndroid Build Coastguard Worker		}
235*333d2b36SAndroid Build Coastguard Worker		rust_proc_macro {
236*333d2b36SAndroid Build Coastguard Worker			name: "libprocmacro",
237*333d2b36SAndroid Build Coastguard Worker			srcs: [
238*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
239*333d2b36SAndroid Build Coastguard Worker				":my_generator",
240*333d2b36SAndroid Build Coastguard Worker				":libbindings",
241*333d2b36SAndroid Build Coastguard Worker			],
242*333d2b36SAndroid Build Coastguard Worker			rlibs: ["libbindings"],
243*333d2b36SAndroid Build Coastguard Worker			crate_name: "procmacro",
244*333d2b36SAndroid Build Coastguard Worker		}
245*333d2b36SAndroid Build Coastguard Worker		rust_library {
246*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
247*333d2b36SAndroid Build Coastguard Worker			srcs: [
248*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
249*333d2b36SAndroid Build Coastguard Worker				":my_generator",
250*333d2b36SAndroid Build Coastguard Worker				":libbindings",
251*333d2b36SAndroid Build Coastguard Worker			],
252*333d2b36SAndroid Build Coastguard Worker			rlibs: ["libbindings"],
253*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
254*333d2b36SAndroid Build Coastguard Worker		}
255*333d2b36SAndroid Build Coastguard Worker		genrule {
256*333d2b36SAndroid Build Coastguard Worker			name: "my_generator",
257*333d2b36SAndroid Build Coastguard Worker			tools: ["any_rust_binary"],
258*333d2b36SAndroid Build Coastguard Worker			cmd: "$(location) -o $(out) $(in)",
259*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/any.h"],
260*333d2b36SAndroid Build Coastguard Worker			out: ["src/any.rs"],
261*333d2b36SAndroid Build Coastguard Worker		}
262*333d2b36SAndroid Build Coastguard Worker		rust_binary_host {
263*333d2b36SAndroid Build Coastguard Worker			name: "any_rust_binary",
264*333d2b36SAndroid Build Coastguard Worker			srcs: [
265*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
266*333d2b36SAndroid Build Coastguard Worker			],
267*333d2b36SAndroid Build Coastguard Worker		}
268*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
269*333d2b36SAndroid Build Coastguard Worker			name: "libbindings",
270*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindings",
271*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
272*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
273*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
274*333d2b36SAndroid Build Coastguard Worker		}
275*333d2b36SAndroid Build Coastguard Worker	`)
276*333d2b36SAndroid Build Coastguard Worker
277*333d2b36SAndroid Build Coastguard Worker	libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std").Rule("rustc")
278*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(libfoo.Implicits.Strings(), "/out/bindings.rs") {
279*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_bindgen generated source not included as implicit input for libfoo; Implicits %#v", libfoo.Implicits.Strings())
280*333d2b36SAndroid Build Coastguard Worker	}
281*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(libfoo.Implicits.Strings(), "/out/any.rs") {
282*333d2b36SAndroid Build Coastguard Worker		t.Errorf("genrule generated source not included as implicit input for libfoo; Implicits %#v", libfoo.Implicits.Strings())
283*333d2b36SAndroid Build Coastguard Worker	}
284*333d2b36SAndroid Build Coastguard Worker
285*333d2b36SAndroid Build Coastguard Worker	fizzBuzz := ctx.ModuleForTests("fizz-buzz-dep", "android_arm64_armv8-a").Rule("rustc")
286*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(fizzBuzz.Implicits.Strings(), "/out/bindings.rs") {
287*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_bindgen generated source not included as implicit input for fizz-buzz-dep; Implicits %#v", libfoo.Implicits.Strings())
288*333d2b36SAndroid Build Coastguard Worker	}
289*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(fizzBuzz.Implicits.Strings(), "/out/any.rs") {
290*333d2b36SAndroid Build Coastguard Worker		t.Errorf("genrule generated source not included as implicit input for fizz-buzz-dep; Implicits %#v", libfoo.Implicits.Strings())
291*333d2b36SAndroid Build Coastguard Worker	}
292*333d2b36SAndroid Build Coastguard Worker
293*333d2b36SAndroid Build Coastguard Worker	libprocmacro := ctx.ModuleForTests("libprocmacro", "linux_glibc_x86_64").Rule("rustc")
294*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(libprocmacro.Implicits.Strings(), "/out/bindings.rs") {
295*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rust_bindgen generated source not included as implicit input for libprocmacro; Implicits %#v", libfoo.Implicits.Strings())
296*333d2b36SAndroid Build Coastguard Worker	}
297*333d2b36SAndroid Build Coastguard Worker	if !android.SuffixInList(libprocmacro.Implicits.Strings(), "/out/any.rs") {
298*333d2b36SAndroid Build Coastguard Worker		t.Errorf("genrule generated source not included as implicit input for libprocmacro; Implicits %#v", libfoo.Implicits.Strings())
299*333d2b36SAndroid Build Coastguard Worker	}
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker	// Check that our bindings are picked up as crate dependencies as well
302*333d2b36SAndroid Build Coastguard Worker	libfooMod := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").Module().(*Module)
303*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libbindings", libfooMod.Properties.AndroidMkRlibs) {
304*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)")
305*333d2b36SAndroid Build Coastguard Worker	}
306*333d2b36SAndroid Build Coastguard Worker	fizzBuzzMod := ctx.ModuleForTests("fizz-buzz-dep", "android_arm64_armv8-a").Module().(*Module)
307*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libbindings", fizzBuzzMod.Properties.AndroidMkRlibs) {
308*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)")
309*333d2b36SAndroid Build Coastguard Worker	}
310*333d2b36SAndroid Build Coastguard Worker	libprocmacroMod := ctx.ModuleForTests("libprocmacro", "linux_glibc_x86_64").Module().(*Module)
311*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libbindings.rlib-std", libprocmacroMod.Properties.AndroidMkRlibs) {
312*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)")
313*333d2b36SAndroid Build Coastguard Worker	}
314*333d2b36SAndroid Build Coastguard Worker}
315*333d2b36SAndroid Build Coastguard Worker
316*333d2b36SAndroid Build Coastguard Workerfunc TestSourceProviderTargetMismatch(t *testing.T) {
317*333d2b36SAndroid Build Coastguard Worker	// This might error while building the dependency tree or when calling depsToPaths() depending on the lunched
318*333d2b36SAndroid Build Coastguard Worker	// target, which results in two different errors. So don't check the error, just confirm there is one.
319*333d2b36SAndroid Build Coastguard Worker	testRustError(t, ".*", `
320*333d2b36SAndroid Build Coastguard Worker		rust_proc_macro {
321*333d2b36SAndroid Build Coastguard Worker			name: "libprocmacro",
322*333d2b36SAndroid Build Coastguard Worker			srcs: [
323*333d2b36SAndroid Build Coastguard Worker				"foo.rs",
324*333d2b36SAndroid Build Coastguard Worker				":libbindings",
325*333d2b36SAndroid Build Coastguard Worker			],
326*333d2b36SAndroid Build Coastguard Worker			crate_name: "procmacro",
327*333d2b36SAndroid Build Coastguard Worker		}
328*333d2b36SAndroid Build Coastguard Worker		rust_bindgen {
329*333d2b36SAndroid Build Coastguard Worker			name: "libbindings",
330*333d2b36SAndroid Build Coastguard Worker			crate_name: "bindings",
331*333d2b36SAndroid Build Coastguard Worker			source_stem: "bindings",
332*333d2b36SAndroid Build Coastguard Worker			wrapper_src: "src/any.h",
333*333d2b36SAndroid Build Coastguard Worker		}
334*333d2b36SAndroid Build Coastguard Worker	`)
335*333d2b36SAndroid Build Coastguard Worker}
336*333d2b36SAndroid Build Coastguard Worker
337*333d2b36SAndroid Build Coastguard Worker// Test to make sure proc_macros use host variants when building device modules.
338*333d2b36SAndroid Build Coastguard Workerfunc TestProcMacroDeviceDeps(t *testing.T) {
339*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
340*333d2b36SAndroid Build Coastguard Worker		rust_library_host_rlib {
341*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
342*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
343*333d2b36SAndroid Build Coastguard Worker			crate_name: "bar",
344*333d2b36SAndroid Build Coastguard Worker		}
345*333d2b36SAndroid Build Coastguard Worker		rust_proc_macro {
346*333d2b36SAndroid Build Coastguard Worker			name: "libpm",
347*333d2b36SAndroid Build Coastguard Worker			rlibs: ["libbar"],
348*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
349*333d2b36SAndroid Build Coastguard Worker			crate_name: "pm",
350*333d2b36SAndroid Build Coastguard Worker		}
351*333d2b36SAndroid Build Coastguard Worker		rust_binary {
352*333d2b36SAndroid Build Coastguard Worker			name: "fizz-buzz",
353*333d2b36SAndroid Build Coastguard Worker			proc_macros: ["libpm"],
354*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
355*333d2b36SAndroid Build Coastguard Worker		}
356*333d2b36SAndroid Build Coastguard Worker	`)
357*333d2b36SAndroid Build Coastguard Worker	rustc := ctx.ModuleForTests("libpm", "linux_glibc_x86_64").Rule("rustc")
358*333d2b36SAndroid Build Coastguard Worker
359*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(rustc.Args["libFlags"], "libbar/linux_glibc_x86_64") {
360*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Proc_macro is not using host variant of dependent modules.")
361*333d2b36SAndroid Build Coastguard Worker	}
362*333d2b36SAndroid Build Coastguard Worker}
363*333d2b36SAndroid Build Coastguard Worker
364*333d2b36SAndroid Build Coastguard Worker// Test that no_stdlibs suppresses dependencies on rust standard libraries
365*333d2b36SAndroid Build Coastguard Workerfunc TestNoStdlibs(t *testing.T) {
366*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
367*333d2b36SAndroid Build Coastguard Worker		rust_binary {
368*333d2b36SAndroid Build Coastguard Worker			name: "fizz-buzz",
369*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
370*333d2b36SAndroid Build Coastguard Worker			no_stdlibs: true,
371*333d2b36SAndroid Build Coastguard Worker		}`)
372*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("fizz-buzz", "android_arm64_armv8-a").Module().(*Module)
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Worker	if android.InList("libstd", module.Properties.AndroidMkDylibs) {
375*333d2b36SAndroid Build Coastguard Worker		t.Errorf("no_stdlibs did not suppress dependency on libstd")
376*333d2b36SAndroid Build Coastguard Worker	}
377*333d2b36SAndroid Build Coastguard Worker}
378*333d2b36SAndroid Build Coastguard Worker
379*333d2b36SAndroid Build Coastguard Worker// Test that libraries provide both 32-bit and 64-bit variants.
380*333d2b36SAndroid Build Coastguard Workerfunc TestMultilib(t *testing.T) {
381*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
382*333d2b36SAndroid Build Coastguard Worker		rust_library_rlib {
383*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
384*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
385*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
386*333d2b36SAndroid Build Coastguard Worker		}`)
387*333d2b36SAndroid Build Coastguard Worker
388*333d2b36SAndroid Build Coastguard Worker	_ = ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std")
389*333d2b36SAndroid Build Coastguard Worker	_ = ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_rlib_dylib-std")
390*333d2b36SAndroid Build Coastguard Worker}
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Worker// Test that library size measurements are generated.
393*333d2b36SAndroid Build Coastguard Workerfunc TestLibrarySizes(t *testing.T) {
394*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
395*333d2b36SAndroid Build Coastguard Worker		rust_library_dylib {
396*333d2b36SAndroid Build Coastguard Worker			name: "libwaldo",
397*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
398*333d2b36SAndroid Build Coastguard Worker			crate_name: "waldo",
399*333d2b36SAndroid Build Coastguard Worker		}`)
400*333d2b36SAndroid Build Coastguard Worker
401*333d2b36SAndroid Build Coastguard Worker	m := ctx.SingletonForTests("file_metrics")
402*333d2b36SAndroid Build Coastguard Worker	m.Output("unstripped/libwaldo.dylib.so.bloaty.csv")
403*333d2b36SAndroid Build Coastguard Worker	m.Output("libwaldo.dylib.so.bloaty.csv")
404*333d2b36SAndroid Build Coastguard Worker}
405*333d2b36SAndroid Build Coastguard Worker
406*333d2b36SAndroid Build Coastguard Worker// Test that aliases are respected.
407*333d2b36SAndroid Build Coastguard Workerfunc TestRustAliases(t *testing.T) {
408*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
409*333d2b36SAndroid Build Coastguard Worker		rust_library {
410*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
411*333d2b36SAndroid Build Coastguard Worker			crate_name: "bar",
412*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
413*333d2b36SAndroid Build Coastguard Worker		}
414*333d2b36SAndroid Build Coastguard Worker		rust_library {
415*333d2b36SAndroid Build Coastguard Worker			name: "libbaz",
416*333d2b36SAndroid Build Coastguard Worker			crate_name: "baz",
417*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
418*333d2b36SAndroid Build Coastguard Worker		}
419*333d2b36SAndroid Build Coastguard Worker		rust_binary {
420*333d2b36SAndroid Build Coastguard Worker			name: "foo",
421*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/main.rs"],
422*333d2b36SAndroid Build Coastguard Worker			rustlibs: ["libbar", "libbaz"],
423*333d2b36SAndroid Build Coastguard Worker			aliases: ["bar:bar_renamed"],
424*333d2b36SAndroid Build Coastguard Worker		}`)
425*333d2b36SAndroid Build Coastguard Worker
426*333d2b36SAndroid Build Coastguard Worker	fooRustc := ctx.ModuleForTests("foo", "android_arm64_armv8-a").Rule("rustc")
427*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fooRustc.Args["libFlags"], "--extern bar_renamed=out/soong/.intermediates/libbar/android_arm64_armv8-a_dylib/unstripped/libbar.dylib.so") {
428*333d2b36SAndroid Build Coastguard Worker		t.Errorf("--extern bar_renamed=out/soong/.intermediates/libbar/android_arm64_armv8-a_dylib/unstripped/libbar.dylib.so flag not being passed to rustc for rust_binary with aliases. libFlags: %#v", fooRustc.Args["libFlags"])
429*333d2b36SAndroid Build Coastguard Worker	}
430*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(fooRustc.Args["libFlags"], "--extern baz=out/soong/.intermediates/libbaz/android_arm64_armv8-a_dylib/unstripped/libbaz.dylib.so") {
431*333d2b36SAndroid Build Coastguard Worker		t.Errorf("--extern baz=out/soong/.intermediates/libbaz/android_arm64_armv8-a_dylib/unstripped/libbaz.dylib.so flag not being passed to rustc for rust_binary with aliases. libFlags: %#v", fooRustc.Args["libFlags"])
432*333d2b36SAndroid Build Coastguard Worker	}
433*333d2b36SAndroid Build Coastguard Worker}
434*333d2b36SAndroid Build Coastguard Worker
435*333d2b36SAndroid Build Coastguard Workerfunc TestRustRlibs(t *testing.T) {
436*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
437*333d2b36SAndroid Build Coastguard Worker		rust_ffi_rlib {
438*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
439*333d2b36SAndroid Build Coastguard Worker			crate_name: "bar",
440*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
441*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["bar_includes"]
442*333d2b36SAndroid Build Coastguard Worker		}
443*333d2b36SAndroid Build Coastguard Worker
444*333d2b36SAndroid Build Coastguard Worker		rust_ffi_rlib {
445*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
446*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
447*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
448*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["foo_includes"]
449*333d2b36SAndroid Build Coastguard Worker		}
450*333d2b36SAndroid Build Coastguard Worker
451*333d2b36SAndroid Build Coastguard Worker		rust_ffi_rlib {
452*333d2b36SAndroid Build Coastguard Worker			name: "libbuzz",
453*333d2b36SAndroid Build Coastguard Worker			crate_name: "buzz",
454*333d2b36SAndroid Build Coastguard Worker			srcs: ["src/lib.rs"],
455*333d2b36SAndroid Build Coastguard Worker			export_include_dirs: ["buzz_includes"]
456*333d2b36SAndroid Build Coastguard Worker		}
457*333d2b36SAndroid Build Coastguard Worker
458*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
459*333d2b36SAndroid Build Coastguard Worker			name: "libcc_shared",
460*333d2b36SAndroid Build Coastguard Worker			srcs:["foo.c"],
461*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libbar"],
462*333d2b36SAndroid Build Coastguard Worker		}
463*333d2b36SAndroid Build Coastguard Worker
464*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
465*333d2b36SAndroid Build Coastguard Worker			name: "libcc_static",
466*333d2b36SAndroid Build Coastguard Worker			srcs:["foo.c"],
467*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libbuzz"],
468*333d2b36SAndroid Build Coastguard Worker			whole_static_libs: ["libfoo"],
469*333d2b36SAndroid Build Coastguard Worker		}
470*333d2b36SAndroid Build Coastguard Worker
471*333d2b36SAndroid Build Coastguard Worker		cc_binary {
472*333d2b36SAndroid Build Coastguard Worker			name: "ccBin",
473*333d2b36SAndroid Build Coastguard Worker			srcs:["foo.c"],
474*333d2b36SAndroid Build Coastguard Worker			static_libs: ["libcc_static", "libbar"],
475*333d2b36SAndroid Build Coastguard Worker		}
476*333d2b36SAndroid Build Coastguard Worker		`)
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Worker	libbar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_rlib_rlib-std").Rule("rustc")
479*333d2b36SAndroid Build Coastguard Worker	libcc_shared_rustc := ctx.ModuleForTests("libcc_shared", "android_arm64_armv8-a_shared").Rule("rustc")
480*333d2b36SAndroid Build Coastguard Worker	libcc_shared_ld := ctx.ModuleForTests("libcc_shared", "android_arm64_armv8-a_shared").Rule("ld")
481*333d2b36SAndroid Build Coastguard Worker	libcc_shared_cc := ctx.ModuleForTests("libcc_shared", "android_arm64_armv8-a_shared").Rule("cc")
482*333d2b36SAndroid Build Coastguard Worker	ccbin_rustc := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("rustc")
483*333d2b36SAndroid Build Coastguard Worker	ccbin_ld := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("ld")
484*333d2b36SAndroid Build Coastguard Worker	ccbin_cc := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("cc")
485*333d2b36SAndroid Build Coastguard Worker
486*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libbar.Args["rustcFlags"], "crate-type=rlib") {
487*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing crate-type for static variant, expecting %#v, rustcFlags: %#v", "rlib", libbar.Args["rustcFlags"])
488*333d2b36SAndroid Build Coastguard Worker	}
489*333d2b36SAndroid Build Coastguard Worker
490*333d2b36SAndroid Build Coastguard Worker	// Make sure there's a rustc command, and it's producing a staticlib
491*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libcc_shared_rustc.Args["rustcFlags"], "crate-type=staticlib") {
492*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing crate-type for static variant, expecting %#v, rustcFlags: %#v",
493*333d2b36SAndroid Build Coastguard Worker			"staticlib", libcc_shared_rustc.Args["rustcFlags"])
494*333d2b36SAndroid Build Coastguard Worker	}
495*333d2b36SAndroid Build Coastguard Worker
496*333d2b36SAndroid Build Coastguard Worker	// Make sure the static lib is included in the ld command
497*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libcc_shared_ld.Args["libFlags"], "generated_rust_staticlib/librustlibs.a") {
498*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing generated static library in linker step libFlags %#v, libFlags: %#v",
499*333d2b36SAndroid Build Coastguard Worker			"libcc_shared.generated_rust_staticlib.a", libcc_shared_ld.Args["libFlags"])
500*333d2b36SAndroid Build Coastguard Worker	}
501*333d2b36SAndroid Build Coastguard Worker
502*333d2b36SAndroid Build Coastguard Worker	// Make sure the static lib includes are in the cc command
503*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(libcc_shared_cc.Args["cFlags"], "-Ibar_includes") {
504*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing rlibs includes, expecting %#v, cFlags: %#v",
505*333d2b36SAndroid Build Coastguard Worker			"-Ibar_includes", libcc_shared_cc.Args["cFlags"])
506*333d2b36SAndroid Build Coastguard Worker	}
507*333d2b36SAndroid Build Coastguard Worker
508*333d2b36SAndroid Build Coastguard Worker	// Make sure there's a rustc command, and it's producing a staticlib
509*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ccbin_rustc.Args["rustcFlags"], "crate-type=staticlib") {
510*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing crate-type for static variant, expecting %#v, rustcFlags: %#v", "staticlib", ccbin_rustc.Args["rustcFlags"])
511*333d2b36SAndroid Build Coastguard Worker	}
512*333d2b36SAndroid Build Coastguard Worker
513*333d2b36SAndroid Build Coastguard Worker	// Make sure the static lib is included in the cc command
514*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ccbin_ld.Args["libFlags"], "generated_rust_staticlib/librustlibs.a") {
515*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing generated static library in linker step libFlags, expecting %#v, libFlags: %#v",
516*333d2b36SAndroid Build Coastguard Worker			"ccBin.generated_rust_staticlib.a", ccbin_ld.Args["libFlags"])
517*333d2b36SAndroid Build Coastguard Worker	}
518*333d2b36SAndroid Build Coastguard Worker
519*333d2b36SAndroid Build Coastguard Worker	// Make sure the static lib includes are in the ld command
520*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ccbin_cc.Args["cFlags"], "-Ibar_includes") {
521*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing rlibs includes, expecting %#v, cFlags: %#v",
522*333d2b36SAndroid Build Coastguard Worker			"-Ibar_includes", ccbin_cc.Args)
523*333d2b36SAndroid Build Coastguard Worker	}
524*333d2b36SAndroid Build Coastguard Worker
525*333d2b36SAndroid Build Coastguard Worker	// Make sure that direct dependencies and indirect whole static dependencies are
526*333d2b36SAndroid Build Coastguard Worker	// propagating correctly to the generated rlib.
527*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ccbin_rustc.Args["libFlags"], "--extern foo=") {
528*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Missing indirect whole_static_lib dependency libfoo when writing generated Rust staticlib: %#v", ccbin_rustc.Args["libFlags"])
529*333d2b36SAndroid Build Coastguard Worker	}
530*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(ccbin_rustc.Args["libFlags"], "--extern buzz=") {
531*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Indirect static_lib dependency libbuzz found when writing generated Rust staticlib: %#v", ccbin_rustc.Args["libFlags"])
532*333d2b36SAndroid Build Coastguard Worker	}
533*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ccbin_rustc.Args["libFlags"], "--extern bar=") {
534*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Missing direct dependency libbar when writing generated Rust staticlib: %#v", ccbin_rustc.Args["libFlags"])
535*333d2b36SAndroid Build Coastguard Worker	}
536*333d2b36SAndroid Build Coastguard Worker
537*333d2b36SAndroid Build Coastguard Worker	// Test indirect includes propagation
538*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ccbin_cc.Args["cFlags"], "-Ifoo_includes") {
539*333d2b36SAndroid Build Coastguard Worker		t.Errorf("missing rlibs includes, expecting %#v, cFlags: %#v",
540*333d2b36SAndroid Build Coastguard Worker			"-Ifoo_includes", ccbin_cc.Args)
541*333d2b36SAndroid Build Coastguard Worker	}
542*333d2b36SAndroid Build Coastguard Worker}
543*333d2b36SAndroid Build Coastguard Worker
544*333d2b36SAndroid Build Coastguard Workerfunc assertString(t *testing.T, got, expected string) {
545*333d2b36SAndroid Build Coastguard Worker	t.Helper()
546*333d2b36SAndroid Build Coastguard Worker	if got != expected {
547*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected %q got %q", expected, got)
548*333d2b36SAndroid Build Coastguard Worker	}
549*333d2b36SAndroid Build Coastguard Worker}
550