blob: 576209d04872725bd931234d4827ca6e9b2277a9 [file] [log] [blame]
Ivan Lozanoffee3342019-08-27 12:03:00 -07001// Copyright 2019 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package rust
16
17import (
Sam Delmericoa588d152023-06-16 10:28:04 -040018 "fmt"
Ivan Lozanoffee3342019-08-27 12:03:00 -070019 "os"
Ivan Lozanoc0083612019-09-03 13:49:39 -070020 "runtime"
Ivan Lozanob9040d62019-09-24 13:23:50 -070021 "strings"
Ivan Lozanoffee3342019-08-27 12:03:00 -070022 "testing"
23
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -040024 "github.com/google/blueprint/proptools"
Sam Delmericoa588d152023-06-16 10:28:04 -040025 "google.golang.org/protobuf/encoding/prototext"
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -040026
Ivan Lozanoffee3342019-08-27 12:03:00 -070027 "android/soong/android"
Sam Delmericoa588d152023-06-16 10:28:04 -040028 "android/soong/cmd/sbox/sbox_proto"
Paul Duffin2c4ca8d2021-03-07 19:18:38 +000029 "android/soong/genrule"
Ivan Lozanoffee3342019-08-27 12:03:00 -070030)
31
Ivan Lozanoffee3342019-08-27 12:03:00 -070032func TestMain(m *testing.M) {
Paul Duffin2c4ca8d2021-03-07 19:18:38 +000033 os.Exit(m.Run())
34}
Ivan Lozanoffee3342019-08-27 12:03:00 -070035
Paul Duffin2c4ca8d2021-03-07 19:18:38 +000036var prepareForRustTest = android.GroupFixturePreparers(
37 android.PrepareForTestWithArchMutator,
38 android.PrepareForTestWithDefaults,
39 android.PrepareForTestWithPrebuilts,
Ivan Lozanoffee3342019-08-27 12:03:00 -070040
Paul Duffin2c4ca8d2021-03-07 19:18:38 +000041 genrule.PrepareForTestWithGenRuleBuildComponents,
42
Ivan Lozano1921e802021-05-20 13:39:16 -040043 PrepareForTestWithRustIncludeVndk,
44 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
45 variables.DeviceVndkVersion = StringPtr("current")
46 variables.ProductVndkVersion = StringPtr("current")
47 variables.Platform_vndk_version = StringPtr("29")
48 }),
Paul Duffin2c4ca8d2021-03-07 19:18:38 +000049)
50
51var rustMockedFiles = android.MockFS{
Ivan Lozano1921e802021-05-20 13:39:16 -040052 "foo.rs": nil,
53 "foo.c": nil,
54 "src/bar.rs": nil,
55 "src/any.h": nil,
56 "c_includes/c_header.h": nil,
57 "rust_includes/rust_headers.h": nil,
58 "proto.proto": nil,
59 "proto/buf.proto": nil,
60 "buf.proto": nil,
61 "foo.proto": nil,
62 "liby.so": nil,
63 "libz.so": nil,
64 "data.txt": nil,
Ivan Lozano3149e6e2021-06-01 15:09:53 -040065 "liblog.map.txt": nil,
Ivan Lozanoffee3342019-08-27 12:03:00 -070066}
67
Thiébaud Weksteen0a75e522020-10-07 14:30:03 +020068// testRust returns a TestContext in which a basic environment has been setup.
Paul Duffin2c4ca8d2021-03-07 19:18:38 +000069// This environment contains a few mocked files. See rustMockedFiles for the list of these files.
Sam Delmericoa588d152023-06-16 10:28:04 -040070func testRust(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Paul Duffin2c4ca8d2021-03-07 19:18:38 +000071 skipTestIfOsNotSupported(t)
72 result := android.GroupFixturePreparers(
73 prepareForRustTest,
74 rustMockedFiles.AddToFixture(),
Sam Delmericoa588d152023-06-16 10:28:04 -040075 android.GroupFixturePreparers(
76 preparers...,
77 ),
Paul Duffin2c4ca8d2021-03-07 19:18:38 +000078 ).
79 RunTestWithBp(t, bp)
80 return result.TestContext
Thiébaud Weksteen0a75e522020-10-07 14:30:03 +020081}
Colin Cross98be1bb2019-12-13 20:41:13 -080082
Ivan Lozanof76cdf72021-02-12 09:55:06 -050083func testRustVndk(t *testing.T, bp string) *android.TestContext {
Ivan Lozano1921e802021-05-20 13:39:16 -040084 return testRustVndkFs(t, bp, rustMockedFiles)
85}
86
Ivan Lozano3149e6e2021-06-01 15:09:53 -040087const (
Ivan Lozanoadd122a2023-07-13 11:01:41 -040088 sharedVendorVariant = "android_vendor.29_arm64_armv8-a_shared"
89 rlibVendorVariant = "android_vendor.29_arm64_armv8-a_rlib_rlib-std"
90 rlibDylibStdVendorVariant = "android_vendor.29_arm64_armv8-a_rlib_rlib-std"
91 dylibVendorVariant = "android_vendor.29_arm64_armv8-a_dylib"
92 sharedRecoveryVariant = "android_recovery_arm64_armv8-a_shared"
93 rlibRecoveryVariant = "android_recovery_arm64_armv8-a_rlib_dylib-std"
94 rlibRlibStdRecoveryVariant = "android_recovery_arm64_armv8-a_rlib_rlib-std"
95 dylibRecoveryVariant = "android_recovery_arm64_armv8-a_dylib"
96 binaryCoreVariant = "android_arm64_armv8-a"
97 binaryVendorVariant = "android_vendor.29_arm64_armv8-a"
98 binaryProductVariant = "android_product.29_arm64_armv8-a"
99 binaryRecoveryVariant = "android_recovery_arm64_armv8-a"
Ivan Lozano3149e6e2021-06-01 15:09:53 -0400100)
Ivan Lozano1921e802021-05-20 13:39:16 -0400101
102func testRustVndkFs(t *testing.T, bp string, fs android.MockFS) *android.TestContext {
Ivan Lozano3149e6e2021-06-01 15:09:53 -0400103 return testRustVndkFsVersions(t, bp, fs, "current", "current", "29")
104}
105
106func testRustVndkFsVersions(t *testing.T, bp string, fs android.MockFS, device_version, product_version, vndk_version string) *android.TestContext {
Paul Duffin2c4ca8d2021-03-07 19:18:38 +0000107 skipTestIfOsNotSupported(t)
108 result := android.GroupFixturePreparers(
109 prepareForRustTest,
Ivan Lozano1921e802021-05-20 13:39:16 -0400110 fs.AddToFixture(),
Paul Duffin2c4ca8d2021-03-07 19:18:38 +0000111 android.FixtureModifyProductVariables(
112 func(variables android.FixtureProductVariables) {
Ivan Lozano3149e6e2021-06-01 15:09:53 -0400113 variables.DeviceVndkVersion = StringPtr(device_version)
114 variables.ProductVndkVersion = StringPtr(product_version)
115 variables.Platform_vndk_version = StringPtr(vndk_version)
Paul Duffin2c4ca8d2021-03-07 19:18:38 +0000116 },
117 ),
118 ).RunTestWithBp(t, bp)
119 return result.TestContext
Ivan Lozanoc2ca1ee2021-11-09 16:23:40 -0500120}
Ivan Lozano1921e802021-05-20 13:39:16 -0400121
Ivan Lozanoc2ca1ee2021-11-09 16:23:40 -0500122func testRustRecoveryFsVersions(t *testing.T, bp string, fs android.MockFS, device_version, vndk_version, recovery_version string) *android.TestContext {
123 skipTestIfOsNotSupported(t)
124 result := android.GroupFixturePreparers(
125 prepareForRustTest,
126 fs.AddToFixture(),
127 android.FixtureModifyProductVariables(
128 func(variables android.FixtureProductVariables) {
129 variables.DeviceVndkVersion = StringPtr(device_version)
130 variables.RecoverySnapshotVersion = StringPtr(recovery_version)
131 variables.Platform_vndk_version = StringPtr(vndk_version)
132 },
133 ),
134 ).RunTestWithBp(t, bp)
135 return result.TestContext
Ivan Lozanof76cdf72021-02-12 09:55:06 -0500136}
137
Thiébaud Weksteen0a75e522020-10-07 14:30:03 +0200138// testRustCov returns a TestContext in which a basic environment has been
139// setup. This environment explicitly enables coverage.
140func testRustCov(t *testing.T, bp string) *android.TestContext {
Paul Duffin2c4ca8d2021-03-07 19:18:38 +0000141 skipTestIfOsNotSupported(t)
142 result := android.GroupFixturePreparers(
143 prepareForRustTest,
144 rustMockedFiles.AddToFixture(),
145 android.FixtureModifyProductVariables(
146 func(variables android.FixtureProductVariables) {
147 variables.ClangCoverage = proptools.BoolPtr(true)
148 variables.Native_coverage = proptools.BoolPtr(true)
149 variables.NativeCoveragePaths = []string{"*"}
150 },
151 ),
152 ).RunTestWithBp(t, bp)
153 return result.TestContext
Thiébaud Weksteen0a75e522020-10-07 14:30:03 +0200154}
155
156// testRustError ensures that at least one error was raised and its value
157// matches the pattern provided. The error can be either in the parsing of the
158// Blueprint or when generating the build actions.
159func testRustError(t *testing.T, pattern string, bp string) {
Paul Duffin2c4ca8d2021-03-07 19:18:38 +0000160 skipTestIfOsNotSupported(t)
161 android.GroupFixturePreparers(
162 prepareForRustTest,
163 rustMockedFiles.AddToFixture(),
164 ).
165 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
166 RunTestWithBp(t, bp)
Thiébaud Weksteen0a75e522020-10-07 14:30:03 +0200167}
168
Ivan Lozanoc08897c2021-04-02 12:41:32 -0400169// testRustVndkError is similar to testRustError, but can be used to test VNDK-related errors.
170func testRustVndkError(t *testing.T, pattern string, bp string) {
Ivan Lozano1921e802021-05-20 13:39:16 -0400171 testRustVndkFsError(t, pattern, bp, rustMockedFiles)
172}
173
174func testRustVndkFsError(t *testing.T, pattern string, bp string, fs android.MockFS) {
Ivan Lozanoc08897c2021-04-02 12:41:32 -0400175 skipTestIfOsNotSupported(t)
176 android.GroupFixturePreparers(
177 prepareForRustTest,
Ivan Lozano1921e802021-05-20 13:39:16 -0400178 fs.AddToFixture(),
Ivan Lozanoc08897c2021-04-02 12:41:32 -0400179 android.FixtureModifyProductVariables(
180 func(variables android.FixtureProductVariables) {
181 variables.DeviceVndkVersion = StringPtr("current")
182 variables.ProductVndkVersion = StringPtr("current")
183 variables.Platform_vndk_version = StringPtr("VER")
184 },
185 ),
186 ).
187 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
188 RunTestWithBp(t, bp)
189}
190
Thiébaud Weksteen0a75e522020-10-07 14:30:03 +0200191// testRustCtx is used to build a particular test environment. Unless your
192// tests requires a specific setup, prefer the wrapping functions: testRust,
193// testRustCov or testRustError.
194type testRustCtx struct {
195 bp string
196 fs map[string][]byte
197 env map[string]string
198 config *android.Config
199}
200
Paul Duffin2c4ca8d2021-03-07 19:18:38 +0000201func skipTestIfOsNotSupported(t *testing.T) {
Thiébaud Weksteen0a75e522020-10-07 14:30:03 +0200202 // TODO (b/140435149)
203 if runtime.GOOS != "linux" {
204 t.Skip("Rust Soong tests can only be run on Linux hosts currently")
205 }
Ivan Lozanoffee3342019-08-27 12:03:00 -0700206}
207
Ivan Lozanoffee3342019-08-27 12:03:00 -0700208// Test that we can extract the link path from a lib path.
209func TestLinkPathFromFilePath(t *testing.T) {
210 barPath := android.PathForTesting("out/soong/.intermediates/external/libbar/libbar/linux_glibc_x86_64_shared/libbar.so")
Sam Delmericoa588d152023-06-16 10:28:04 -0400211 libName := barPath.Dir()
212 expectedResult := "out/soong/.intermediates/external/libbar/libbar/linux_glibc_x86_64_shared"
Ivan Lozanoffee3342019-08-27 12:03:00 -0700213
Sam Delmericoa588d152023-06-16 10:28:04 -0400214 if libName.String() != expectedResult {
215 t.Errorf("libNameFromFilePath returned the wrong name; expected '%#v', got '%#v'", expectedResult, libName.String())
Ivan Lozanoffee3342019-08-27 12:03:00 -0700216 }
217}
218
Ivan Lozanoffee3342019-08-27 12:03:00 -0700219// Test to make sure dependencies are being picked up correctly.
220func TestDepsTracking(t *testing.T) {
221 ctx := testRust(t, `
Sam Delmerico51d6d1c2023-03-28 16:54:00 -0400222 cc_library {
223 host_supported: true,
224 name: "cc_stubs_dep",
225 }
Matthew Maurer2ae05132020-06-23 14:28:53 -0700226 rust_ffi_host_static {
Ivan Lozano52767be2019-10-18 14:49:46 -0700227 name: "libstatic",
228 srcs: ["foo.rs"],
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700229 crate_name: "static",
Ivan Lozano52767be2019-10-18 14:49:46 -0700230 }
Ivan Lozano63bb7682021-03-23 15:53:44 -0400231 rust_ffi_host_static {
232 name: "libwholestatic",
233 srcs: ["foo.rs"],
234 crate_name: "wholestatic",
235 }
Matthew Maurer2ae05132020-06-23 14:28:53 -0700236 rust_ffi_host_shared {
Ivan Lozano52767be2019-10-18 14:49:46 -0700237 name: "libshared",
238 srcs: ["foo.rs"],
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700239 crate_name: "shared",
Ivan Lozano52767be2019-10-18 14:49:46 -0700240 }
Ivan Lozanoffee3342019-08-27 12:03:00 -0700241 rust_library_host_rlib {
Ivan Lozano52767be2019-10-18 14:49:46 -0700242 name: "librlib",
Ivan Lozano43845682020-07-09 21:03:28 -0400243 srcs: ["foo.rs"],
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700244 crate_name: "rlib",
Ivan Lozanofb6f36f2021-02-05 12:27:08 -0500245 static_libs: ["libstatic"],
Ivan Lozano63bb7682021-03-23 15:53:44 -0400246 whole_static_libs: ["libwholestatic"],
Sam Delmerico51d6d1c2023-03-28 16:54:00 -0400247 shared_libs: ["cc_stubs_dep"],
Ivan Lozanoffee3342019-08-27 12:03:00 -0700248 }
249 rust_proc_macro {
250 name: "libpm",
251 srcs: ["foo.rs"],
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700252 crate_name: "pm",
Ivan Lozanoffee3342019-08-27 12:03:00 -0700253 }
254 rust_binary_host {
Ivan Lozano43845682020-07-09 21:03:28 -0400255 name: "fizz-buzz",
Ivan Lozano52767be2019-10-18 14:49:46 -0700256 rlibs: ["librlib"],
Ivan Lozanoffee3342019-08-27 12:03:00 -0700257 proc_macros: ["libpm"],
Ivan Lozano52767be2019-10-18 14:49:46 -0700258 static_libs: ["libstatic"],
259 shared_libs: ["libshared"],
Ivan Lozano43845682020-07-09 21:03:28 -0400260 srcs: ["foo.rs"],
Ivan Lozanoffee3342019-08-27 12:03:00 -0700261 }
262 `)
Ivan Lozano43845682020-07-09 21:03:28 -0400263 module := ctx.ModuleForTests("fizz-buzz", "linux_glibc_x86_64").Module().(*Module)
Ivan Lozanofb6f36f2021-02-05 12:27:08 -0500264 rustc := ctx.ModuleForTests("librlib", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc")
Sam Delmericoa588d152023-06-16 10:28:04 -0400265 rustLink := ctx.ModuleForTests("fizz-buzz", "linux_glibc_x86_64").Rule("rustc")
Ivan Lozanoffee3342019-08-27 12:03:00 -0700266
267 // Since dependencies are added to AndroidMk* properties, we can check these to see if they've been picked up.
Ivan Lozano2b081132020-09-08 12:46:52 -0400268 if !android.InList("librlib.rlib-std", module.Properties.AndroidMkRlibs) {
Ivan Lozanoffee3342019-08-27 12:03:00 -0700269 t.Errorf("Rlib dependency not detected (dependency missing from AndroidMkRlibs)")
270 }
271
272 if !android.InList("libpm", module.Properties.AndroidMkProcMacroLibs) {
273 t.Errorf("Proc_macro dependency not detected (dependency missing from AndroidMkProcMacroLibs)")
274 }
275
Cole Faustb6e6f992023-08-17 17:42:26 -0700276 if !android.InList("libshared", module.transitiveAndroidMkSharedLibs.ToList()) {
Ivan Lozano52767be2019-10-18 14:49:46 -0700277 t.Errorf("Shared library dependency not detected (dependency missing from AndroidMkSharedLibs)")
278 }
279
280 if !android.InList("libstatic", module.Properties.AndroidMkStaticLibs) {
281 t.Errorf("Static library dependency not detected (dependency missing from AndroidMkStaticLibs)")
282 }
Ivan Lozano3dfa12d2021-02-04 11:29:41 -0500283
Sam Delmericoa588d152023-06-16 10:28:04 -0400284 if !strings.Contains(rustc.RuleParams.Command, "-lstatic=wholestatic") {
285 t.Errorf("-lstatic flag not being passed to rustc for static library %#v", rustc.RuleParams.Command)
Ivan Lozano3dfa12d2021-02-04 11:29:41 -0500286 }
287
Sam Delmericoa588d152023-06-16 10:28:04 -0400288 if !strings.Contains(rustLink.RuleParams.Command, "cc_stubs_dep.so") {
289 t.Errorf("shared cc_library not being passed to rustc linkFlags %#v", rustLink.RuleParams.Command)
Sam Delmerico51d6d1c2023-03-28 16:54:00 -0400290 }
291
Sam Delmericoa588d152023-06-16 10:28:04 -0400292 if !android.SuffixInList(rustLink.Implicits.Strings(), "cc_stubs_dep.so") {
293 t.Errorf("shared cc dep not being passed as implicit to rustc %#v", rustLink.OrderOnly.Strings())
Sam Delmerico51d6d1c2023-03-28 16:54:00 -0400294 }
295
Peter Collingbournee7c71c32023-03-31 20:21:19 -0700296 if !android.SuffixInList(rustLink.Implicits.Strings(), "cc_stubs_dep.so.toc") {
297 t.Errorf("shared cc dep TOC not being passed as implicit to rustc %#v", rustLink.Implicits.Strings())
Sam Delmerico51d6d1c2023-03-28 16:54:00 -0400298 }
Ivan Lozanoffee3342019-08-27 12:03:00 -0700299}
Ivan Lozanob9040d62019-09-24 13:23:50 -0700300
Ivan Lozano43845682020-07-09 21:03:28 -0400301func TestSourceProviderDeps(t *testing.T) {
302 ctx := testRust(t, `
303 rust_binary {
304 name: "fizz-buzz-dep",
305 srcs: [
306 "foo.rs",
307 ":my_generator",
308 ":libbindings",
309 ],
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400310 rlibs: ["libbindings"],
Ivan Lozano43845682020-07-09 21:03:28 -0400311 }
312 rust_proc_macro {
313 name: "libprocmacro",
314 srcs: [
315 "foo.rs",
316 ":my_generator",
317 ":libbindings",
318 ],
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400319 rlibs: ["libbindings"],
Ivan Lozano43845682020-07-09 21:03:28 -0400320 crate_name: "procmacro",
321 }
322 rust_library {
323 name: "libfoo",
324 srcs: [
325 "foo.rs",
326 ":my_generator",
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400327 ":libbindings",
328 ],
329 rlibs: ["libbindings"],
Ivan Lozano43845682020-07-09 21:03:28 -0400330 crate_name: "foo",
331 }
332 genrule {
333 name: "my_generator",
334 tools: ["any_rust_binary"],
335 cmd: "$(location) -o $(out) $(in)",
336 srcs: ["src/any.h"],
337 out: ["src/any.rs"],
338 }
Colin Crosse9fe2942020-11-10 18:12:15 -0800339 rust_binary_host {
340 name: "any_rust_binary",
341 srcs: [
342 "foo.rs",
343 ],
344 }
Ivan Lozano43845682020-07-09 21:03:28 -0400345 rust_bindgen {
346 name: "libbindings",
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400347 crate_name: "bindings",
348 source_stem: "bindings",
Ivan Lozano43845682020-07-09 21:03:28 -0400349 host_supported: true,
350 wrapper_src: "src/any.h",
Sam Delmerico51d6d1c2023-03-28 16:54:00 -0400351 }
Ivan Lozano43845682020-07-09 21:03:28 -0400352 `)
353
Ivan Lozano2b081132020-09-08 12:46:52 -0400354 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std").Rule("rustc")
Ivan Lozano43845682020-07-09 21:03:28 -0400355 if !android.SuffixInList(libfoo.Implicits.Strings(), "/out/bindings.rs") {
356 t.Errorf("rust_bindgen generated source not included as implicit input for libfoo; Implicits %#v", libfoo.Implicits.Strings())
357 }
358 if !android.SuffixInList(libfoo.Implicits.Strings(), "/out/any.rs") {
359 t.Errorf("genrule generated source not included as implicit input for libfoo; Implicits %#v", libfoo.Implicits.Strings())
360 }
361
362 fizzBuzz := ctx.ModuleForTests("fizz-buzz-dep", "android_arm64_armv8-a").Rule("rustc")
363 if !android.SuffixInList(fizzBuzz.Implicits.Strings(), "/out/bindings.rs") {
364 t.Errorf("rust_bindgen generated source not included as implicit input for fizz-buzz-dep; Implicits %#v", libfoo.Implicits.Strings())
365 }
366 if !android.SuffixInList(fizzBuzz.Implicits.Strings(), "/out/any.rs") {
367 t.Errorf("genrule generated source not included as implicit input for fizz-buzz-dep; Implicits %#v", libfoo.Implicits.Strings())
368 }
369
370 libprocmacro := ctx.ModuleForTests("libprocmacro", "linux_glibc_x86_64").Rule("rustc")
371 if !android.SuffixInList(libprocmacro.Implicits.Strings(), "/out/bindings.rs") {
372 t.Errorf("rust_bindgen generated source not included as implicit input for libprocmacro; Implicits %#v", libfoo.Implicits.Strings())
373 }
374 if !android.SuffixInList(libprocmacro.Implicits.Strings(), "/out/any.rs") {
375 t.Errorf("genrule generated source not included as implicit input for libprocmacro; Implicits %#v", libfoo.Implicits.Strings())
376 }
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400377
378 // Check that our bindings are picked up as crate dependencies as well
379 libfooMod := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").Module().(*Module)
Ivan Lozano4df02572023-06-15 14:21:09 -0400380 if !android.InList("libbindings", libfooMod.Properties.AndroidMkRlibs) {
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400381 t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)")
382 }
383 fizzBuzzMod := ctx.ModuleForTests("fizz-buzz-dep", "android_arm64_armv8-a").Module().(*Module)
Ivan Lozano4df02572023-06-15 14:21:09 -0400384 if !android.InList("libbindings", fizzBuzzMod.Properties.AndroidMkRlibs) {
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400385 t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)")
386 }
387 libprocmacroMod := ctx.ModuleForTests("libprocmacro", "linux_glibc_x86_64").Module().(*Module)
Ivan Lozano2b081132020-09-08 12:46:52 -0400388 if !android.InList("libbindings.rlib-std", libprocmacroMod.Properties.AndroidMkRlibs) {
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400389 t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)")
390 }
Ivan Lozano43845682020-07-09 21:03:28 -0400391}
392
Ivan Lozano07cbaf42020-07-22 16:09:13 -0400393func TestSourceProviderTargetMismatch(t *testing.T) {
394 // This might error while building the dependency tree or when calling depsToPaths() depending on the lunched
395 // target, which results in two different errors. So don't check the error, just confirm there is one.
396 testRustError(t, ".*", `
397 rust_proc_macro {
398 name: "libprocmacro",
399 srcs: [
400 "foo.rs",
401 ":libbindings",
402 ],
403 crate_name: "procmacro",
404 }
405 rust_bindgen {
406 name: "libbindings",
Ivan Lozano26ecd6c2020-07-31 13:40:31 -0400407 crate_name: "bindings",
408 source_stem: "bindings",
Ivan Lozano07cbaf42020-07-22 16:09:13 -0400409 wrapper_src: "src/any.h",
410 }
411 `)
412}
413
Ivan Lozanob9040d62019-09-24 13:23:50 -0700414// Test to make sure proc_macros use host variants when building device modules.
415func TestProcMacroDeviceDeps(t *testing.T) {
416 ctx := testRust(t, `
417 rust_library_host_rlib {
418 name: "libbar",
419 srcs: ["foo.rs"],
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700420 crate_name: "bar",
Ivan Lozanob9040d62019-09-24 13:23:50 -0700421 }
422 rust_proc_macro {
423 name: "libpm",
424 rlibs: ["libbar"],
425 srcs: ["foo.rs"],
Ivan Lozanoad8b18b2019-10-31 19:38:29 -0700426 crate_name: "pm",
Ivan Lozanob9040d62019-09-24 13:23:50 -0700427 }
428 rust_binary {
429 name: "fizz-buzz",
430 proc_macros: ["libpm"],
431 srcs: ["foo.rs"],
432 }
433 `)
434 rustc := ctx.ModuleForTests("libpm", "linux_glibc_x86_64").Rule("rustc")
435
Sam Delmericoa588d152023-06-16 10:28:04 -0400436 if !strings.Contains(rustc.RuleParams.Command, "libbar/linux_glibc_x86_64") {
Ivan Lozanob9040d62019-09-24 13:23:50 -0700437 t.Errorf("Proc_macro is not using host variant of dependent modules.")
438 }
439}
Matthew Maurer99020b02019-10-31 10:44:40 -0700440
441// Test that no_stdlibs suppresses dependencies on rust standard libraries
442func TestNoStdlibs(t *testing.T) {
443 ctx := testRust(t, `
444 rust_binary {
445 name: "fizz-buzz",
446 srcs: ["foo.rs"],
Ivan Lozano9d1df102020-04-28 10:10:23 -0400447 no_stdlibs: true,
Matthew Maurer99020b02019-10-31 10:44:40 -0700448 }`)
Colin Cross7113d202019-11-20 16:39:12 -0800449 module := ctx.ModuleForTests("fizz-buzz", "android_arm64_armv8-a").Module().(*Module)
Matthew Maurer99020b02019-10-31 10:44:40 -0700450
451 if android.InList("libstd", module.Properties.AndroidMkDylibs) {
452 t.Errorf("no_stdlibs did not suppress dependency on libstd")
453 }
454}
Ivan Lozano9d1df102020-04-28 10:10:23 -0400455
456// Test that libraries provide both 32-bit and 64-bit variants.
457func TestMultilib(t *testing.T) {
458 ctx := testRust(t, `
459 rust_library_rlib {
460 name: "libfoo",
461 srcs: ["foo.rs"],
462 crate_name: "foo",
463 }`)
464
Ivan Lozano2b081132020-09-08 12:46:52 -0400465 _ = ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std")
466 _ = ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_rlib_dylib-std")
Ivan Lozano9d1df102020-04-28 10:10:23 -0400467}
Thiébaud Weksteene4dd14b2021-04-14 11:18:47 +0200468
469// Test that library size measurements are generated.
470func TestLibrarySizes(t *testing.T) {
471 ctx := testRust(t, `
472 rust_library_dylib {
473 name: "libwaldo",
474 srcs: ["foo.rs"],
475 crate_name: "waldo",
476 }`)
477
478 m := ctx.SingletonForTests("file_metrics")
Ivan Lozano8d10fc32021-11-05 16:36:47 -0400479 m.Output("unstripped/libwaldo.dylib.so.bloaty.csv")
Thiébaud Weksteene4dd14b2021-04-14 11:18:47 +0200480 m.Output("libwaldo.dylib.so.bloaty.csv")
Thiébaud Weksteene4dd14b2021-04-14 11:18:47 +0200481}
Ivan Lozano62cd0382021-11-01 10:27:54 -0400482
483func assertString(t *testing.T, got, expected string) {
484 t.Helper()
485 if got != expected {
486 t.Errorf("expected %q got %q", expected, got)
487 }
488}
Sam Delmericoa588d152023-06-16 10:28:04 -0400489
490var (
491 sboxCompilationFiles = []string{
492 "out/soong/.intermediates/defaults/rust/libaddr2line/android_arm64_armv8-a_rlib/libaddr2line.rlib",
493 "out/soong/.intermediates/defaults/rust/libadler/android_arm64_armv8-a_rlib/libadler.rlib",
494 "out/soong/.intermediates/defaults/rust/liballoc/android_arm64_armv8-a_rlib/liballoc.rlib",
495 "out/soong/.intermediates/defaults/rust/libcfg_if/android_arm64_armv8-a_rlib/libcfg_if.rlib",
496 "out/soong/.intermediates/defaults/rust/libcompiler_builtins/android_arm64_armv8-a_rlib/libcompiler_builtins.rlib",
497 "out/soong/.intermediates/defaults/rust/libcore/android_arm64_armv8-a_rlib/libcore.rlib",
498 "out/soong/.intermediates/defaults/rust/libgimli/android_arm64_armv8-a_rlib/libgimli.rlib",
499 "out/soong/.intermediates/defaults/rust/libhashbrown/android_arm64_armv8-a_rlib/libhashbrown.rlib",
500 "out/soong/.intermediates/defaults/rust/liblibc/android_arm64_armv8-a_rlib/liblibc.rlib",
501 "out/soong/.intermediates/defaults/rust/libmemchr/android_arm64_armv8-a_rlib/libmemchr.rlib",
502 "out/soong/.intermediates/defaults/rust/libminiz_oxide/android_arm64_armv8-a_rlib/libminiz_oxide.rlib",
503 "out/soong/.intermediates/defaults/rust/libobject/android_arm64_armv8-a_rlib/libobject.rlib",
504 "out/soong/.intermediates/defaults/rust/libpanic_unwind/android_arm64_armv8-a_rlib/libpanic_unwind.rlib",
505 "out/soong/.intermediates/defaults/rust/librustc_demangle/android_arm64_armv8-a_rlib/librustc_demangle.rlib",
506 "out/soong/.intermediates/defaults/rust/librustc_std_workspace_alloc/android_arm64_armv8-a_rlib/librustc_std_workspace_alloc.rlib",
507 "out/soong/.intermediates/defaults/rust/librustc_std_workspace_core/android_arm64_armv8-a_rlib/librustc_std_workspace_core.rlib",
508 "out/soong/.intermediates/defaults/rust/libstd_detect/android_arm64_armv8-a_rlib/libstd_detect.rlib",
509 "build/soong/scripts/mkcratersp.py",
510 "defaults/rust/linux-x86/1.69.0/bin/rustc",
511 "defaults/rust/linux-x86/1.69.0/lib/libstd.so",
512 "defaults/rust/linux-x86/1.69.0/lib64/libc++.so.1",
513 }
514 sboxCompilationFilesWithCc = []string{
515 "defaults/cc/common",
516 "out/soong/.intermediates/defaults/cc/common/libc/android_arm64_armv8-a_shared/libc.so",
517 "out/soong/.intermediates/defaults/cc/common/libc/android_arm64_armv8-a_shared/libc.so.toc",
518 "out/soong/.intermediates/defaults/cc/common/libdl/android_arm64_armv8-a_shared/libdl.so",
519 "out/soong/.intermediates/defaults/cc/common/libdl/android_arm64_armv8-a_shared/libdl.so.toc",
520 "out/soong/.intermediates/defaults/cc/common/libm/android_arm64_armv8-a_shared/libm.so",
521 "out/soong/.intermediates/defaults/cc/common/libm/android_arm64_armv8-a_shared/libm.so.toc",
522 "out/soong/.intermediates/defaults/rust/liblog/android_arm64_armv8-a_shared/liblog.so",
523 "out/soong/.intermediates/defaults/rust/liblog/android_arm64_armv8-a_shared/liblog.so.toc",
524 }
525)
526
527func TestSandboxCompilation(t *testing.T) {
528 ctx := testRust(t, `
529 filegroup {
530 name: "libsrcs1",
531 srcs: ["src_filegroup1.rs"],
532 }
533 filegroup {
534 name: "libsrcs2",
535 srcs: ["src_filegroup2.rs"],
536 }
537 rust_library {
538 name: "libfizz_buzz",
539 crate_name:"fizz_buzz",
540 crate_root: "foo.rs",
541 srcs: [
542 "src_lib*.rs",
543 ":libsrcs1",
544 ":libsrcs2",
545 ],
546 compile_data: [
547 "compile_data1.txt",
548 "compile_data2.txt",
549 ],
550 dylib: {
551 srcs: ["dylib_only.rs"],
552 },
553 rlib: {
554 srcs: ["rlib_only.rs"],
555 },
556 }
557 rust_binary {
558 name: "fizz_buzz",
559 crate_name:"fizz_buzz",
560 crate_root: "foo.rs",
561 srcs: [
562 "src_lib*.rs",
563 ":libsrcs1",
564 ":libsrcs2",
565 ],
566 }
567 rust_ffi {
568 name: "librust_ffi",
569 crate_name: "rust_ffi",
570 crate_root: "foo.rs",
571 static: {
572 srcs: ["static_only.rs"],
573 },
574 shared: {
575 srcs: ["shared_only.rs"],
576 },
577 srcs: ["src1.rs"],
578 }
579 cc_library_static {
580 name: "cc_dep_static",
581 }
582 cc_library_shared {
583 name: "cc_dep_shared",
584 }
585 rust_library {
586 name: "libfizz_buzz_cc_deps",
587 crate_name:"fizz_buzz",
588 crate_root: "foo.rs",
589 srcs: ["src*.rs"],
590 shared_libs: ["cc_dep_shared"],
591 static_libs: ["cc_dep_static"],
592 }
593 rust_library {
594 name: "libfizz_buzz_intermediate_cc_deps",
595 crate_name:"fizz_buzz",
596 crate_root: "foo.rs",
597 srcs: ["src*.rs"],
598 rustlibs: ["libfizz_buzz_cc_deps"],
599 }
600 rust_library {
601 name: "libfizz_buzz_transitive_cc_deps",
602 crate_name:"fizz_buzz",
603 crate_root: "foo.rs",
604 srcs: ["src*.rs"],
605 rustlibs: ["libfizz_buzz_intermediate_cc_deps"],
606 }
607 `,
608 android.FixtureMergeMockFs(android.MockFS{
609 "src_lib1.rs": nil,
610 "src_lib2.rs": nil,
611 "src_lib3.rs": nil,
612 "src_lib4.rs": nil,
613 "src_filegroup1.rs": nil,
614 "src_filegroup2.rs": nil,
615 "static_only.rs": nil,
616 "shared_only.rs": nil,
617 }),
618 )
619
620 testcases := []struct {
621 name string
622 moduleName string
623 variant string
624 rustcExpectedFilesToCopy []string
625 expectedFlags []string
626 }{
627 {
628 name: "rust_library (dylib)",
629 moduleName: "libfizz_buzz",
630 variant: "android_arm64_armv8-a_dylib",
631 rustcExpectedFilesToCopy: android.Concat(sboxCompilationFiles, sboxCompilationFilesWithCc, []string{
632 "foo.rs",
633 "src_lib1.rs",
634 "src_lib2.rs",
635 "src_lib3.rs",
636 "src_lib4.rs",
637 "src_filegroup1.rs",
638 "src_filegroup2.rs",
639 "compile_data1.txt",
640 "compile_data2.txt",
641 "dylib_only.rs",
642 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/out/src_filegroup1.rs",
643 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/out/src_filegroup2.rs",
644
645 "out/soong/.intermediates/defaults/cc/common/libc/android_arm64_armv8-a_shared/libc.so",
646 "out/soong/.intermediates/defaults/cc/common/libc/android_arm64_armv8-a_shared/libc.so.toc",
647 "out/soong/.intermediates/defaults/cc/common/libm/android_arm64_armv8-a_shared/libm.so",
648 "out/soong/.intermediates/defaults/cc/common/libm/android_arm64_armv8-a_shared/libm.so.toc",
649 "out/soong/.intermediates/defaults/cc/common/libdl/android_arm64_armv8-a_shared/libdl.so",
650 "out/soong/.intermediates/defaults/cc/common/libdl/android_arm64_armv8-a_shared/libdl.so.toc",
651 "out/soong/.intermediates/defaults/rust/libstd/android_arm64_armv8-a_dylib/unstripped/libstd.dylib.so",
652 "out/soong/.intermediates/defaults/cc/common/crtbegin_so/android_arm64_armv8-a/crtbegin_so.o",
653 "out/soong/.intermediates/defaults/cc/common/crtend_so/android_arm64_armv8-a/crtend_so.o",
654 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/libfizz_buzz.dylib.so.clippy",
655 }),
656 expectedFlags: []string{
657 "-C linker=build/soong/scripts/mkcratersp.py",
658 "--emit link",
659 "-o __SBOX_SANDBOX_DIR__/out/libfizz_buzz.dylib.so.rsp",
660 "--emit dep-info=__SBOX_SANDBOX_DIR__/out/libfizz_buzz.dylib.so.d.raw",
661 "foo.rs", // this is the entry point
662 },
663 },
664 {
665 name: "rust_library (rlib dylib-std)",
666 moduleName: "libfizz_buzz",
667 variant: "android_arm64_armv8-a_rlib_dylib-std",
668 rustcExpectedFilesToCopy: android.Concat(sboxCompilationFiles, []string{
669 "foo.rs",
670 "src_lib1.rs",
671 "src_lib2.rs",
672 "src_lib3.rs",
673 "src_lib4.rs",
674 "src_filegroup1.rs",
675 "src_filegroup2.rs",
676 "rlib_only.rs",
677 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_dylib-std/out/src_filegroup1.rs",
678 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_dylib-std/out/src_filegroup2.rs",
679 "out/soong/.intermediates/defaults/rust/libstd/android_arm64_armv8-a_dylib/unstripped/libstd.dylib.so",
680 }),
681 expectedFlags: []string{
682 "--emit link",
683 "-o __SBOX_SANDBOX_DIR__/out/libfizz_buzz.rlib",
684 "--emit dep-info=__SBOX_SANDBOX_DIR__/out/libfizz_buzz.rlib.d.raw",
685 "foo.rs", // this is the entry point
686 },
687 },
688 {
689 name: "rust_library (rlib rlib-std)",
690 moduleName: "libfizz_buzz",
691 variant: "android_arm64_armv8-a_rlib_rlib-std",
692 rustcExpectedFilesToCopy: android.Concat(sboxCompilationFiles, []string{
693 "foo.rs",
694 "src_lib1.rs",
695 "src_lib2.rs",
696 "src_lib3.rs",
697 "src_lib4.rs",
698 "src_filegroup1.rs",
699 "src_filegroup2.rs",
700 "rlib_only.rs",
701 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/out/src_filegroup1.rs",
702 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/out/src_filegroup2.rs",
703 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/libfizz_buzz.rlib.clippy",
704 "out/soong/.intermediates/defaults/rust/libstd/android_arm64_armv8-a_rlib/libstd.rlib",
705 }),
706 expectedFlags: []string{
707 "--emit link",
708 "-o __SBOX_SANDBOX_DIR__/out/libfizz_buzz.rlib",
709 "--emit dep-info=__SBOX_SANDBOX_DIR__/out/libfizz_buzz.rlib.d.raw",
710 "foo.rs", // this is the entry point
711 },
712 },
713 {
714 name: "rust_binary",
715 moduleName: "fizz_buzz",
716 variant: "android_arm64_armv8-a",
717 rustcExpectedFilesToCopy: android.Concat(sboxCompilationFiles, sboxCompilationFilesWithCc, []string{
718 "foo.rs",
719 "src_lib1.rs",
720 "src_lib2.rs",
721 "src_lib3.rs",
722 "src_lib4.rs",
723 "src_filegroup1.rs",
724 "src_filegroup2.rs",
725 "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/out/src_filegroup1.rs",
726 "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/out/src_filegroup2.rs",
727
728 "out/soong/.intermediates/defaults/rust/libstd/android_arm64_armv8-a_dylib/unstripped/libstd.dylib.so",
729 "out/soong/.intermediates/defaults/cc/common/crtbegin_dynamic/android_arm64_armv8-a/crtbegin_dynamic.o",
730 "out/soong/.intermediates/defaults/cc/common/crtend_android/android_arm64_armv8-a/crtend_android.o",
731 "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/fizz_buzz.clippy",
732 }),
733 expectedFlags: []string{
734 "--emit link",
735 "-o __SBOX_SANDBOX_DIR__/out/fizz_buzz",
736 "--emit dep-info=__SBOX_SANDBOX_DIR__/out/fizz_buzz.d.raw",
737 "foo.rs", // this is the entry point
738 },
739 },
740 {
741 name: "rust_ffi static lib variant",
742 moduleName: "librust_ffi",
743 variant: "android_arm64_armv8-a_static",
744 rustcExpectedFilesToCopy: android.Concat(sboxCompilationFiles, []string{
745 "foo.rs",
746 "src1.rs",
747 "static_only.rs",
748 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_static/librust_ffi.a.clippy",
749 "out/soong/.intermediates/defaults/rust/libstd/android_arm64_armv8-a_rlib/libstd.rlib",
750 }),
751 expectedFlags: []string{
752 "--emit link",
753 "-o __SBOX_SANDBOX_DIR__/out/librust_ffi.a",
754 "--emit dep-info=__SBOX_SANDBOX_DIR__/out/librust_ffi.a.d.raw",
755 "foo.rs", // this is the entry point
756 },
757 },
758 {
759 name: "rust_ffi shared lib variant",
760 moduleName: "librust_ffi",
761 variant: "android_arm64_armv8-a_shared",
762 rustcExpectedFilesToCopy: android.Concat(sboxCompilationFiles, sboxCompilationFilesWithCc, []string{
763 "foo.rs",
764 "src1.rs",
765 "shared_only.rs",
766
767 "out/soong/.intermediates/defaults/rust/libstd/android_arm64_armv8-a_dylib/unstripped/libstd.dylib.so",
768 "out/soong/.intermediates/defaults/cc/common/crtbegin_so/android_arm64_armv8-a/crtbegin_so.o",
769 "out/soong/.intermediates/defaults/cc/common/crtend_so/android_arm64_armv8-a/crtend_so.o",
770 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/librust_ffi.so.clippy",
771 }),
772 expectedFlags: []string{
773 "--emit link",
774 "-o __SBOX_SANDBOX_DIR__/out/librust_ffi.so",
775 "--emit dep-info=__SBOX_SANDBOX_DIR__/out/librust_ffi.so.d.raw",
776 "foo.rs", // this is the entry point
777 },
778 },
779 {
780 name: "rust_library with cc deps (dylib)",
781 moduleName: "libfizz_buzz_cc_deps",
782 variant: "android_arm64_armv8-a_dylib",
783 rustcExpectedFilesToCopy: []string{
784 "out/soong/.intermediates/cc_dep_static/android_arm64_armv8-a_static/cc_dep_static.a",
785 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so",
786 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so.toc",
787 },
788 },
789 {
790 name: "rust_library with cc deps (rlib rlib-std)",
791 moduleName: "libfizz_buzz_cc_deps",
792 variant: "android_arm64_armv8-a_rlib_rlib-std",
793 rustcExpectedFilesToCopy: []string{
794 "out/soong/.intermediates/cc_dep_static/android_arm64_armv8-a_static/cc_dep_static.a",
795 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so",
796 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so.toc",
797 },
798 },
799 {
800 name: "rust_library with cc deps (rlib dylib-std)",
801 moduleName: "libfizz_buzz_cc_deps",
802 variant: "android_arm64_armv8-a_rlib_dylib-std",
803 rustcExpectedFilesToCopy: []string{
804 "out/soong/.intermediates/cc_dep_static/android_arm64_armv8-a_static/cc_dep_static.a",
805 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so",
806 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so.toc",
807 },
808 },
809 {
810 name: "rust_library with transitive cc deps (dylib)",
811 moduleName: "libfizz_buzz_transitive_cc_deps",
812 variant: "android_arm64_armv8-a_dylib",
813 rustcExpectedFilesToCopy: []string{
814 "out/soong/.intermediates/cc_dep_static/android_arm64_armv8-a_static/cc_dep_static.a",
815 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so",
816 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so.toc",
817 },
818 },
819 {
820 name: "rust_library with transitive cc deps (rlib rlib-std)",
821 moduleName: "libfizz_buzz_transitive_cc_deps",
822 variant: "android_arm64_armv8-a_rlib_rlib-std",
823 rustcExpectedFilesToCopy: []string{
824 "out/soong/.intermediates/cc_dep_static/android_arm64_armv8-a_static/cc_dep_static.a",
825 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so",
826 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so.toc",
827 },
828 },
829 {
830 name: "rust_library with transitive cc deps (rlib dylib-std)",
831 moduleName: "libfizz_buzz_transitive_cc_deps",
832 variant: "android_arm64_armv8-a_rlib_dylib-std",
833 rustcExpectedFilesToCopy: []string{
834 "out/soong/.intermediates/cc_dep_static/android_arm64_armv8-a_static/cc_dep_static.a",
835 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so",
836 "out/soong/.intermediates/cc_dep_shared/android_arm64_armv8-a_shared/cc_dep_shared.so.toc",
837 },
838 },
839 }
840
841 for _, tc := range testcases {
842 t.Run(tc.name, func(t *testing.T) {
843 writeFile := ctx.ModuleForTests(tc.moduleName, tc.variant).Rule("unescapedWriteFile")
844 contents := writeFile.BuildParams.Args["content"]
845 manifestProto := sbox_proto.Manifest{}
846 err := prototext.Unmarshal([]byte(contents), &manifestProto)
847 if err != nil {
848 t.Errorf("expected no errors unmarshaling manifest proto; got %v", err)
849 }
850
851 if len(manifestProto.Commands) != 1 {
852 t.Errorf("expected 1 command; got %v", len(manifestProto.Commands))
853 }
854
855 // check that sandbox contains correct files
856 rustc := manifestProto.Commands[0]
857 actualFilesToCopy := []string{}
858 for _, copy := range rustc.CopyBefore {
859 actualFilesToCopy = append(actualFilesToCopy, copy.GetFrom())
860 }
861 _, expectedFilesNotCopied, _ := android.ListSetDifference(tc.rustcExpectedFilesToCopy, actualFilesToCopy)
862 if len(expectedFilesNotCopied) > 0 {
863 t.Errorf("did not copy expected files to sbox: %v;\n files copied: %v", expectedFilesNotCopied, actualFilesToCopy)
864 }
865
866 rustcCmd := proptools.String(rustc.Command)
867 for _, flag := range tc.expectedFlags {
868 android.AssertStringDoesContain(
869 t,
870 fmt.Sprintf(
871 "missing flag in rustc invocation; expected to find substring %q; got %q",
872 flag,
873 rustcCmd,
874 ),
875 rustcCmd,
876 flag,
877 )
878 }
879 })
880 }
881}