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