xref: /aosp_15_r20/build/soong/rust/test_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 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	"strings"
19*333d2b36SAndroid Build Coastguard Worker	"testing"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workerfunc TestRustTest(t *testing.T) {
25*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
26*333d2b36SAndroid Build Coastguard Worker		rust_test_host {
27*333d2b36SAndroid Build Coastguard Worker			name: "my_test",
28*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
29*333d2b36SAndroid Build Coastguard Worker			data: ["data.txt"],
30*333d2b36SAndroid Build Coastguard Worker		}`)
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Worker	testingModule := ctx.ModuleForTests("my_test", "linux_glibc_x86_64")
33*333d2b36SAndroid Build Coastguard Worker	expectedOut := "my_test/linux_glibc_x86_64/my_test"
34*333d2b36SAndroid Build Coastguard Worker	outPath := testingModule.Output("my_test").Output.String()
35*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(outPath, expectedOut) {
36*333d2b36SAndroid Build Coastguard Worker		t.Errorf("wrong output path: %v;  expected: %v", outPath, expectedOut)
37*333d2b36SAndroid Build Coastguard Worker	}
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Worker	dataPaths := testingModule.Module().(*Module).compiler.(*testDecorator).dataPaths()
40*333d2b36SAndroid Build Coastguard Worker	if len(dataPaths) != 1 {
41*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected exactly one test data file. test data files: [%v]", dataPaths)
42*333d2b36SAndroid Build Coastguard Worker		return
43*333d2b36SAndroid Build Coastguard Worker	}
44*333d2b36SAndroid Build Coastguard Worker}
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Workerfunc TestRustTestLinkage(t *testing.T) {
47*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, `
48*333d2b36SAndroid Build Coastguard Worker		rust_test {
49*333d2b36SAndroid Build Coastguard Worker			name: "my_test",
50*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
51*333d2b36SAndroid Build Coastguard Worker			rustlibs: ["libfoo"],
52*333d2b36SAndroid Build Coastguard Worker            rlibs: ["libbar"],
53*333d2b36SAndroid Build Coastguard Worker		}
54*333d2b36SAndroid Build Coastguard Worker		rust_library {
55*333d2b36SAndroid Build Coastguard Worker			name: "libfoo",
56*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
57*333d2b36SAndroid Build Coastguard Worker			crate_name: "foo",
58*333d2b36SAndroid Build Coastguard Worker		}
59*333d2b36SAndroid Build Coastguard Worker		rust_library {
60*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
61*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
62*333d2b36SAndroid Build Coastguard Worker			crate_name: "bar",
63*333d2b36SAndroid Build Coastguard Worker		}`)
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	testingModule := ctx.ModuleForTests("my_test", "android_arm64_armv8-a").Module().(*Module)
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libfoo.rlib-std", testingModule.Properties.AndroidMkRlibs) {
68*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rlib-std variant for libfoo not detected as a rustlib-defined rlib dependency for device rust_test module")
69*333d2b36SAndroid Build Coastguard Worker	}
70*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libbar.rlib-std", testingModule.Properties.AndroidMkRlibs) {
71*333d2b36SAndroid Build Coastguard Worker		t.Errorf("rlib-std variant for libbar not detected as an rlib dependency for device rust_test module")
72*333d2b36SAndroid Build Coastguard Worker	}
73*333d2b36SAndroid Build Coastguard Worker	if !android.InList("libstd", testingModule.Properties.AndroidMkRlibs) {
74*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Device rust_test module 'my_test' does not link libstd as an rlib")
75*333d2b36SAndroid Build Coastguard Worker	}
76*333d2b36SAndroid Build Coastguard Worker}
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Workerfunc TestDataLibs(t *testing.T) {
79*333d2b36SAndroid Build Coastguard Worker	bp := `
80*333d2b36SAndroid Build Coastguard Worker		cc_library {
81*333d2b36SAndroid Build Coastguard Worker			name: "test_lib",
82*333d2b36SAndroid Build Coastguard Worker			srcs: ["test_lib.cpp"],
83*333d2b36SAndroid Build Coastguard Worker		}
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker		rust_binary {
86*333d2b36SAndroid Build Coastguard Worker			name: "rusty",
87*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
88*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "both",
89*333d2b36SAndroid Build Coastguard Worker		}
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker		rust_ffi {
92*333d2b36SAndroid Build Coastguard Worker			name: "librust_test_lib",
93*333d2b36SAndroid Build Coastguard Worker			crate_name: "rust_test_lib",
94*333d2b36SAndroid Build Coastguard Worker			srcs: ["test_lib.rs"],
95*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar/baz",
96*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "64",
97*333d2b36SAndroid Build Coastguard Worker		}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker		rust_test {
100*333d2b36SAndroid Build Coastguard Worker			name: "main_test",
101*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
102*333d2b36SAndroid Build Coastguard Worker			data_libs: ["test_lib"],
103*333d2b36SAndroid Build Coastguard Worker			data_bins: ["rusty"],
104*333d2b36SAndroid Build Coastguard Worker		}
105*333d2b36SAndroid Build Coastguard Worker `
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, bp)
108*333d2b36SAndroid Build Coastguard Worker
109*333d2b36SAndroid Build Coastguard Worker	testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a")
110*333d2b36SAndroid Build Coastguard Worker	testBinary := testingModule.Module().(*Module).compiler.(*testDecorator)
111*333d2b36SAndroid Build Coastguard Worker	outputFiles := testingModule.OutputFiles(ctx, t, "")
112*333d2b36SAndroid Build Coastguard Worker	if len(outputFiles) != 1 {
113*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles)
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker	if len(testBinary.dataPaths()) != 2 {
116*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected exactly two test data files. test data files: [%v]", testBinary.dataPaths())
117*333d2b36SAndroid Build Coastguard Worker	}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker	outputPath := outputFiles[0].String()
120*333d2b36SAndroid Build Coastguard Worker	dataLibraryPath := testBinary.dataPaths()[0].SrcPath.String()
121*333d2b36SAndroid Build Coastguard Worker	dataBinaryPath := testBinary.dataPaths()[1].SrcPath.String()
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(outputPath, "/main_test") {
124*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath)
125*333d2b36SAndroid Build Coastguard Worker	}
126*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(dataLibraryPath, "/test_lib.so") {
127*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", dataLibraryPath)
128*333d2b36SAndroid Build Coastguard Worker	}
129*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(dataBinaryPath, "/rusty") {
130*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", dataBinaryPath)
131*333d2b36SAndroid Build Coastguard Worker	}
132*333d2b36SAndroid Build Coastguard Worker}
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Workerfunc TestDataLibsRelativeInstallPath(t *testing.T) {
135*333d2b36SAndroid Build Coastguard Worker	bp := `
136*333d2b36SAndroid Build Coastguard Worker		cc_library {
137*333d2b36SAndroid Build Coastguard Worker			name: "test_lib",
138*333d2b36SAndroid Build Coastguard Worker			srcs: ["test_lib.cpp"],
139*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar/baz",
140*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "64",
141*333d2b36SAndroid Build Coastguard Worker		}
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker		rust_ffi {
144*333d2b36SAndroid Build Coastguard Worker			name: "librust_test_lib",
145*333d2b36SAndroid Build Coastguard Worker			crate_name: "rust_test_lib",
146*333d2b36SAndroid Build Coastguard Worker			srcs: ["test_lib.rs"],
147*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar/baz",
148*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "64",
149*333d2b36SAndroid Build Coastguard Worker		}
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker		rust_binary {
152*333d2b36SAndroid Build Coastguard Worker			name: "rusty",
153*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
154*333d2b36SAndroid Build Coastguard Worker			relative_install_path: "foo/bar/baz",
155*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "64",
156*333d2b36SAndroid Build Coastguard Worker		}
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker		rust_test {
159*333d2b36SAndroid Build Coastguard Worker			name: "main_test",
160*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.rs"],
161*333d2b36SAndroid Build Coastguard Worker			data_libs: ["test_lib", "librust_test_lib"],
162*333d2b36SAndroid Build Coastguard Worker			data_bins: ["rusty"],
163*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "64",
164*333d2b36SAndroid Build Coastguard Worker		}
165*333d2b36SAndroid Build Coastguard Worker `
166*333d2b36SAndroid Build Coastguard Worker
167*333d2b36SAndroid Build Coastguard Worker	ctx := testRust(t, bp)
168*333d2b36SAndroid Build Coastguard Worker	testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a")
169*333d2b36SAndroid Build Coastguard Worker	module := testingModule.Module()
170*333d2b36SAndroid Build Coastguard Worker	testBinary := module.(*Module).compiler.(*testDecorator)
171*333d2b36SAndroid Build Coastguard Worker	outputFiles := testingModule.OutputFiles(ctx, t, "")
172*333d2b36SAndroid Build Coastguard Worker	if len(outputFiles) != 1 {
173*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles)
174*333d2b36SAndroid Build Coastguard Worker	}
175*333d2b36SAndroid Build Coastguard Worker	if len(testBinary.dataPaths()) != 3 {
176*333d2b36SAndroid Build Coastguard Worker		t.Fatalf("expected exactly two test data files. test data files: [%v]", testBinary.dataPaths())
177*333d2b36SAndroid Build Coastguard Worker	}
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Worker	outputPath := outputFiles[0].String()
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(outputPath, "/main_test") {
182*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath)
183*333d2b36SAndroid Build Coastguard Worker	}
184*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, module)[0]
185*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:lib64/foo/bar/baz") {
186*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:lib64/foo/bar/baz`,"+
187*333d2b36SAndroid Build Coastguard Worker			" but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0])
188*333d2b36SAndroid Build Coastguard Worker	}
189*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][1], ":librust_test_lib.so:lib64/foo/bar/baz") {
190*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected LOCAL_TEST_DATA to end with `:librust_test_lib.so:lib64/foo/bar/baz`,"+
191*333d2b36SAndroid Build Coastguard Worker			" but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][1])
192*333d2b36SAndroid Build Coastguard Worker	}
193*333d2b36SAndroid Build Coastguard Worker	if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][2], ":rusty:foo/bar/baz") {
194*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected LOCAL_TEST_DATA to end with `:rusty:foo/bar/baz`,"+
195*333d2b36SAndroid Build Coastguard Worker			" but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][2])
196*333d2b36SAndroid Build Coastguard Worker	}
197*333d2b36SAndroid Build Coastguard Worker}
198