Allow adding extra tradefed options in the Android.bp file

Some tests need to add custom tradefed options, but still want to
keep most of the soong autogenerated tradefed xml file.

Expose a test_options: { tradefed_options: [...] } property that
will allow tests to add more options to the autogenerated xml file.

Fixes: 184895128
Test: go test, and verified that the ninja files did not change for aosp_arm64
Change-Id: I50d4ad139322e9e207202f1e1a50f5bbb424aa6f
This commit is contained in:
Cole Faust 2022-12-07 18:18:37 -08:00
parent 2266e02a3a
commit 216805457c
9 changed files with 145 additions and 165 deletions

View file

@ -415,8 +415,16 @@ func (test *testBinary) install(ctx ModuleContext, file android.Path) {
testInstallBase := getTestInstallBase(useVendor) testInstallBase := getTestInstallBase(useVendor)
configs := getTradefedConfigOptions(ctx, &test.Properties, test.isolated(ctx)) configs := getTradefedConfigOptions(ctx, &test.Properties, test.isolated(ctx))
test.testConfig = tradefed.AutoGenNativeTestConfig(ctx, test.Properties.Test_config, test.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
test.Properties.Test_config_template, test.testDecorator.InstallerProperties.Test_suites, configs, test.Properties.Auto_gen_config, testInstallBase) TestConfigProp: test.Properties.Test_config,
TestConfigTemplateProp: test.Properties.Test_config_template,
TestSuites: test.testDecorator.InstallerProperties.Test_suites,
Config: configs,
AutoGenConfig: test.Properties.Auto_gen_config,
TestInstallBase: testInstallBase,
DeviceTemplate: "${NativeTestConfigTemplate}",
HostTemplate: "${NativeHostTestConfigTemplate}",
})
test.extraTestConfigs = android.PathsForModuleSrc(ctx, test.Properties.Test_options.Extra_test_configs) test.extraTestConfigs = android.PathsForModuleSrc(ctx, test.Properties.Test_options.Extra_test_configs)
@ -630,8 +638,15 @@ func (benchmark *benchmarkDecorator) install(ctx ModuleContext, file android.Pat
if Bool(benchmark.Properties.Require_root) { if Bool(benchmark.Properties.Require_root) {
configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", nil}) configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", nil})
} }
benchmark.testConfig = tradefed.AutoGenNativeBenchmarkTestConfig(ctx, benchmark.Properties.Test_config, benchmark.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
benchmark.Properties.Test_config_template, benchmark.Properties.Test_suites, configs, benchmark.Properties.Auto_gen_config) TestConfigProp: benchmark.Properties.Test_config,
TestConfigTemplateProp: benchmark.Properties.Test_config_template,
TestSuites: benchmark.Properties.Test_suites,
Config: configs,
AutoGenConfig: benchmark.Properties.Auto_gen_config,
DeviceTemplate: "${NativeBenchmarkTestConfigTemplate}",
HostTemplate: "${NativeBenchmarkTestConfigTemplate}",
})
benchmark.binaryDecorator.baseInstaller.dir = filepath.Join("benchmarktest", ctx.ModuleName()) benchmark.binaryDecorator.baseInstaller.dir = filepath.Join("benchmarktest", ctx.ModuleName())
benchmark.binaryDecorator.baseInstaller.dir64 = filepath.Join("benchmarktest64", ctx.ModuleName()) benchmark.binaryDecorator.baseInstaller.dir64 = filepath.Join("benchmarktest64", ctx.ModuleName())

View file

