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 "android/soong/android" 19 "sort" 20 "testing" 21) 22 23func TestSourceProviderCollision(t *testing.T) { 24 testRustError(t, "multiple source providers generate the same filename output: bindings.rs", ` 25 rust_binary { 26 name: "source_collider", 27 srcs: [ 28 "foo.rs", 29 ":libbindings1", 30 ":libbindings2", 31 ], 32 } 33 rust_bindgen { 34 name: "libbindings1", 35 source_stem: "bindings", 36 crate_name: "bindings1", 37 wrapper_src: "src/any.h", 38 } 39 rust_bindgen { 40 name: "libbindings2", 41 source_stem: "bindings", 42 crate_name: "bindings2", 43 wrapper_src: "src/any.h", 44 } 45 `) 46} 47 48func TestCompilationOutputFiles(t *testing.T) { 49 50 // Note: Rustdoc output is produced for the PrimaryModule, so if the variant 51 // order changes, then it may be produced for a different variant. 52 ctx := testRust(t, ` 53 rust_library { 54 name: "libfizz_buzz", 55 crate_name:"fizz_buzz", 56 srcs: ["lib.rs"], 57 } 58 rust_binary { 59 name: "fizz_buzz", 60 crate_name:"fizz_buzz", 61 srcs: ["lib.rs"], 62 } 63 rust_ffi { 64 name: "librust_ffi", 65 crate_name: "rust_ffi", 66 srcs: ["lib.rs"], 67 } 68 rust_ffi_static { 69 name: "librust_ffi_static", 70 crate_name: "rust_ffi", 71 srcs: ["lib.rs"], 72 } 73 `) 74 testcases := []struct { 75 testName string 76 moduleName string 77 variant string 78 expectedFiles []string 79 }{ 80 { 81 testName: "dylib", 82 moduleName: "libfizz_buzz", 83 variant: "android_arm64_armv8-a_dylib", 84 expectedFiles: []string{ 85 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/libfizz_buzz.dylib.so", 86 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/libfizz_buzz.dylib.so.clippy", 87 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/unstripped/libfizz_buzz.dylib.so", 88 "out/soong/target/product/test_device/system/lib64/libfizz_buzz.dylib.so", 89 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/meta_lic", 90 }, 91 }, 92 { 93 testName: "rlib dylib-std", 94 moduleName: "libfizz_buzz", 95 variant: "android_arm64_armv8-a_rlib_dylib-std", 96 expectedFiles: []string{ 97 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_dylib-std/libfizz_buzz.rlib", 98 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_dylib-std/libfizz_buzz.rlib.clippy", 99 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_dylib-std/meta_lic", 100 }, 101 }, 102 { 103 testName: "rlib rlib-std", 104 moduleName: "libfizz_buzz", 105 variant: "android_arm64_armv8-a_rlib_rlib-std", 106 expectedFiles: []string{ 107 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/libfizz_buzz.rlib", 108 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/libfizz_buzz.rlib.clippy", 109 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/meta_lic", 110 "out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/rustdoc.timestamp", 111 }, 112 }, 113 { 114 testName: "rust_binary", 115 moduleName: "fizz_buzz", 116 variant: "android_arm64_armv8-a", 117 expectedFiles: []string{ 118 "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/fizz_buzz", 119 "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/fizz_buzz.clippy", 120 "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/unstripped/fizz_buzz", 121 "out/soong/target/product/test_device/system/bin/fizz_buzz", 122 "out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/meta_lic", 123 }, 124 }, 125 { 126 testName: "rust_ffi_static rlib", 127 moduleName: "librust_ffi_static", 128 variant: "android_arm64_armv8-a_rlib_rlib-std", 129 expectedFiles: []string{ 130 "out/soong/.intermediates/librust_ffi_static/android_arm64_armv8-a_rlib_rlib-std/librust_ffi_static.rlib", 131 "out/soong/.intermediates/librust_ffi_static/android_arm64_armv8-a_rlib_rlib-std/librust_ffi_static.rlib.clippy", 132 "out/soong/.intermediates/librust_ffi_static/android_arm64_armv8-a_rlib_rlib-std/meta_lic", 133 "out/soong/.intermediates/librust_ffi_static/android_arm64_armv8-a_rlib_rlib-std/rustdoc.timestamp", 134 }, 135 }, 136 { 137 testName: "rust_ffi rlib", 138 moduleName: "librust_ffi", 139 variant: "android_arm64_armv8-a_rlib_rlib-std", 140 expectedFiles: []string{ 141 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_rlib_rlib-std/librust_ffi.rlib", 142 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_rlib_rlib-std/librust_ffi.rlib.clippy", 143 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_rlib_rlib-std/meta_lic", 144 }, 145 }, 146 { 147 testName: "rust_ffi shared", 148 moduleName: "librust_ffi", 149 variant: "android_arm64_armv8-a_shared", 150 expectedFiles: []string{ 151 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/librust_ffi.so", 152 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/librust_ffi.so.clippy", 153 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/unstripped/librust_ffi.so", 154 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/unstripped/librust_ffi.so.toc", 155 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/meta_lic", 156 "out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/rustdoc.timestamp", 157 "out/soong/target/product/test_device/system/lib64/librust_ffi.so", 158 }, 159 }, 160 } 161 for _, tc := range testcases { 162 t.Run(tc.testName, func(t *testing.T) { 163 modOutputs := ctx.ModuleForTests(tc.moduleName, tc.variant).AllOutputs() 164 sort.Strings(tc.expectedFiles) 165 sort.Strings(modOutputs) 166 android.AssertStringPathsRelativeToTopEquals( 167 t, 168 "incorrect outputs from rust module", 169 ctx.Config(), 170 tc.expectedFiles, 171 modOutputs, 172 ) 173 }) 174 } 175} 176