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 "strings" 19*333d2b36SAndroid Build Coastguard Worker "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker// Test that feature flags are being correctly generated. 25*333d2b36SAndroid Build Coastguard Workerfunc TestFeaturesToFlags(t *testing.T) { 26*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 27*333d2b36SAndroid Build Coastguard Worker rust_library_host_dylib { 28*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 29*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 30*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 31*333d2b36SAndroid Build Coastguard Worker features: [ 32*333d2b36SAndroid Build Coastguard Worker "fizz", 33*333d2b36SAndroid Build Coastguard Worker "buzz" 34*333d2b36SAndroid Build Coastguard Worker ], 35*333d2b36SAndroid Build Coastguard Worker }`) 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Worker libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'feature=\"fizz\"'") || 40*333d2b36SAndroid Build Coastguard Worker !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'feature=\"buzz\"'") { 41*333d2b36SAndroid Build Coastguard Worker t.Fatalf("missing fizz and buzz feature flags for libfoo dylib, rustcFlags: %#v", libfooDylib.Args["rustcFlags"]) 42*333d2b36SAndroid Build Coastguard Worker } 43*333d2b36SAndroid Build Coastguard Worker} 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker// Test that cfgs flags are being correctly generated. 46*333d2b36SAndroid Build Coastguard Workerfunc TestCfgsToFlags(t *testing.T) { 47*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 48*333d2b36SAndroid Build Coastguard Worker rust_library_host { 49*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 50*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 51*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 52*333d2b36SAndroid Build Coastguard Worker cfgs: [ 53*333d2b36SAndroid Build Coastguard Worker "std", 54*333d2b36SAndroid Build Coastguard Worker "cfg1=\"one\"" 55*333d2b36SAndroid Build Coastguard Worker ], 56*333d2b36SAndroid Build Coastguard Worker }`) 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'std'") || 61*333d2b36SAndroid Build Coastguard Worker !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'cfg1=\"one\"'") { 62*333d2b36SAndroid Build Coastguard Worker t.Fatalf("missing std and cfg1 flags for libfoo dylib, rustcFlags: %#v", libfooDylib.Args["rustcFlags"]) 63*333d2b36SAndroid Build Coastguard Worker } 64*333d2b36SAndroid Build Coastguard Worker} 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Workerfunc TestLtoFlag(t *testing.T) { 67*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 68*333d2b36SAndroid Build Coastguard Worker rust_library_host { 69*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 70*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 71*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 72*333d2b36SAndroid Build Coastguard Worker lto: { 73*333d2b36SAndroid Build Coastguard Worker thin: false, 74*333d2b36SAndroid Build Coastguard Worker } 75*333d2b36SAndroid Build Coastguard Worker } 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker rust_library_host { 78*333d2b36SAndroid Build Coastguard Worker name: "libfoo_lto", 79*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 80*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 81*333d2b36SAndroid Build Coastguard Worker } 82*333d2b36SAndroid Build Coastguard Worker `) 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Worker libfoo := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") 85*333d2b36SAndroid Build Coastguard Worker libfooLto := ctx.ModuleForTests("libfoo_lto", "linux_glibc_x86_64_dylib").Rule("rustc") 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker if strings.Contains(libfoo.Args["rustcFlags"], "-C lto=thin") { 88*333d2b36SAndroid Build Coastguard Worker t.Fatalf("libfoo expected to disable lto -- rustcFlags: %#v", libfoo.Args["rustcFlags"]) 89*333d2b36SAndroid Build Coastguard Worker } 90*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(libfooLto.Args["rustcFlags"], "-C lto=thin") { 91*333d2b36SAndroid Build Coastguard Worker t.Fatalf("libfoo expected to enable lto by default -- rustcFlags: %#v", libfooLto.Args["rustcFlags"]) 92*333d2b36SAndroid Build Coastguard Worker } 93*333d2b36SAndroid Build Coastguard Worker} 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker// Test that we reject multiple source files. 96*333d2b36SAndroid Build Coastguard Workerfunc TestEnforceSingleSourceFile(t *testing.T) { 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Worker singleSrcError := "srcs can only contain one path for a rust file and source providers prefixed by \":\"" 99*333d2b36SAndroid Build Coastguard Worker prebuiltSingleSrcError := "prebuilt libraries can only have one entry in srcs" 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker // Test libraries 102*333d2b36SAndroid Build Coastguard Worker testRustError(t, singleSrcError, ` 103*333d2b36SAndroid Build Coastguard Worker rust_library_host { 104*333d2b36SAndroid Build Coastguard Worker name: "foo-bar-library", 105*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs", "src/bar.rs"], 106*333d2b36SAndroid Build Coastguard Worker }`) 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Worker // Test binaries 109*333d2b36SAndroid Build Coastguard Worker testRustError(t, singleSrcError, ` 110*333d2b36SAndroid Build Coastguard Worker rust_binary_host { 111*333d2b36SAndroid Build Coastguard Worker name: "foo-bar-binary", 112*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs", "src/bar.rs"], 113*333d2b36SAndroid Build Coastguard Worker }`) 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker // Test proc_macros 116*333d2b36SAndroid Build Coastguard Worker testRustError(t, singleSrcError, ` 117*333d2b36SAndroid Build Coastguard Worker rust_proc_macro { 118*333d2b36SAndroid Build Coastguard Worker name: "foo-bar-proc-macro", 119*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs", "src/bar.rs"], 120*333d2b36SAndroid Build Coastguard Worker }`) 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker // Test prebuilts 123*333d2b36SAndroid Build Coastguard Worker testRustError(t, prebuiltSingleSrcError, ` 124*333d2b36SAndroid Build Coastguard Worker rust_prebuilt_dylib { 125*333d2b36SAndroid Build Coastguard Worker name: "foo-bar-prebuilt", 126*333d2b36SAndroid Build Coastguard Worker srcs: ["liby.so", "libz.so"], 127*333d2b36SAndroid Build Coastguard Worker host_supported: true, 128*333d2b36SAndroid Build Coastguard Worker }`) 129*333d2b36SAndroid Build Coastguard Worker} 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Worker// Test that we reject _no_ source files. 132*333d2b36SAndroid Build Coastguard Workerfunc TestEnforceMissingSourceFiles(t *testing.T) { 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker singleSrcError := "srcs must not be empty" 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker // Test libraries 137*333d2b36SAndroid Build Coastguard Worker testRustError(t, singleSrcError, ` 138*333d2b36SAndroid Build Coastguard Worker rust_library_host { 139*333d2b36SAndroid Build Coastguard Worker name: "foo-bar-library", 140*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 141*333d2b36SAndroid Build Coastguard Worker }`) 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker // Test binaries 144*333d2b36SAndroid Build Coastguard Worker testRustError(t, singleSrcError, ` 145*333d2b36SAndroid Build Coastguard Worker rust_binary_host { 146*333d2b36SAndroid Build Coastguard Worker name: "foo-bar-binary", 147*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 148*333d2b36SAndroid Build Coastguard Worker }`) 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker // Test proc_macros 151*333d2b36SAndroid Build Coastguard Worker testRustError(t, singleSrcError, ` 152*333d2b36SAndroid Build Coastguard Worker rust_proc_macro { 153*333d2b36SAndroid Build Coastguard Worker name: "foo-bar-proc-macro", 154*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 155*333d2b36SAndroid Build Coastguard Worker }`) 156*333d2b36SAndroid Build Coastguard Worker 157*333d2b36SAndroid Build Coastguard Worker // Test prebuilts 158*333d2b36SAndroid Build Coastguard Worker testRustError(t, singleSrcError, ` 159*333d2b36SAndroid Build Coastguard Worker rust_prebuilt_dylib { 160*333d2b36SAndroid Build Coastguard Worker name: "foo-bar-prebuilt", 161*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 162*333d2b36SAndroid Build Coastguard Worker host_supported: true, 163*333d2b36SAndroid Build Coastguard Worker }`) 164*333d2b36SAndroid Build Coastguard Worker} 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Worker// Test environment vars for Cargo compat are set. 167*333d2b36SAndroid Build Coastguard Workerfunc TestCargoCompat(t *testing.T) { 168*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 169*333d2b36SAndroid Build Coastguard Worker rust_binary { 170*333d2b36SAndroid Build Coastguard Worker name: "fizz", 171*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 172*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 173*333d2b36SAndroid Build Coastguard Worker cargo_env_compat: true, 174*333d2b36SAndroid Build Coastguard Worker cargo_pkg_version: "1.0.0" 175*333d2b36SAndroid Build Coastguard Worker }`) 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Rule("rustc") 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(fizz.Args["envVars"], "CARGO_BIN_NAME=fizz") { 180*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected 'CARGO_BIN_NAME=fizz' in envVars, actual envVars: %#v", fizz.Args["envVars"]) 181*333d2b36SAndroid Build Coastguard Worker } 182*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(fizz.Args["envVars"], "CARGO_CRATE_NAME=foo") { 183*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected 'CARGO_CRATE_NAME=foo' in envVars, actual envVars: %#v", fizz.Args["envVars"]) 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(fizz.Args["envVars"], "CARGO_PKG_VERSION=1.0.0") { 186*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected 'CARGO_PKG_VERSION=1.0.0' in envVars, actual envVars: %#v", fizz.Args["envVars"]) 187*333d2b36SAndroid Build Coastguard Worker } 188*333d2b36SAndroid Build Coastguard Worker} 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Workerfunc TestInstallDir(t *testing.T) { 191*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 192*333d2b36SAndroid Build Coastguard Worker rust_library_dylib { 193*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 194*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 195*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker rust_binary { 198*333d2b36SAndroid Build Coastguard Worker name: "fizzbuzz", 199*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 200*333d2b36SAndroid Build Coastguard Worker }`) 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Worker install_path_lib64 := ctx.ModuleForTests("libfoo", 203*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a_dylib").Module().(*Module).compiler.(*libraryDecorator).path.String() 204*333d2b36SAndroid Build Coastguard Worker install_path_lib32 := ctx.ModuleForTests("libfoo", 205*333d2b36SAndroid Build Coastguard Worker "android_arm_armv7-a-neon_dylib").Module().(*Module).compiler.(*libraryDecorator).path.String() 206*333d2b36SAndroid Build Coastguard Worker install_path_bin := ctx.ModuleForTests("fizzbuzz", 207*333d2b36SAndroid Build Coastguard Worker "android_arm64_armv8-a").Module().(*Module).compiler.(*binaryDecorator).path.String() 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(install_path_lib64, "system/lib64/libfoo.dylib.so") { 210*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected install path for 64-bit library: %#v", install_path_lib64) 211*333d2b36SAndroid Build Coastguard Worker } 212*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(install_path_lib32, "system/lib/libfoo.dylib.so") { 213*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected install path for 32-bit library: %#v", install_path_lib32) 214*333d2b36SAndroid Build Coastguard Worker } 215*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(install_path_bin, "system/bin/fizzbuzz") { 216*333d2b36SAndroid Build Coastguard Worker t.Fatalf("unexpected install path for binary: %#v", install_path_bin) 217*333d2b36SAndroid Build Coastguard Worker } 218*333d2b36SAndroid Build Coastguard Worker} 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Workerfunc TestLints(t *testing.T) { 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker bp := ` 223*333d2b36SAndroid Build Coastguard Worker // foo uses the default value of lints 224*333d2b36SAndroid Build Coastguard Worker rust_library { 225*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 226*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 227*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 228*333d2b36SAndroid Build Coastguard Worker } 229*333d2b36SAndroid Build Coastguard Worker // bar forces the use of the "android" lint set 230*333d2b36SAndroid Build Coastguard Worker rust_library { 231*333d2b36SAndroid Build Coastguard Worker name: "libbar", 232*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 233*333d2b36SAndroid Build Coastguard Worker crate_name: "bar", 234*333d2b36SAndroid Build Coastguard Worker lints: "android", 235*333d2b36SAndroid Build Coastguard Worker } 236*333d2b36SAndroid Build Coastguard Worker // foobar explicitly disable all lints 237*333d2b36SAndroid Build Coastguard Worker rust_library { 238*333d2b36SAndroid Build Coastguard Worker name: "libfoobar", 239*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 240*333d2b36SAndroid Build Coastguard Worker crate_name: "foobar", 241*333d2b36SAndroid Build Coastguard Worker lints: "none", 242*333d2b36SAndroid Build Coastguard Worker }` 243*333d2b36SAndroid Build Coastguard Worker 244*333d2b36SAndroid Build Coastguard Worker var lintTests = []struct { 245*333d2b36SAndroid Build Coastguard Worker modulePath string 246*333d2b36SAndroid Build Coastguard Worker fooFlags string 247*333d2b36SAndroid Build Coastguard Worker }{ 248*333d2b36SAndroid Build Coastguard Worker {"", "${config.RustDefaultLints}"}, 249*333d2b36SAndroid Build Coastguard Worker {"external/", "${config.RustAllowAllLints}"}, 250*333d2b36SAndroid Build Coastguard Worker {"hardware/", "${config.RustVendorLints}"}, 251*333d2b36SAndroid Build Coastguard Worker } 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Worker for _, tc := range lintTests { 254*333d2b36SAndroid Build Coastguard Worker t.Run("path="+tc.modulePath, func(t *testing.T) { 255*333d2b36SAndroid Build Coastguard Worker 256*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 257*333d2b36SAndroid Build Coastguard Worker prepareForRustTest, 258*333d2b36SAndroid Build Coastguard Worker // Test with the blueprint file in different directories. 259*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile(tc.modulePath+"Android.bp", bp), 260*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 261*333d2b36SAndroid Build Coastguard Worker 262*333d2b36SAndroid Build Coastguard Worker r := result.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").MaybeRule("rustc") 263*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "libfoo flags", r.Args["rustcFlags"], tc.fooFlags) 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Worker r = result.ModuleForTests("libbar", "android_arm64_armv8-a_dylib").MaybeRule("rustc") 266*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "libbar flags", r.Args["rustcFlags"], "${config.RustDefaultLints}") 267*333d2b36SAndroid Build Coastguard Worker 268*333d2b36SAndroid Build Coastguard Worker r = result.ModuleForTests("libfoobar", "android_arm64_armv8-a_dylib").MaybeRule("rustc") 269*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "libfoobar flags", r.Args["rustcFlags"], "${config.RustAllowAllLints}") 270*333d2b36SAndroid Build Coastguard Worker }) 271*333d2b36SAndroid Build Coastguard Worker } 272*333d2b36SAndroid Build Coastguard Worker} 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Worker// Test that devices are linking the stdlib dynamically 275*333d2b36SAndroid Build Coastguard Workerfunc TestStdDeviceLinkage(t *testing.T) { 276*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 277*333d2b36SAndroid Build Coastguard Worker rust_binary { 278*333d2b36SAndroid Build Coastguard Worker name: "fizz", 279*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 280*333d2b36SAndroid Build Coastguard Worker } 281*333d2b36SAndroid Build Coastguard Worker rust_library { 282*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 283*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 284*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 285*333d2b36SAndroid Build Coastguard Worker }`) 286*333d2b36SAndroid Build Coastguard Worker fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Module().(*Module) 287*333d2b36SAndroid Build Coastguard Worker fooRlib := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std").Module().(*Module) 288*333d2b36SAndroid Build Coastguard Worker fooDylib := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").Module().(*Module) 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Worker if !android.InList("libstd", fizz.Properties.AndroidMkDylibs) { 291*333d2b36SAndroid Build Coastguard Worker t.Errorf("libstd is not linked dynamically for device binaries") 292*333d2b36SAndroid Build Coastguard Worker } 293*333d2b36SAndroid Build Coastguard Worker if !android.InList("libstd", fooRlib.Properties.AndroidMkDylibs) { 294*333d2b36SAndroid Build Coastguard Worker t.Errorf("libstd is not linked dynamically for rlibs") 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker if !android.InList("libstd", fooDylib.Properties.AndroidMkDylibs) { 297*333d2b36SAndroid Build Coastguard Worker t.Errorf("libstd is not linked dynamically for dylibs") 298*333d2b36SAndroid Build Coastguard Worker } 299*333d2b36SAndroid Build Coastguard Worker} 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Worker// Ensure that manual link flags are disallowed. 302*333d2b36SAndroid Build Coastguard Workerfunc TestManualLinkageRejection(t *testing.T) { 303*333d2b36SAndroid Build Coastguard Worker // rustc flags 304*333d2b36SAndroid Build Coastguard Worker testRustError(t, ".* cannot be manually specified", ` 305*333d2b36SAndroid Build Coastguard Worker rust_binary { 306*333d2b36SAndroid Build Coastguard Worker name: "foo", 307*333d2b36SAndroid Build Coastguard Worker srcs: [ 308*333d2b36SAndroid Build Coastguard Worker "foo.rs", 309*333d2b36SAndroid Build Coastguard Worker ], 310*333d2b36SAndroid Build Coastguard Worker flags: ["-lbar"], 311*333d2b36SAndroid Build Coastguard Worker } 312*333d2b36SAndroid Build Coastguard Worker `) 313*333d2b36SAndroid Build Coastguard Worker testRustError(t, ".* cannot be manually specified", ` 314*333d2b36SAndroid Build Coastguard Worker rust_binary { 315*333d2b36SAndroid Build Coastguard Worker name: "foo", 316*333d2b36SAndroid Build Coastguard Worker srcs: [ 317*333d2b36SAndroid Build Coastguard Worker "foo.rs", 318*333d2b36SAndroid Build Coastguard Worker ], 319*333d2b36SAndroid Build Coastguard Worker flags: ["--extern=foo"], 320*333d2b36SAndroid Build Coastguard Worker } 321*333d2b36SAndroid Build Coastguard Worker `) 322*333d2b36SAndroid Build Coastguard Worker testRustError(t, ".* cannot be manually specified", ` 323*333d2b36SAndroid Build Coastguard Worker rust_binary { 324*333d2b36SAndroid Build Coastguard Worker name: "foo", 325*333d2b36SAndroid Build Coastguard Worker srcs: [ 326*333d2b36SAndroid Build Coastguard Worker "foo.rs", 327*333d2b36SAndroid Build Coastguard Worker ], 328*333d2b36SAndroid Build Coastguard Worker flags: ["-Clink-args=foo"], 329*333d2b36SAndroid Build Coastguard Worker } 330*333d2b36SAndroid Build Coastguard Worker `) 331*333d2b36SAndroid Build Coastguard Worker testRustError(t, ".* cannot be manually specified", ` 332*333d2b36SAndroid Build Coastguard Worker rust_binary { 333*333d2b36SAndroid Build Coastguard Worker name: "foo", 334*333d2b36SAndroid Build Coastguard Worker srcs: [ 335*333d2b36SAndroid Build Coastguard Worker "foo.rs", 336*333d2b36SAndroid Build Coastguard Worker ], 337*333d2b36SAndroid Build Coastguard Worker flags: ["-C link-args=foo"], 338*333d2b36SAndroid Build Coastguard Worker } 339*333d2b36SAndroid Build Coastguard Worker `) 340*333d2b36SAndroid Build Coastguard Worker testRustError(t, ".* cannot be manually specified", ` 341*333d2b36SAndroid Build Coastguard Worker rust_binary { 342*333d2b36SAndroid Build Coastguard Worker name: "foo", 343*333d2b36SAndroid Build Coastguard Worker srcs: [ 344*333d2b36SAndroid Build Coastguard Worker "foo.rs", 345*333d2b36SAndroid Build Coastguard Worker ], 346*333d2b36SAndroid Build Coastguard Worker flags: ["-L foo/"], 347*333d2b36SAndroid Build Coastguard Worker } 348*333d2b36SAndroid Build Coastguard Worker `) 349*333d2b36SAndroid Build Coastguard Worker 350*333d2b36SAndroid Build Coastguard Worker // lld flags 351*333d2b36SAndroid Build Coastguard Worker testRustError(t, ".* cannot be manually specified", ` 352*333d2b36SAndroid Build Coastguard Worker rust_binary { 353*333d2b36SAndroid Build Coastguard Worker name: "foo", 354*333d2b36SAndroid Build Coastguard Worker srcs: [ 355*333d2b36SAndroid Build Coastguard Worker "foo.rs", 356*333d2b36SAndroid Build Coastguard Worker ], 357*333d2b36SAndroid Build Coastguard Worker ld_flags: ["-Wl,-L bar/"], 358*333d2b36SAndroid Build Coastguard Worker } 359*333d2b36SAndroid Build Coastguard Worker `) 360*333d2b36SAndroid Build Coastguard Worker testRustError(t, ".* cannot be manually specified", ` 361*333d2b36SAndroid Build Coastguard Worker rust_binary { 362*333d2b36SAndroid Build Coastguard Worker name: "foo", 363*333d2b36SAndroid Build Coastguard Worker srcs: [ 364*333d2b36SAndroid Build Coastguard Worker "foo.rs", 365*333d2b36SAndroid Build Coastguard Worker ], 366*333d2b36SAndroid Build Coastguard Worker ld_flags: ["-Wl,-lbar"], 367*333d2b36SAndroid Build Coastguard Worker } 368*333d2b36SAndroid Build Coastguard Worker `) 369*333d2b36SAndroid Build Coastguard Worker} 370