blob: fb8e91806ca1662eb2c9a0740b773830ee5e6361 [file] [log] [blame]
Nan Zhang5323f8e2017-05-10 13:37:54 -07001// Copyright 2017 Google Inc. All rights reserved.
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 python
16
17import (
Julien Desprez66534a02021-02-09 09:27:39 -080018 "github.com/google/blueprint/proptools"
19
Nan Zhang5323f8e2017-05-10 13:37:54 -070020 "android/soong/android"
yelinhsieh80880a32018-11-06 11:49:55 +080021 "android/soong/tradefed"
Nan Zhang5323f8e2017-05-10 13:37:54 -070022)
23
24// This file contains the module types for building Python test.
25
26func init() {
Paul Duffind0890452021-03-17 21:57:08 +000027 registerPythonTestComponents(android.InitRegistrationContext)
28}
29
30func registerPythonTestComponents(ctx android.RegistrationContext) {
31 ctx.RegisterModuleType("python_test_host", PythonTestHostFactory)
32 ctx.RegisterModuleType("python_test", PythonTestFactory)
Nan Zhang5323f8e2017-05-10 13:37:54 -070033}
34
Cole Faust4d247e62023-01-23 10:14:58 -080035func NewTest(hod android.HostOrDeviceSupported) *PythonTestModule {
36 return &PythonTestModule{PythonBinaryModule: *NewBinary(hod)}
37}
38
39func PythonTestHostFactory() android.Module {
40 return NewTest(android.HostSupportedNoCross).init()
41}
42
43func PythonTestFactory() android.Module {
44 module := NewTest(android.HostAndDeviceSupported)
45 module.multilib = android.MultilibBoth
46 return module.init()
47}
48
Julien Despreze146e392018-08-02 15:00:46 -070049type TestProperties struct {
50 // the name of the test configuration (for example "AndroidTest.xml") that should be
51 // installed with the module.
Colin Crossa6384822020-06-09 15:09:22 -070052 Test_config *string `android:"path,arch_variant"`
yelinhsieh80880a32018-11-06 11:49:55 +080053
54 // the name of the test configuration template (for example "AndroidTestTemplate.xml") that
55 // should be installed with the module.
Colin Crossa6384822020-06-09 15:09:22 -070056 Test_config_template *string `android:"path,arch_variant"`
Dan Shi31949122020-09-21 12:11:02 -070057
58 // list of files or filegroup modules that provide data that should be installed alongside
59 // the test
60 Data []string `android:"path,arch_variant"`
Dan Shid79572f2020-11-13 14:33:46 -080061
Colin Cross1bc63932020-11-22 20:12:45 -080062 // list of java modules that provide data that should be installed alongside the test.
63 Java_data []string
64
Dan Shid79572f2020-11-13 14:33:46 -080065 // Test options.
Zhenhuang Wang0ac5a432022-08-12 18:49:20 +080066 Test_options android.CommonTestOptions
Julien Despreze146e392018-08-02 15:00:46 -070067}
68
Cole Faust4d247e62023-01-23 10:14:58 -080069type PythonTestModule struct {
70 PythonBinaryModule
Julien Despreze146e392018-08-02 15:00:46 -070071
72 testProperties TestProperties
Cole Faust4d247e62023-01-23 10:14:58 -080073 testConfig android.Path
74 data []android.DataPath
Julien Despreze146e392018-08-02 15:00:46 -070075}
76
Cole Faust4d247e62023-01-23 10:14:58 -080077func (p *PythonTestModule) init() android.Module {
78 p.AddProperties(&p.properties, &p.protoProperties)
79 p.AddProperties(&p.binaryProperties)
80 p.AddProperties(&p.testProperties)
81 android.InitAndroidArchModule(p, p.hod, p.multilib)
82 android.InitDefaultableModule(p)
83 android.InitBazelModule(p)
84 if p.hod == android.HostSupportedNoCross && p.testProperties.Test_options.Unit_test == nil {
85 p.testProperties.Test_options.Unit_test = proptools.BoolPtr(true)
86 }
87 return p
Nan Zhang5323f8e2017-05-10 13:37:54 -070088}
89
Cole Faust4d247e62023-01-23 10:14:58 -080090func (p *PythonTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
91 // We inherit from only the library's GenerateAndroidBuildActions, and then
92 // just use buildBinary() so that the binary is not installed into the location
93 // it would be for regular binaries.
94 p.PythonLibraryModule.GenerateAndroidBuildActions(ctx)
95 p.buildBinary(ctx)
96
97 p.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
98 TestConfigProp: p.testProperties.Test_config,
99 TestConfigTemplateProp: p.testProperties.Test_config_template,
100 TestSuites: p.binaryProperties.Test_suites,
101 AutoGenConfig: p.binaryProperties.Auto_gen_config,
Cole Faust21680542022-12-07 18:18:37 -0800102 DeviceTemplate: "${PythonBinaryHostTestConfigTemplate}",
103 HostTemplate: "${PythonBinaryHostTestConfigTemplate}",
104 })
yelinhsieh80880a32018-11-06 11:49:55 +0800105
Cole Faust4d247e62023-01-23 10:14:58 -0800106 p.installedDest = ctx.InstallFile(installDir(ctx, "nativetest", "nativetest64", ctx.ModuleName()), p.installSource.Base(), p.installSource)
Nan Zhangd9ec5e72017-12-01 20:00:31 +0000107
Cole Faust4d247e62023-01-23 10:14:58 -0800108 for _, dataSrcPath := range android.PathsForModuleSrc(ctx, p.testProperties.Data) {
109 p.data = append(p.data, android.DataPath{SrcPath: dataSrcPath})
Dan Shi31949122020-09-21 12:11:02 -0700110 }
Colin Cross1bc63932020-11-22 20:12:45 -0800111
112 // Emulate the data property for java_data dependencies.
113 for _, javaData := range ctx.GetDirectDepsWithTag(javaDataTag) {
114 for _, javaDataSrcPath := range android.OutputFilesForModule(ctx, javaData, "") {
Cole Faust4d247e62023-01-23 10:14:58 -0800115 p.data = append(p.data, android.DataPath{SrcPath: javaDataSrcPath})
Colin Cross1bc63932020-11-22 20:12:45 -0800116 }
117 }
Nan Zhang5323f8e2017-05-10 13:37:54 -0700118}
119
Cole Faust4d247e62023-01-23 10:14:58 -0800120func (p *PythonTestModule) AndroidMkEntries() []android.AndroidMkEntries {
121 entriesList := p.PythonBinaryModule.AndroidMkEntries()
122 if len(entriesList) != 1 {
123 panic("Expected 1 entry")
Julien Desprez66534a02021-02-09 09:27:39 -0800124 }
Cole Faust4d247e62023-01-23 10:14:58 -0800125 entries := &entriesList[0]
Nan Zhangd4e641b2017-07-12 12:55:28 -0700126
Cole Faust4d247e62023-01-23 10:14:58 -0800127 entries.Class = "NATIVE_TESTS"
Nan Zhangd4e641b2017-07-12 12:55:28 -0700128
Cole Faust4d247e62023-01-23 10:14:58 -0800129 entries.ExtraEntries = append(entries.ExtraEntries,
130 func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
131 //entries.AddCompatibilityTestSuites(p.binaryProperties.Test_suites...)
132 if p.testConfig != nil {
133 entries.SetString("LOCAL_FULL_TEST_CONFIG", p.testConfig.String())
134 }
Nan Zhang5323f8e2017-05-10 13:37:54 -0700135
Cole Faust4d247e62023-01-23 10:14:58 -0800136 entries.SetBoolIfTrue("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", !BoolDefault(p.binaryProperties.Auto_gen_config, true))
Nan Zhang5323f8e2017-05-10 13:37:54 -0700137
Cole Faust4d247e62023-01-23 10:14:58 -0800138 entries.AddStrings("LOCAL_TEST_DATA", android.AndroidMkDataPaths(p.data)...)
Nan Zhangd9ec5e72017-12-01 20:00:31 +0000139
Cole Faust4d247e62023-01-23 10:14:58 -0800140 p.testProperties.Test_options.SetAndroidMkEntries(entries)
141 })
Nan Zhangd9ec5e72017-12-01 20:00:31 +0000142
Cole Faust4d247e62023-01-23 10:14:58 -0800143 return entriesList
Nan Zhangd9ec5e72017-12-01 20:00:31 +0000144}