Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d90c6c42 authored by Frank Feng's avatar Frank Feng Committed by Gerrit Code Review
Browse files

Merge "Implement test config auto-gen for sh_test."

parents 8a624337 c5b87498
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ bootstrap_go_package {
        "blueprint",
        "soong",
        "soong-android",
        "soong-tradefed",
    ],
    srcs: [
        "sh_binary.go",
+35 −2
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import (
	"github.com/google/blueprint/proptools"

	"android/soong/android"
	"android/soong/tradefed"
)

// sh_binary is for shell scripts (and batch files) that are installed as
@@ -74,6 +75,19 @@ type TestProperties struct {
	// list of files or filegroup modules that provide data that should be installed alongside
	// the test.
	Data []string `android:"path,arch_variant"`

	// Add RootTargetPreparer to auto generated test config. This guarantees the test to run
	// with root permission.
	Require_root *bool

	// the name of the test configuration template (for example "AndroidTestTemplate.xml") that
	// should be installed with the module.
	Test_config_template *string `android:"path,arch_variant"`

	// Flag to indicate whether or not to create test config automatically. If AndroidTest.xml
	// doesn't exist next to the Android.bp, this attribute doesn't need to be set to true
	// explicitly.
	Auto_gen_config *bool
}

type ShBinary struct {
@@ -94,6 +108,7 @@ type ShTest struct {
	testProperties TestProperties

	data       android.Paths
	testConfig android.Path
}

func (s *ShBinary) HostToolPath() android.OptionalPath {
@@ -190,6 +205,16 @@ func (s *ShTest) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	s.installedFile = ctx.InstallExecutable(installDir, s.outputFilePath.Base(), s.outputFilePath)

	s.data = android.PathsForModuleSrc(ctx, s.testProperties.Data)

	var configs []tradefed.Config
	if Bool(s.testProperties.Require_root) {
		configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", nil})
	} else {
		options := []tradefed.Option{{Name: "force-root", Value: "false"}}
		configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", options})
	}
	s.testConfig = tradefed.AutoGenShellTestConfig(ctx, s.testProperties.Test_config,
		s.testProperties.Test_config_template, s.testProperties.Test_suites, configs, s.testProperties.Auto_gen_config, s.outputFilePath.Base())
}

func (s *ShTest) InstallInData() bool {
@@ -206,7 +231,13 @@ func (s *ShTest) AndroidMkEntries() []android.AndroidMkEntries {
				s.customAndroidMkEntries(entries)

				entries.AddStrings("LOCAL_COMPATIBILITY_SUITE", s.testProperties.Test_suites...)
				if s.testProperties.Test_config != nil {
					entries.SetString("LOCAL_TEST_CONFIG", proptools.String(s.testProperties.Test_config))
				} else {
					if s.testConfig != nil {
						entries.SetString("LOCAL_FULL_TEST_CONFIG", s.testConfig.String())
					}
				}
				for _, d := range s.data {
					rel := d.Rel()
					path := d.String()
@@ -265,3 +296,5 @@ func ShTestHostFactory() android.Module {
	android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst)
	return module
}

var Bool = proptools.Bool
+26 −6
Original line number Diff line number Diff line
@@ -40,9 +40,9 @@ func getTestConfig(ctx android.ModuleContext, prop *string) android.Path {
}

var autogenTestConfig = pctx.StaticRule("autogenTestConfig", blueprint.RuleParams{
	Command:     "sed 's&{MODULE}&${name}&g;s&{EXTRA_CONFIGS}&'${extraConfigs}'&g' $template > $out",
	Command:     "sed 's&{MODULE}&${name}&g;s&{EXTRA_CONFIGS}&'${extraConfigs}'&g;s&{OUTPUT_FILENAME}&'${outputFileName}'&g' $template > $out",
	CommandDeps: []string{"$template"},
}, "name", "template", "extraConfigs")
}, "name", "template", "extraConfigs", "outputFileName")

func testConfigPath(ctx android.ModuleContext, prop *string, testSuites []string, autoGenConfig *bool, testConfigTemplateProp *string) (path android.Path, autogenPath android.WritablePath) {
	p := getTestConfig(ctx, prop)
@@ -108,10 +108,14 @@ func (ob Object) Config() string {
}

func autogenTemplate(ctx android.ModuleContext, output android.WritablePath, template string, configs []Config) {
	autogenTemplateWithName(ctx, ctx.ModuleName(), output, template, configs)
	autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), output, template, configs, "")
}

func autogenTemplateWithName(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config) {
	autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), output, template, configs, "")
}

func autogenTemplateWithNameAndOutputFile(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config, outputFileName string) {
	var configStrings []string
	for _, config := range configs {
		configStrings = append(configStrings, config.Config())
@@ -127,6 +131,7 @@ func autogenTemplateWithName(ctx android.ModuleContext, name string, output andr
			"name":           name,
			"template":       template,
			"extraConfigs":   extraConfigs,
			"outputFileName": outputFileName,
		},
	})
}
@@ -150,6 +155,21 @@ func AutoGenNativeTestConfig(ctx android.ModuleContext, testConfigProp *string,
	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)
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ func init() {
	pctx.SourcePathVariable("PythonBinaryHostTestConfigTemplate", "build/make/core/python_binary_host_test_config_template.xml")
	pctx.SourcePathVariable("RustDeviceTestConfigTemplate", "build/make/core/rust_device_test_config_template.xml")
	pctx.SourcePathVariable("RustHostTestConfigTemplate", "build/make/core/rust_host_test_config_template.xml")
	pctx.SourcePathVariable("ShellTestConfigTemplate", "build/make/core/shell_test_config_template.xml")

	pctx.SourcePathVariable("EmptyTestConfig", "build/make/core/empty_test_config.xml")
}
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ func makeVarsProvider(ctx android.MakeVarsContext) {
	ctx.Strict("PYTHON_BINARY_HOST_TEST_CONFIG_TEMPLATE", "${PythonBinaryHostTestConfigTemplate}")
	ctx.Strict("RUST_DEVICE_TEST_CONFIG_TEMPLATE", "${RustDeviceTestConfigTemplate}")
	ctx.Strict("RUST_HOST_TEST_CONFIG_TEMPLATE", "${RustHostTestConfigTemplate}")
	ctx.Strict("SHELL_TEST_CONFIG_TEMPLATE", "${ShellTestConfigTemplate}")

	ctx.Strict("EMPTY_TEST_CONFIG", "${EmptyTestConfig}")
}