Refactor python rules

The goal of this cl is to simplify the python rules,
mostly by removing the "decorator" pattern that they
currently use, and instead making separate module
types for libraries, binaries, and tests that inherit
from each other.

Bug: 259718110
Test: Verified ninja files are unchanged (they only change in the list of soong sources because I added/deleted files)
Change-Id: I1e836e2cc4782c7818f91db7df7895de3b8db7ca
This commit is contained in:
Cole Faust
2023-01-23 10:14:58 -08:00
parent 6cf5e0d9cb
commit 4d247e6f21
10 changed files with 528 additions and 691 deletions

View File

@@ -32,6 +32,20 @@ func registerPythonTestComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("python_test", PythonTestFactory)
}
func NewTest(hod android.HostOrDeviceSupported) *PythonTestModule {
return &PythonTestModule{PythonBinaryModule: *NewBinary(hod)}
}
func PythonTestHostFactory() android.Module {
return NewTest(android.HostSupportedNoCross).init()
}
func PythonTestFactory() android.Module {
module := NewTest(android.HostAndDeviceSupported)
module.multilib = android.MultilibBoth
return module.init()
}
type TestProperties struct {
// the name of the test configuration (for example "AndroidTest.xml") that should be
// installed with the module.
@@ -52,76 +66,79 @@ type TestProperties struct {
Test_options android.CommonTestOptions
}
type testDecorator struct {
*binaryDecorator
type PythonTestModule struct {
PythonBinaryModule
testProperties TestProperties
testConfig android.Path
data []android.DataPath
testConfig android.Path
data []android.DataPath
}
func (test *testDecorator) bootstrapperProps() []interface{} {
return append(test.binaryDecorator.bootstrapperProps(), &test.testProperties)
func (p *PythonTestModule) init() android.Module {
p.AddProperties(&p.properties, &p.protoProperties)
p.AddProperties(&p.binaryProperties)
p.AddProperties(&p.testProperties)
android.InitAndroidArchModule(p, p.hod, p.multilib)
android.InitDefaultableModule(p)
android.InitBazelModule(p)
if p.hod == android.HostSupportedNoCross && p.testProperties.Test_options.Unit_test == nil {
p.testProperties.Test_options.Unit_test = proptools.BoolPtr(true)
}
return p
}
func (test *testDecorator) install(ctx android.ModuleContext, file android.Path) {
test.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
TestConfigProp: test.testProperties.Test_config,
TestConfigTemplateProp: test.testProperties.Test_config_template,
TestSuites: test.binaryDecorator.binaryProperties.Test_suites,
AutoGenConfig: test.binaryDecorator.binaryProperties.Auto_gen_config,
func (p *PythonTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// We inherit from only the library's GenerateAndroidBuildActions, and then
// just use buildBinary() so that the binary is not installed into the location
// it would be for regular binaries.
p.PythonLibraryModule.GenerateAndroidBuildActions(ctx)
p.buildBinary(ctx)
p.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{
TestConfigProp: p.testProperties.Test_config,
TestConfigTemplateProp: p.testProperties.Test_config_template,
TestSuites: p.binaryProperties.Test_suites,
AutoGenConfig: p.binaryProperties.Auto_gen_config,
DeviceTemplate: "${PythonBinaryHostTestConfigTemplate}",
HostTemplate: "${PythonBinaryHostTestConfigTemplate}",
})
test.binaryDecorator.pythonInstaller.dir = "nativetest"
test.binaryDecorator.pythonInstaller.dir64 = "nativetest64"
p.installedDest = ctx.InstallFile(installDir(ctx, "nativetest", "nativetest64", ctx.ModuleName()), p.installSource.Base(), p.installSource)
test.binaryDecorator.pythonInstaller.relative = ctx.ModuleName()
test.binaryDecorator.pythonInstaller.install(ctx, file)
dataSrcPaths := android.PathsForModuleSrc(ctx, test.testProperties.Data)
for _, dataSrcPath := range dataSrcPaths {
test.data = append(test.data, android.DataPath{SrcPath: dataSrcPath})
for _, dataSrcPath := range android.PathsForModuleSrc(ctx, p.testProperties.Data) {
p.data = append(p.data, android.DataPath{SrcPath: dataSrcPath})
}
// Emulate the data property for java_data dependencies.
for _, javaData := range ctx.GetDirectDepsWithTag(javaDataTag) {
for _, javaDataSrcPath := range android.OutputFilesForModule(ctx, javaData, "") {
test.data = append(test.data, android.DataPath{SrcPath: javaDataSrcPath})
p.data = append(p.data, android.DataPath{SrcPath: javaDataSrcPath})
}
}
}
func NewTest(hod android.HostOrDeviceSupported) *Module {
module, binary := NewBinary(hod)
binary.pythonInstaller = NewPythonInstaller("nativetest", "nativetest64")
test := &testDecorator{binaryDecorator: binary}
if hod == android.HostSupportedNoCross && test.testProperties.Test_options.Unit_test == nil {
test.testProperties.Test_options.Unit_test = proptools.BoolPtr(true)
func (p *PythonTestModule) AndroidMkEntries() []android.AndroidMkEntries {
entriesList := p.PythonBinaryModule.AndroidMkEntries()
if len(entriesList) != 1 {
panic("Expected 1 entry")
}
entries := &entriesList[0]
module.bootstrapper = test
module.installer = test
entries.Class = "NATIVE_TESTS"
return module
}
func PythonTestHostFactory() android.Module {
module := NewTest(android.HostSupportedNoCross)
return module.init()
}
func PythonTestFactory() android.Module {
module := NewTest(android.HostAndDeviceSupported)
module.multilib = android.MultilibBoth
return module.init()
entries.ExtraEntries = append(entries.ExtraEntries,
func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
//entries.AddCompatibilityTestSuites(p.binaryProperties.Test_suites...)
if p.testConfig != nil {
entries.SetString("LOCAL_FULL_TEST_CONFIG", p.testConfig.String())
}
entries.SetBoolIfTrue("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", !BoolDefault(p.binaryProperties.Auto_gen_config, true))
entries.AddStrings("LOCAL_TEST_DATA", android.AndroidMkDataPaths(p.data)...)
p.testProperties.Test_options.SetAndroidMkEntries(entries)
})
return entriesList
}