@ -915,6 +915,10 @@ type TestOptions struct {
// a list of extra test configuration files that should be installed with the module. // a list of extra test configuration files that should be installed with the module.
Extra_test_configs []string `android:"path,arch_variant"` Extra_test_configs []string `android:"path,arch_variant"`
// Extra <option> tags to add to the auto generated test xml file. The "key"
// is optional in each of these.
Tradefed_options []tradefed.Option
} }
type testProperties struct { type testProperties struct {
@ -1192,9 +1196,18 @@ func (j *Test) generateAndroidBuildActionsWithConfig(ctx android.ModuleContext,
defaultUnitTest := !inList("tradefed", j.properties.Libs) && !inList("cts", j.testProperties.Test_suites) defaultUnitTest := !inList("tradefed", j.properties.Libs) && !inList("cts", j.testProperties.Test_suites)
j.testProperties.Test_options.Unit_test = proptools.BoolPtr(defaultUnitTest) j.testProperties.Test_options.Unit_test = proptools.BoolPtr(defaultUnitTest)
} }
j.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
j.testConfig = tradefed.AutoGenJavaTestConfig(ctx, j.testProperties.Test_config, j.testProperties.Test_config_template, TestConfigProp: j.testProperties.Test_config,
j.testProperties.Test_suites, configs, j.testProperties.Auto_gen_config, j.testProperties.Test_options.Unit_test) TestConfigTemplateProp: j.testProperties.Test_config_template,
TestSuites: j.testProperties.Test_suites,
Config: configs,
OptionsForAutogenerated: j.testProperties.Test_options.Tradefed_options,
AutoGenConfig: j.testProperties.Auto_gen_config,
UnitTest: j.testProperties.Test_options.Unit_test,
DeviceTemplate: "${JavaTestConfigTemplate}",
HostTemplate: "${JavaHostTestConfigTemplate}",
HostUnitTestTemplate: "${JavaHostUnitTestConfigTemplate}",
})
j.data = android.PathsForModuleSrc(ctx, j.testProperties.Data) j.data = android.PathsForModuleSrc(ctx, j.testProperties.Data)
@ -1239,8 +1252,13 @@ func (j *TestHelperLibrary) GenerateAndroidBuildActions(ctx android.ModuleContex
} }
func (j *JavaTestImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { func (j *JavaTestImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
j.testConfig = tradefed.AutoGenJavaTestConfig(ctx, j.prebuiltTestProperties.Test_config, nil, j.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
j.prebuiltTestProperties.Test_suites, nil, nil, nil) TestConfigProp: j.prebuiltTestProperties.Test_config,
TestSuites: j.prebuiltTestProperties.Test_suites,
DeviceTemplate: "${JavaTestConfigTemplate}",
HostTemplate: "${JavaHostTestConfigTemplate}",
HostUnitTestTemplate: "${JavaHostUnitTestConfigTemplate}",
})
j.Import.GenerateAndroidBuildActions(ctx) j.Import.GenerateAndroidBuildActions(ctx)
} }

View file

@ -1945,3 +1945,27 @@ func TestJavaApiLibraryJarGeneration(t *testing.T) {
} }
} }
} }
func TestTradefedOptions(t *testing.T) {
result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, `
java_test_host {
name: "foo",
test_options: {
tradefed_options: [
{
name: "exclude-path",
value: "org/apache"
}
]
}
}
`)
buildOS := result.Config.BuildOS.String()
args := result.ModuleForTests("foo", buildOS+"_common").
Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args
expected := proptools.NinjaAndShellEscape("<option name=\"exclude-path\" value=\"org/apache\" />")
if args["extraConfigs"] != expected {
t.Errorf("Expected args[\"extraConfigs\"] to equal %q, was %q", expected, args["extraConfigs"])
}
}

View file

@ -131,9 +131,14 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext)
r.forceOSType = ctx.Config().BuildOS r.forceOSType = ctx.Config().BuildOS
r.forceArchType = ctx.Config().BuildArch r.forceArchType = ctx.Config().BuildArch
r.testConfig = tradefed.AutoGenRobolectricTestConfig(ctx, r.testProperties.Test_config, r.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
r.testProperties.Test_config_template, r.testProperties.Test_suites, TestConfigProp: r.testProperties.Test_config,
r.testProperties.Auto_gen_config) TestConfigTemplateProp: r.testProperties.Test_config_template,
TestSuites: r.testProperties.Test_suites,
AutoGenConfig: r.testProperties.Auto_gen_config,
DeviceTemplate: "${RobolectricTestConfigTemplate}",
HostTemplate: "${RobolectricTestConfigTemplate}",
})
r.data = android.PathsForModuleSrc(ctx, r.testProperties.Data) r.data = android.PathsForModuleSrc(ctx, r.testProperties.Data)
roboTestConfig := android.PathForModuleGen(ctx, "robolectric"). roboTestConfig := android.PathForModuleGen(ctx, "robolectric").

View file

