1// Copyright 2020 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 ( 18 "strings" 19 "testing" 20 21 "android/soong/android" 22 "android/soong/cc" 23) 24 25// Test that cc modules can link against vendor_available rust_ffi_static libraries. 26func TestVendorLinkage(t *testing.T) { 27 ctx := testRustVndk(t, ` 28 cc_binary { 29 name: "fizz_vendor", 30 static_libs: ["libfoo_vendor"], 31 soc_specific: true, 32 } 33 rust_ffi_static { 34 name: "libfoo_vendor", 35 crate_name: "foo", 36 srcs: ["foo.rs"], 37 vendor_available: true, 38 } 39 `) 40 41 vendorBinary := ctx.ModuleForTests("fizz_vendor", "android_vendor.29_arm64_armv8-a").Module().(*cc.Module) 42 43 if !android.InList("libfoo_vendor.vendor", vendorBinary.Properties.AndroidMkStaticLibs) { 44 t.Errorf("vendorBinary should have a dependency on libfoo_vendor: %#v", vendorBinary.Properties.AndroidMkStaticLibs) 45 } 46} 47 48// Test that variants which use the vndk emit the appropriate cfg flag. 49func TestImageVndkCfgFlag(t *testing.T) { 50 ctx := testRustVndk(t, ` 51 rust_ffi_static { 52 name: "libfoo", 53 crate_name: "foo", 54 srcs: ["foo.rs"], 55 vendor_available: true, 56 } 57 `) 58 59 vendor := ctx.ModuleForTests("libfoo", "android_vendor.29_arm64_armv8-a_static").Rule("rustc") 60 61 if !strings.Contains(vendor.Args["rustcFlags"], "--cfg 'android_vndk'") { 62 t.Errorf("missing \"--cfg 'android_vndk'\" for libfoo vendor variant, rustcFlags: %#v", vendor.Args["rustcFlags"]) 63 } 64} 65 66// Test that cc modules can link against vendor_ramdisk_available rust_ffi_static libraries. 67func TestVendorRamdiskLinkage(t *testing.T) { 68 ctx := testRustVndk(t, ` 69 cc_library_static { 70 name: "libcc_vendor_ramdisk", 71 static_libs: ["libfoo_vendor_ramdisk"], 72 system_shared_libs: [], 73 vendor_ramdisk_available: true, 74 } 75 rust_ffi_static { 76 name: "libfoo_vendor_ramdisk", 77 crate_name: "foo", 78 srcs: ["foo.rs"], 79 vendor_ramdisk_available: true, 80 } 81 `) 82 83 vendorRamdiskLibrary := ctx.ModuleForTests("libcc_vendor_ramdisk", "android_vendor_ramdisk_arm64_armv8-a_static").Module().(*cc.Module) 84 85 if !android.InList("libfoo_vendor_ramdisk.vendor_ramdisk", vendorRamdiskLibrary.Properties.AndroidMkStaticLibs) { 86 t.Errorf("libcc_vendor_ramdisk should have a dependency on libfoo_vendor_ramdisk") 87 } 88} 89 90// Test that prebuilt libraries cannot be made vendor available. 91func TestForbiddenVendorLinkage(t *testing.T) { 92 testRustVndkError(t, "Rust prebuilt modules not supported for non-system images.", ` 93 rust_prebuilt_library { 94 name: "librust_prebuilt", 95 crate_name: "rust_prebuilt", 96 rlib: { 97 srcs: ["libtest.rlib"], 98 }, 99 dylib: { 100 srcs: ["libtest.so"], 101 }, 102 vendor: true, 103 } 104 `) 105} 106