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