@ -67,9 +67,14 @@ func (test *testDecorator) bootstrapperProps() []interface{} {
} }
func (test *testDecorator) install(ctx android.ModuleContext, file android.Path) { func (test *testDecorator) install(ctx android.ModuleContext, file android.Path) {
test.testConfig = tradefed.AutoGenPythonBinaryHostTestConfig(ctx, test.testProperties.Test_config, test.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
test.testProperties.Test_config_template, test.binaryDecorator.binaryProperties.Test_suites, TestConfigProp: test.testProperties.Test_config,
test.binaryDecorator.binaryProperties.Auto_gen_config) TestConfigTemplateProp: test.testProperties.Test_config_template,
TestSuites: test.binaryDecorator.binaryProperties.Test_suites,
AutoGenConfig: test.binaryDecorator.binaryProperties.Auto_gen_config,
DeviceTemplate: "${PythonBinaryHostTestConfigTemplate}",
HostTemplate: "${PythonBinaryHostTestConfigTemplate}",
})
test.binaryDecorator.pythonInstaller.dir = "nativetest" test.binaryDecorator.pythonInstaller.dir = "nativetest"
test.binaryDecorator.pythonInstaller.dir64 = "nativetest64" test.binaryDecorator.pythonInstaller.dir64 = "nativetest64"

View file

@ -112,12 +112,14 @@ func (benchmark *benchmarkDecorator) compilerProps() []interface{} {
} }
func (benchmark *benchmarkDecorator) install(ctx ModuleContext) { func (benchmark *benchmarkDecorator) install(ctx ModuleContext) {
benchmark.testConfig = tradefed.AutoGenRustBenchmarkConfig(ctx, benchmark.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
benchmark.Properties.Test_config, TestConfigProp: benchmark.Properties.Test_config,
benchmark.Properties.Test_config_template, TestConfigTemplateProp: benchmark.Properties.Test_config_template,
benchmark.Properties.Test_suites, TestSuites: benchmark.Properties.Test_suites,
nil, AutoGenConfig: benchmark.Properties.Auto_gen_config,
benchmark.Properties.Auto_gen_config) DeviceTemplate: "${RustDeviceBenchmarkConfigTemplate}",
HostTemplate: "${RustHostBenchmarkConfigTemplate}",
})
// default relative install path is module name // default relative install path is module name
if !Bool(benchmark.Properties.No_named_install_directory) { if !Bool(benchmark.Properties.No_named_install_directory) {

View file

@ -130,13 +130,16 @@ func (test *testDecorator) install(ctx ModuleContext) {
configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", options}) configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", options})
} }
test.testConfig = tradefed.AutoGenRustTestConfig(ctx, test.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
test.Properties.Test_config, TestConfigProp: test.Properties.Test_config,
test.Properties.Test_config_template, TestConfigTemplateProp: test.Properties.Test_config_template,
test.Properties.Test_suites, TestSuites: test.Properties.Test_suites,
configs, Config: configs,
test.Properties.Auto_gen_config, AutoGenConfig: test.Properties.Auto_gen_config,
testInstallBase) TestInstallBase: testInstallBase,
DeviceTemplate: "${RustDeviceTestConfigTemplate}",
HostTemplate: "${RustHostTestConfigTemplate}",
})
dataSrcPaths := android.PathsForModuleSrc(ctx, test.Properties.Data) dataSrcPaths := android.PathsForModuleSrc(ctx, test.Properties.Data)

View file

