| // Copyright 2020 The Android Open Source Project | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | package rust | 
 |  | 
 | import ( | 
 | 	"android/soong/android" | 
 | 	"sort" | 
 | 	"testing" | 
 | ) | 
 |  | 
 | func TestSourceProviderCollision(t *testing.T) { | 
 | 	testRustError(t, "multiple source providers generate the same filename output: bindings.rs", ` | 
 | 		rust_binary { | 
 | 			name: "source_collider", | 
 | 			srcs: [ | 
 | 				"foo.rs", | 
 | 				":libbindings1", | 
 | 				":libbindings2", | 
 | 			], | 
 | 		} | 
 | 		rust_bindgen { | 
 | 			name: "libbindings1", | 
 | 			source_stem: "bindings", | 
 | 			crate_name: "bindings1", | 
 | 			wrapper_src: "src/any.h", | 
 | 		} | 
 | 		rust_bindgen { | 
 | 			name: "libbindings2", | 
 | 			source_stem: "bindings", | 
 | 			crate_name: "bindings2", | 
 | 			wrapper_src: "src/any.h", | 
 | 		} | 
 | 	`) | 
 | } | 
 |  | 
 | func TestCompilationOutputFiles(t *testing.T) { | 
 | 	ctx := testRust(t, ` | 
 | 		rust_library { | 
 | 			name: "libfizz_buzz", | 
 | 			crate_name:"fizz_buzz", | 
 | 			srcs: ["lib.rs"], | 
 | 		} | 
 | 		rust_binary { | 
 | 			name: "fizz_buzz", | 
 | 			crate_name:"fizz_buzz", | 
 | 			srcs: ["lib.rs"], | 
 | 		} | 
 | 		rust_ffi { | 
 | 			name: "librust_ffi", | 
 | 			crate_name: "rust_ffi", | 
 | 			srcs: ["lib.rs"], | 
 | 		} | 
 | 	`) | 
 | 	testcases := []struct { | 
 | 		testName      string | 
 | 		moduleName    string | 
 | 		variant       string | 
 | 		expectedFiles []string | 
 | 	}{ | 
 | 		{ | 
 | 			testName:   "dylib", | 
 | 			moduleName: "libfizz_buzz", | 
 | 			variant:    "android_arm64_armv8-a_dylib", | 
 | 			expectedFiles: []string{ | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/libfizz_buzz.dylib.so", | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/libfizz_buzz.dylib.so.clippy", | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/unstripped/libfizz_buzz.dylib.so", | 
 | 				"out/soong/target/product/test_device/system/lib64/libfizz_buzz.dylib.so", | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_dylib/meta_lic", | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			testName:   "rlib dylib-std", | 
 | 			moduleName: "libfizz_buzz", | 
 | 			variant:    "android_arm64_armv8-a_rlib_dylib-std", | 
 | 			expectedFiles: []string{ | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_dylib-std/libfizz_buzz.rlib", | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_dylib-std/libfizz_buzz.rlib.clippy", | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_dylib-std/meta_lic", | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			testName:   "rlib rlib-std", | 
 | 			moduleName: "libfizz_buzz", | 
 | 			variant:    "android_arm64_armv8-a_rlib_rlib-std", | 
 | 			expectedFiles: []string{ | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/libfizz_buzz.rlib", | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/libfizz_buzz.rlib.clippy", | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/meta_lic", | 
 | 				"out/soong/.intermediates/libfizz_buzz/android_arm64_armv8-a_rlib_rlib-std/rustdoc.timestamp", | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			testName:   "rust_binary", | 
 | 			moduleName: "fizz_buzz", | 
 | 			variant:    "android_arm64_armv8-a", | 
 | 			expectedFiles: []string{ | 
 | 				"out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/fizz_buzz", | 
 | 				"out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/fizz_buzz.clippy", | 
 | 				"out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/unstripped/fizz_buzz", | 
 | 				"out/soong/target/product/test_device/system/bin/fizz_buzz", | 
 | 				"out/soong/.intermediates/fizz_buzz/android_arm64_armv8-a/meta_lic", | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			testName:   "rust_ffi static", | 
 | 			moduleName: "librust_ffi", | 
 | 			variant:    "android_arm64_armv8-a_static", | 
 | 			expectedFiles: []string{ | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_static/librust_ffi.a", | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_static/librust_ffi.a.clippy", | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_static/meta_lic", | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_static/rustdoc.timestamp", | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			testName:   "rust_ffi shared", | 
 | 			moduleName: "librust_ffi", | 
 | 			variant:    "android_arm64_armv8-a_shared", | 
 | 			expectedFiles: []string{ | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/librust_ffi.so", | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/librust_ffi.so.clippy", | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/unstripped/librust_ffi.so", | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/unstripped/librust_ffi.so.toc", | 
 | 				"out/soong/.intermediates/librust_ffi/android_arm64_armv8-a_shared/meta_lic", | 
 | 				"out/soong/target/product/test_device/system/lib64/librust_ffi.so", | 
 | 			}, | 
 | 		}, | 
 | 	} | 
 | 	for _, tc := range testcases { | 
 | 		t.Run(tc.testName, func(t *testing.T) { | 
 | 			modOutputs := ctx.ModuleForTests(tc.moduleName, tc.variant).AllOutputs() | 
 | 			sort.Strings(tc.expectedFiles) | 
 | 			sort.Strings(modOutputs) | 
 | 			android.AssertStringPathsRelativeToTopEquals( | 
 | 				t, | 
 | 				"incorrect outputs from rust module", | 
 | 				ctx.Config(), | 
 | 				tc.expectedFiles, | 
 | 				modOutputs, | 
 | 			) | 
 | 		}) | 
 | 	} | 
 | } |