1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage rust 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "strings" 19*333d2b36SAndroid Build Coastguard Worker "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker// Test that cc modules can depend on vendor_available rust_ffi_rlib/rust_ffi_static libraries. 26*333d2b36SAndroid Build Coastguard Workerfunc TestVendorLinkage(t *testing.T) { 27*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 28*333d2b36SAndroid Build Coastguard Worker cc_binary { 29*333d2b36SAndroid Build Coastguard Worker name: "fizz_vendor_available", 30*333d2b36SAndroid Build Coastguard Worker static_libs: [ 31*333d2b36SAndroid Build Coastguard Worker "libfoo_vendor", 32*333d2b36SAndroid Build Coastguard Worker "libfoo_vendor_static" 33*333d2b36SAndroid Build Coastguard Worker ], 34*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 35*333d2b36SAndroid Build Coastguard Worker } 36*333d2b36SAndroid Build Coastguard Worker cc_binary { 37*333d2b36SAndroid Build Coastguard Worker name: "fizz_soc_specific", 38*333d2b36SAndroid Build Coastguard Worker static_libs: ["libfoo_vendor"], 39*333d2b36SAndroid Build Coastguard Worker soc_specific: true, 40*333d2b36SAndroid Build Coastguard Worker } 41*333d2b36SAndroid Build Coastguard Worker rust_ffi_rlib { 42*333d2b36SAndroid Build Coastguard Worker name: "libfoo_vendor", 43*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 44*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 45*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 46*333d2b36SAndroid Build Coastguard Worker } 47*333d2b36SAndroid Build Coastguard Worker rust_ffi_static { 48*333d2b36SAndroid Build Coastguard Worker name: "libfoo_vendor_static", 49*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 50*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 51*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 52*333d2b36SAndroid Build Coastguard Worker } 53*333d2b36SAndroid Build Coastguard Worker `) 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Worker vendorBinary := ctx.ModuleForTests("fizz_vendor_available", "android_vendor_arm64_armv8-a").Module().(*cc.Module) 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker if android.InList("libfoo_vendor_static.vendor", vendorBinary.Properties.AndroidMkStaticLibs) { 58*333d2b36SAndroid Build Coastguard Worker t.Errorf("vendorBinary should not have a staticlib dependency on libfoo_vendor_static.vendor: %#v", vendorBinary.Properties.AndroidMkStaticLibs) 59*333d2b36SAndroid Build Coastguard Worker } 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker// Test that variants which use the vndk emit the appropriate cfg flag. 63*333d2b36SAndroid Build Coastguard Workerfunc TestImageCfgFlag(t *testing.T) { 64*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 65*333d2b36SAndroid Build Coastguard Worker rust_ffi_shared { 66*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 67*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 68*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 69*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 70*333d2b36SAndroid Build Coastguard Worker product_available: true, 71*333d2b36SAndroid Build Coastguard Worker } 72*333d2b36SAndroid Build Coastguard Worker `) 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker vendor := ctx.ModuleForTests("libfoo", "android_vendor_arm64_armv8-a_shared").Rule("rustc") 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(vendor.Args["rustcFlags"], "--cfg 'android_vndk'") { 77*333d2b36SAndroid Build Coastguard Worker t.Errorf("missing \"--cfg 'android_vndk'\" for libfoo vendor variant, rustcFlags: %#v", vendor.Args["rustcFlags"]) 78*333d2b36SAndroid Build Coastguard Worker } 79*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(vendor.Args["rustcFlags"], "--cfg 'android_vendor'") { 80*333d2b36SAndroid Build Coastguard Worker t.Errorf("missing \"--cfg 'android_vendor'\" for libfoo vendor variant, rustcFlags: %#v", vendor.Args["rustcFlags"]) 81*333d2b36SAndroid Build Coastguard Worker } 82*333d2b36SAndroid Build Coastguard Worker if strings.Contains(vendor.Args["rustcFlags"], "--cfg 'android_product'") { 83*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected \"--cfg 'android_product'\" for libfoo vendor variant, rustcFlags: %#v", vendor.Args["rustcFlags"]) 84*333d2b36SAndroid Build Coastguard Worker } 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Worker product := ctx.ModuleForTests("libfoo", "android_product_arm64_armv8-a_shared").Rule("rustc") 87*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(product.Args["rustcFlags"], "--cfg 'android_vndk'") { 88*333d2b36SAndroid Build Coastguard Worker t.Errorf("missing \"--cfg 'android_vndk'\" for libfoo product variant, rustcFlags: %#v", product.Args["rustcFlags"]) 89*333d2b36SAndroid Build Coastguard Worker } 90*333d2b36SAndroid Build Coastguard Worker if strings.Contains(product.Args["rustcFlags"], "--cfg 'android_vendor'") { 91*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected \"--cfg 'android_vendor'\" for libfoo product variant, rustcFlags: %#v", product.Args["rustcFlags"]) 92*333d2b36SAndroid Build Coastguard Worker } 93*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(product.Args["rustcFlags"], "--cfg 'android_product'") { 94*333d2b36SAndroid Build Coastguard Worker t.Errorf("missing \"--cfg 'android_product'\" for libfoo product variant, rustcFlags: %#v", product.Args["rustcFlags"]) 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker system := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("rustc") 98*333d2b36SAndroid Build Coastguard Worker if strings.Contains(system.Args["rustcFlags"], "--cfg 'android_vndk'") { 99*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected \"--cfg 'android_vndk'\" for libfoo system variant, rustcFlags: %#v", system.Args["rustcFlags"]) 100*333d2b36SAndroid Build Coastguard Worker } 101*333d2b36SAndroid Build Coastguard Worker if strings.Contains(system.Args["rustcFlags"], "--cfg 'android_vendor'") { 102*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected \"--cfg 'android_vendor'\" for libfoo system variant, rustcFlags: %#v", system.Args["rustcFlags"]) 103*333d2b36SAndroid Build Coastguard Worker } 104*333d2b36SAndroid Build Coastguard Worker if strings.Contains(system.Args["rustcFlags"], "--cfg 'android_product'") { 105*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected \"--cfg 'android_product'\" for libfoo system variant, rustcFlags: %#v", product.Args["rustcFlags"]) 106*333d2b36SAndroid Build Coastguard Worker } 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Worker} 109*333d2b36SAndroid Build Coastguard Worker 110*333d2b36SAndroid Build Coastguard Worker// Test that cc modules can link against vendor_ramdisk_available rust_ffi_rlib and rust_ffi_static libraries. 111*333d2b36SAndroid Build Coastguard Workerfunc TestVendorRamdiskLinkage(t *testing.T) { 112*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 113*333d2b36SAndroid Build Coastguard Worker cc_library_shared { 114*333d2b36SAndroid Build Coastguard Worker name: "libcc_vendor_ramdisk", 115*333d2b36SAndroid Build Coastguard Worker static_libs: [ 116*333d2b36SAndroid Build Coastguard Worker "libfoo_vendor_ramdisk", 117*333d2b36SAndroid Build Coastguard Worker "libfoo_static_vendor_ramdisk" 118*333d2b36SAndroid Build Coastguard Worker ], 119*333d2b36SAndroid Build Coastguard Worker system_shared_libs: [], 120*333d2b36SAndroid Build Coastguard Worker vendor_ramdisk_available: true, 121*333d2b36SAndroid Build Coastguard Worker } 122*333d2b36SAndroid Build Coastguard Worker rust_ffi_rlib { 123*333d2b36SAndroid Build Coastguard Worker name: "libfoo_vendor_ramdisk", 124*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 125*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 126*333d2b36SAndroid Build Coastguard Worker vendor_ramdisk_available: true, 127*333d2b36SAndroid Build Coastguard Worker } 128*333d2b36SAndroid Build Coastguard Worker rust_ffi_static { 129*333d2b36SAndroid Build Coastguard Worker name: "libfoo_static_vendor_ramdisk", 130*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 131*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 132*333d2b36SAndroid Build Coastguard Worker vendor_ramdisk_available: true, 133*333d2b36SAndroid Build Coastguard Worker } 134*333d2b36SAndroid Build Coastguard Worker `) 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker vendorRamdiskLibrary := ctx.ModuleForTests("libcc_vendor_ramdisk", "android_vendor_ramdisk_arm64_armv8-a_shared").Module().(*cc.Module) 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker if android.InList("libfoo_static_vendor_ramdisk.vendor_ramdisk", vendorRamdiskLibrary.Properties.AndroidMkStaticLibs) { 139*333d2b36SAndroid Build Coastguard Worker t.Errorf("libcc_vendor_ramdisk should not have a dependency on the libfoo_static_vendor_ramdisk static library") 140*333d2b36SAndroid Build Coastguard Worker } 141*333d2b36SAndroid Build Coastguard Worker} 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker// Test that prebuilt libraries cannot be made vendor available. 144*333d2b36SAndroid Build Coastguard Workerfunc TestForbiddenVendorLinkage(t *testing.T) { 145*333d2b36SAndroid Build Coastguard Worker testRustError(t, "Rust prebuilt modules not supported for non-system images.", ` 146*333d2b36SAndroid Build Coastguard Worker rust_prebuilt_library { 147*333d2b36SAndroid Build Coastguard Worker name: "librust_prebuilt", 148*333d2b36SAndroid Build Coastguard Worker crate_name: "rust_prebuilt", 149*333d2b36SAndroid Build Coastguard Worker rlib: { 150*333d2b36SAndroid Build Coastguard Worker srcs: ["libtest.rlib"], 151*333d2b36SAndroid Build Coastguard Worker }, 152*333d2b36SAndroid Build Coastguard Worker dylib: { 153*333d2b36SAndroid Build Coastguard Worker srcs: ["libtest.so"], 154*333d2b36SAndroid Build Coastguard Worker }, 155*333d2b36SAndroid Build Coastguard Worker vendor: true, 156*333d2b36SAndroid Build Coastguard Worker } 157*333d2b36SAndroid Build Coastguard Worker `) 158*333d2b36SAndroid Build Coastguard Worker} 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Workerfunc checkInstallPartition(t *testing.T, ctx *android.TestContext, name, variant, expected string) { 161*333d2b36SAndroid Build Coastguard Worker mod := ctx.ModuleForTests(name, variant).Module().(*Module) 162*333d2b36SAndroid Build Coastguard Worker partitionDefined := false 163*333d2b36SAndroid Build Coastguard Worker checkPartition := func(specific bool, partition string) { 164*333d2b36SAndroid Build Coastguard Worker if specific { 165*333d2b36SAndroid Build Coastguard Worker if expected != partition && !partitionDefined { 166*333d2b36SAndroid Build Coastguard Worker // The variant is installed to the 'partition' 167*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s variant of %q must not be installed to %s partition", variant, name, partition) 168*333d2b36SAndroid Build Coastguard Worker } 169*333d2b36SAndroid Build Coastguard Worker partitionDefined = true 170*333d2b36SAndroid Build Coastguard Worker } else { 171*333d2b36SAndroid Build Coastguard Worker // The variant is not installed to the 'partition' 172*333d2b36SAndroid Build Coastguard Worker if expected == partition { 173*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s variant of %q must be installed to %s partition", variant, name, partition) 174*333d2b36SAndroid Build Coastguard Worker } 175*333d2b36SAndroid Build Coastguard Worker } 176*333d2b36SAndroid Build Coastguard Worker } 177*333d2b36SAndroid Build Coastguard Worker socSpecific := func(m *Module) bool { 178*333d2b36SAndroid Build Coastguard Worker return m.SocSpecific() 179*333d2b36SAndroid Build Coastguard Worker } 180*333d2b36SAndroid Build Coastguard Worker deviceSpecific := func(m *Module) bool { 181*333d2b36SAndroid Build Coastguard Worker return m.DeviceSpecific() 182*333d2b36SAndroid Build Coastguard Worker } 183*333d2b36SAndroid Build Coastguard Worker productSpecific := func(m *Module) bool { 184*333d2b36SAndroid Build Coastguard Worker return m.ProductSpecific() || m.productSpecificModuleContext() 185*333d2b36SAndroid Build Coastguard Worker } 186*333d2b36SAndroid Build Coastguard Worker systemExtSpecific := func(m *Module) bool { 187*333d2b36SAndroid Build Coastguard Worker return m.SystemExtSpecific() 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker checkPartition(socSpecific(mod), "vendor") 190*333d2b36SAndroid Build Coastguard Worker checkPartition(deviceSpecific(mod), "odm") 191*333d2b36SAndroid Build Coastguard Worker checkPartition(productSpecific(mod), "product") 192*333d2b36SAndroid Build Coastguard Worker checkPartition(systemExtSpecific(mod), "system_ext") 193*333d2b36SAndroid Build Coastguard Worker if !partitionDefined && expected != "system" { 194*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s variant of %q is expected to be installed to %s partition,"+ 195*333d2b36SAndroid Build Coastguard Worker " but installed to system partition", variant, name, expected) 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker} 198*333d2b36SAndroid Build Coastguard Worker 199*333d2b36SAndroid Build Coastguard Workerfunc TestInstallPartition(t *testing.T) { 200*333d2b36SAndroid Build Coastguard Worker t.Parallel() 201*333d2b36SAndroid Build Coastguard Worker t.Helper() 202*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 203*333d2b36SAndroid Build Coastguard Worker rust_binary { 204*333d2b36SAndroid Build Coastguard Worker name: "sample_system", 205*333d2b36SAndroid Build Coastguard Worker crate_name: "sample", 206*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 207*333d2b36SAndroid Build Coastguard Worker } 208*333d2b36SAndroid Build Coastguard Worker rust_binary { 209*333d2b36SAndroid Build Coastguard Worker name: "sample_system_ext", 210*333d2b36SAndroid Build Coastguard Worker crate_name: "sample", 211*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 212*333d2b36SAndroid Build Coastguard Worker system_ext_specific: true, 213*333d2b36SAndroid Build Coastguard Worker } 214*333d2b36SAndroid Build Coastguard Worker rust_binary { 215*333d2b36SAndroid Build Coastguard Worker name: "sample_product", 216*333d2b36SAndroid Build Coastguard Worker crate_name: "sample", 217*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 218*333d2b36SAndroid Build Coastguard Worker product_specific: true, 219*333d2b36SAndroid Build Coastguard Worker } 220*333d2b36SAndroid Build Coastguard Worker rust_binary { 221*333d2b36SAndroid Build Coastguard Worker name: "sample_vendor", 222*333d2b36SAndroid Build Coastguard Worker crate_name: "sample", 223*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 224*333d2b36SAndroid Build Coastguard Worker vendor: true, 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker rust_binary { 227*333d2b36SAndroid Build Coastguard Worker name: "sample_odm", 228*333d2b36SAndroid Build Coastguard Worker crate_name: "sample", 229*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 230*333d2b36SAndroid Build Coastguard Worker device_specific: true, 231*333d2b36SAndroid Build Coastguard Worker } 232*333d2b36SAndroid Build Coastguard Worker rust_binary { 233*333d2b36SAndroid Build Coastguard Worker name: "sample_all_available", 234*333d2b36SAndroid Build Coastguard Worker crate_name: "sample", 235*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 236*333d2b36SAndroid Build Coastguard Worker vendor_available: true, 237*333d2b36SAndroid Build Coastguard Worker product_available: true, 238*333d2b36SAndroid Build Coastguard Worker } 239*333d2b36SAndroid Build Coastguard Worker `) 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "sample_system", binaryCoreVariant, "system") 242*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "sample_system_ext", binaryCoreVariant, "system_ext") 243*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "sample_product", binaryProductVariant, "product") 244*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "sample_vendor", binaryVendorVariant, "vendor") 245*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "sample_odm", binaryVendorVariant, "odm") 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Worker checkInstallPartition(t, ctx, "sample_all_available", binaryCoreVariant, "system") 248*333d2b36SAndroid Build Coastguard Worker} 249