@ -379,8 +379,16 @@ func (s *ShTest) GenerateAndroidBuildActions(ctx android.ModuleContext) {
} }
configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.PushFilePreparer", options}) configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.PushFilePreparer", options})
} }
s.testConfig = tradefed.AutoGenShellTestConfig(ctx, s.testProperties.Test_config, s.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
s.testProperties.Test_config_template, s.testProperties.Test_suites, configs, s.testProperties.Auto_gen_config, s.outputFilePath.Base()) TestConfigProp: s.testProperties.Test_config,
TestConfigTemplateProp: s.testProperties.Test_config_template,
TestSuites: s.testProperties.Test_suites,
Config: configs,
AutoGenConfig: s.testProperties.Auto_gen_config,
OutputFileName: s.outputFilePath.Base(),
DeviceTemplate: "${ShellTestConfigTemplate}",
HostTemplate: "${ShellTestConfigTemplate}",
})
s.dataModules = make(map[string]android.Path) s.dataModules = make(map[string]android.Path)
ctx.VisitDirectDeps(func(dep android.Module) { ctx.VisitDirectDeps(func(dep android.Module) {

View file

@ -107,15 +107,10 @@ func (ob Object) Config() string {
} }
func autogenTemplate(ctx android.ModuleContext, output android.WritablePath, template string, configs []Config, testInstallBase string) { func autogenTemplate(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config, outputFileName string, testInstallBase string) {
autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), output, template, configs, "", testInstallBase) if template == "" {
} ctx.ModuleErrorf("Empty template")
}
func autogenTemplateWithName(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config, testInstallBase string) {
autogenTemplateWithNameAndOutputFile(ctx, name, output, template, configs, "", testInstallBase)
}
func autogenTemplateWithNameAndOutputFile(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config, outputFileName string, testInstallBase string) {
var configStrings []string var configStrings []string
for _, config := range configs { for _, config := range configs {
configStrings = append(configStrings, config.Config()) configStrings = append(configStrings, config.Config())
@ -137,144 +132,49 @@ func autogenTemplateWithNameAndOutputFile(ctx android.ModuleContext, name string
}) })
} }
func AutoGenNativeTestConfig(ctx android.ModuleContext, testConfigProp *string, // AutoGenTestConfigOptions is used so that we can supply many optional
testConfigTemplateProp *string, testSuites []string, config []Config, autoGenConfig *bool, testInstallBase string) android.Path { // arguments to the AutoGenTestConfig function.
type AutoGenTestConfigOptions struct {
Name string
OutputFileName string
TestConfigProp *string
TestConfigTemplateProp *string
TestSuites []string
Config []Config
OptionsForAutogenerated []Option
AutoGenConfig *bool
UnitTest *bool
TestInstallBase string
DeviceTemplate string
HostTemplate string
HostUnitTestTemplate string
}
path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp) func AutoGenTestConfig(ctx android.ModuleContext, options AutoGenTestConfigOptions) android.Path {
configs := append([]Config{}, options.Config...)
for _, c := range options.OptionsForAutogenerated {
configs = append(configs, c)
}
path, autogenPath := testConfigPath(ctx, options.TestConfigProp, options.TestSuites, options.AutoGenConfig, options.TestConfigTemplateProp)
if autogenPath != nil { if autogenPath != nil {
templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp) templatePath := getTestConfigTemplate(ctx, options.TestConfigTemplateProp)
if templatePath.Valid() { if templatePath.Valid() {
autogenTemplate(ctx, autogenPath, templatePath.String(), config, testInstallBase) autogenTemplate(ctx, options.Name, autogenPath, templatePath.String(), configs, options.OutputFileName, options.TestInstallBase)
} else { } else {
if ctx.Device() { if ctx.Device() {
autogenTemplate(ctx, autogenPath, "${NativeTestConfigTemplate}", config, testInstallBase) autogenTemplate(ctx, options.Name, autogenPath, options.DeviceTemplate, configs, options.OutputFileName, options.TestInstallBase)
} else { } else {
autogenTemplate(ctx, autogenPath, "${NativeHostTestConfigTemplate}", config, testInstallBase) if Bool(options.UnitTest) {
} autogenTemplate(ctx, options.Name, autogenPath, options.HostUnitTestTemplate, configs, options.OutputFileName, options.TestInstallBase)
}
return autogenPath
}
return path
}
func AutoGenShellTestConfig(ctx android.ModuleContext, testConfigProp *string,
testConfigTemplateProp *string, testSuites []string, config []Config, autoGenConfig *bool, outputFileName string) android.Path {
path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp)
if autogenPath != nil {
templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp)
if templatePath.Valid() {
autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), autogenPath, templatePath.String(), config, outputFileName, "")
} else {
autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), autogenPath, "${ShellTestConfigTemplate}", config, outputFileName, "")
}
return autogenPath
}
return path
}
func AutoGenNativeBenchmarkTestConfig(ctx android.ModuleContext, testConfigProp *string,
testConfigTemplateProp *string, testSuites []string, configs []Config, autoGenConfig *bool) android.Path {
path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp)
if autogenPath != nil {
templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp)
if templatePath.Valid() {
autogenTemplate(ctx, autogenPath, templatePath.String(), configs, "")
} else {
autogenTemplate(ctx, autogenPath, "${NativeBenchmarkTestConfigTemplate}", configs, "")
}
return autogenPath
}
return path
}
func AutoGenJavaTestConfig(ctx android.ModuleContext, testConfigProp *string, testConfigTemplateProp *string,
testSuites []string, config []Config, autoGenConfig *bool, unitTest *bool) android.Path {
path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp)
if autogenPath != nil {
templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp)
if templatePath.Valid() {
autogenTemplate(ctx, autogenPath, templatePath.String(), config, "")
} else {
if ctx.Device() {
autogenTemplate(ctx, autogenPath, "${JavaTestConfigTemplate}", config, "")
} else {
if Bool(unitTest) {
autogenTemplate(ctx, autogenPath, "${JavaHostUnitTestConfigTemplate}", config, "")
} else { } else {
autogenTemplate(ctx, autogenPath, "${JavaHostTestConfigTemplate}", config, "") autogenTemplate(ctx, options.Name, autogenPath, options.HostTemplate, configs, options.OutputFileName, options.TestInstallBase)
} }
} }
} }
return autogenPath return autogenPath
} }
return path if len(options.OptionsForAutogenerated) > 0 {
} ctx.ModuleErrorf("Extra tradefed configurations were provided for an autogenerated xml file, but the autogenerated xml file was not used.")
func AutoGenPythonBinaryHostTestConfig(ctx android.ModuleContext, testConfigProp *string,
testConfigTemplateProp *string, testSuites []string, autoGenConfig *bool) android.Path {
path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp)
if autogenPath != nil {
templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp)
if templatePath.Valid() {
autogenTemplate(ctx, autogenPath, templatePath.String(), nil, "")
} else {
autogenTemplate(ctx, autogenPath, "${PythonBinaryHostTestConfigTemplate}", nil, "")
}
return autogenPath
}
return path
}
func AutoGenRustTestConfig(ctx android.ModuleContext, testConfigProp *string,
testConfigTemplateProp *string, testSuites []string, config []Config, autoGenConfig *bool, testInstallBase string) android.Path {
path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp)
if autogenPath != nil {
templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp)
if templatePath.Valid() {
autogenTemplate(ctx, autogenPath, templatePath.String(), config, testInstallBase)
} else {
if ctx.Device() {
autogenTemplate(ctx, autogenPath, "${RustDeviceTestConfigTemplate}", config, testInstallBase)
} else {
autogenTemplate(ctx, autogenPath, "${RustHostTestConfigTemplate}", config, testInstallBase)
}
}
return autogenPath
}
return path
}
func AutoGenRustBenchmarkConfig(ctx android.ModuleContext, testConfigProp *string,
testConfigTemplateProp *string, testSuites []string, config []Config, autoGenConfig *bool) android.Path {
path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp)
if autogenPath != nil {
templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp)
if templatePath.Valid() {
autogenTemplate(ctx, autogenPath, templatePath.String(), config, "")
} else {
if ctx.Device() {
autogenTemplate(ctx, autogenPath, "${RustDeviceBenchmarkConfigTemplate}", config, "")
} else {
autogenTemplate(ctx, autogenPath, "${RustHostBenchmarkConfigTemplate}", config, "")
}
}
return autogenPath
}
return path
}
func AutoGenRobolectricTestConfig(ctx android.ModuleContext, testConfigProp *string, testConfigTemplateProp *string,
testSuites []string, autoGenConfig *bool) android.Path {
path, autogenPath := testConfigPath(ctx, testConfigProp, testSuites, autoGenConfig, testConfigTemplateProp)
if autogenPath != nil {
templatePath := getTestConfigTemplate(ctx, testConfigTemplateProp)
if templatePath.Valid() {
autogenTemplate(ctx, autogenPath, templatePath.String(), nil, "")
} else {
autogenTemplate(ctx, autogenPath, "${RobolectricTestConfigTemplate}", nil, "")
}
return autogenPath
} }
return path return path
} }