xref: /aosp_15_r20/build/soong/rust/builder_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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