blob: 56da509b50caf1ada46d1f29ff2fbc4f02b72910 [file] [log] [blame]
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -07001// Copyright 2019 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 (
Julien Desprez84c94942021-01-15 15:10:01 -080018 "github.com/google/blueprint/proptools"
19
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -070020 "android/soong/android"
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070021 "android/soong/tradefed"
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -070022)
23
Dan Shid79572f2020-11-13 14:33:46 -080024// Test option struct.
25type TestOptions struct {
26 // If the test is a hostside(no device required) unittest that shall be run during presubmit check.
27 Unit_test *bool
28}
29
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070030type TestProperties struct {
Ivan Lozanofc80fe72020-06-11 13:25:36 -040031 // Disables the creation of a test-specific directory when used with
32 // relative_install_path. Useful if several tests need to be in the same
33 // directory, but test_per_src doesn't work.
34 No_named_install_directory *bool
35
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070036 // the name of the test configuration (for example "AndroidTest.xml") that should be
37 // installed with the module.
Colin Crossa6384822020-06-09 15:09:22 -070038 Test_config *string `android:"path,arch_variant"`
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070039
40 // the name of the test configuration template (for example "AndroidTestTemplate.xml") that
41 // should be installed with the module.
Colin Crossa6384822020-06-09 15:09:22 -070042 Test_config_template *string `android:"path,arch_variant"`
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070043
44 // list of compatibility suites (for example "cts", "vts") that the module should be
45 // installed into.
46 Test_suites []string `android:"arch_variant"`
47
Ivan Lozano9da4aa82021-01-29 12:48:05 -050048 // list of files or filegroup modules that provide data that should be installed alongside
49 // the test
50 Data []string `android:"path,arch_variant"`
51
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070052 // Flag to indicate whether or not to create test config automatically. If AndroidTest.xml
53 // doesn't exist next to the Android.bp, this attribute doesn't need to be set to true
54 // explicitly.
55 Auto_gen_config *bool
Stephen Crane02a623d2020-04-25 21:40:35 -070056
57 // if set, build with the standard Rust test harness. Defaults to true.
58 Test_harness *bool
Dan Shid79572f2020-11-13 14:33:46 -080059
60 // Test options.
61 Test_options TestOptions
Ivan Lozanoba222612021-09-21 10:49:13 -040062
63 // Add RootTargetPreparer to auto generated test config. This guarantees the test to run
64 // with root permission.
65 Require_root *bool
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070066}
67
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -070068// A test module is a binary module with extra --test compiler flag
69// and different default installation directory.
70// In golang, inheriance is written as a component.
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070071type testDecorator struct {
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -070072 *binaryDecorator
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070073 Properties TestProperties
74 testConfig android.Path
Ivan Lozano9da4aa82021-01-29 12:48:05 -050075
76 data []android.DataPath
77}
78
79func (test *testDecorator) dataPaths() []android.DataPath {
80 return test.data
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -070081}
82
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -040083func (test *testDecorator) nativeCoverage() bool {
84 return true
85}
86
Stephen Crane02a623d2020-04-25 21:40:35 -070087func (test *testDecorator) testHarness() bool {
88 return BoolDefault(test.Properties.Test_harness, true)
89}
90
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -070091func NewRustTest(hod android.HostOrDeviceSupported) (*Module, *testDecorator) {
Chih-Hung Hsiehe728a892020-06-16 01:25:27 -070092 // Build both 32 and 64 targets for device tests.
93 // Cannot build both for host tests yet if the test depends on
94 // something like proc-macro2 that cannot be built for both.
95 multilib := android.MultilibBoth
96 if hod != android.DeviceSupported && hod != android.HostAndDeviceSupported {
97 multilib = android.MultilibFirst
98 }
99 module := newModule(hod, multilib)
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -0700100
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -0700101 test := &testDecorator{
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -0700102 binaryDecorator: &binaryDecorator{
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -0800103 baseCompiler: NewBaseCompiler("nativetest", "nativetest64", InstallInData),
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -0700104 },
105 }
106
107 module.compiler = test
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -0700108 return module, test
109}
110
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -0700111func (test *testDecorator) compilerProps() []interface{} {
112 return append(test.binaryDecorator.compilerProps(), &test.Properties)
113}
114
ThiƩbaud Weksteenfabaff62020-08-27 13:48:36 +0200115func (test *testDecorator) install(ctx ModuleContext) {
Ivan Lozanoba222612021-09-21 10:49:13 -0400116 testInstallBase := "/data/local/tests/unrestricted"
117 if ctx.RustModule().InVendor() || ctx.RustModule().UseVndk() {
118 testInstallBase = "/data/local/tests/vendor"
119 }
120
121 var configs []tradefed.Config
122 if Bool(test.Properties.Require_root) {
123 configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", nil})
124 } else {
125 var options []tradefed.Option
126 options = append(options, tradefed.Option{Name: "force-root", Value: "false"})
127 configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", options})
128 }
129
Ivan Lozanofc80fe72020-06-11 13:25:36 -0400130 test.testConfig = tradefed.AutoGenRustTestConfig(ctx,
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -0700131 test.Properties.Test_config,
132 test.Properties.Test_config_template,
133 test.Properties.Test_suites,
Ivan Lozanoba222612021-09-21 10:49:13 -0400134 configs,
135 test.Properties.Auto_gen_config,
136 testInstallBase)
Ivan Lozanofc80fe72020-06-11 13:25:36 -0400137
Ivan Lozano9da4aa82021-01-29 12:48:05 -0500138 dataSrcPaths := android.PathsForModuleSrc(ctx, test.Properties.Data)
139
140 for _, dataSrcPath := range dataSrcPaths {
141 test.data = append(test.data, android.DataPath{SrcPath: dataSrcPath})
142 }
143
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -0800144 // default relative install path is module name
Ivan Lozanofc80fe72020-06-11 13:25:36 -0400145 if !Bool(test.Properties.No_named_install_directory) {
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -0800146 test.baseCompiler.relative = ctx.ModuleName()
Ivan Lozanofc80fe72020-06-11 13:25:36 -0400147 } else if String(test.baseCompiler.Properties.Relative_install_path) == "" {
148 ctx.PropertyErrorf("no_named_install_directory", "Module install directory may only be disabled if relative_install_path is set")
Chih-Hung Hsieh9a4a7ba2019-12-12 19:36:05 -0800149 }
Ivan Lozanofc80fe72020-06-11 13:25:36 -0400150
Julien Desprez84c94942021-01-15 15:10:01 -0800151 if ctx.Host() && test.Properties.Test_options.Unit_test == nil {
152 test.Properties.Test_options.Unit_test = proptools.BoolPtr(true)
153 }
ThiƩbaud Weksteenfabaff62020-08-27 13:48:36 +0200154 test.binaryDecorator.install(ctx)
Chih-Hung Hsieh41805be2019-10-31 20:56:47 -0700155}
156
157func (test *testDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags {
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -0700158 flags = test.binaryDecorator.compilerFlags(ctx, flags)
Stephen Crane02a623d2020-04-25 21:40:35 -0700159 if test.testHarness() {
160 flags.RustFlags = append(flags.RustFlags, "--test")
161 }
Jeff Vander Stoepbf7a9022021-01-26 14:35:38 +0100162 if ctx.Device() {
163 flags.RustFlags = append(flags.RustFlags, "-Z panic_abort_tests")
164 }
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -0700165 return flags
166}
167
Liz Kammer356f7d42021-01-26 09:18:53 -0500168func (test *testDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep {
Matthew Maurer0f003b12020-06-29 14:34:06 -0700169 return rlibAutoDep
170}
171
Chih-Hung Hsieha5f22ed2019-10-24 20:47:54 -0700172func init() {
173 // Rust tests are binary files built with --test.
174 android.RegisterModuleType("rust_test", RustTestFactory)
175 android.RegisterModuleType("rust_test_host", RustTestHostFactory)
176}
177
178func RustTestFactory() android.Module {
179 module, _ := NewRustTest(android.HostAndDeviceSupported)
180 return module.Init()
181}
182
183func RustTestHostFactory() android.Module {
184 module, _ := NewRustTest(android.HostSupported)
185 return module.Init()
186}
Ivan Lozano2b081132020-09-08 12:46:52 -0400187
Ivan Lozanodd055472020-09-28 13:22:45 -0400188func (test *testDecorator) stdLinkage(ctx *depsContext) RustLinkage {
189 return RlibLinkage
Ivan Lozano2b081132020-09-08 12:46:52 -0400190}
Ivan Lozano3ee74c82021-07-15 15:44:10 -0400191
192func (test *testDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps {
193 deps = test.binaryDecorator.compilerDeps(ctx, deps)
194
195 deps.Rustlibs = append(deps.Rustlibs, "libtest")
196
197 return deps
198}