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: I75f7eb002c8325ce7cdc76e12e76e16195320620
This commit is contained in:
Cole Faust 2022-12-07 18:18:37 -08:00
parent 3784d14404
commit 8ec823cba1
10 changed files with 232 additions and 177 deletions

View file

@ -27,7 +27,6 @@ import (
"text/scanner"
"android/soong/bazel"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
)

View file

@ -459,8 +459,16 @@ func (test *testBinary) install(ctx ModuleContext, file android.Path) {
configs = append(configs, tradefed.Object{"module_controller", "com.android.tradefed.testtype.suite.module.MinApiLevelModuleController", options})
}
test.testConfig = tradefed.AutoGenNativeTestConfig(ctx, test.Properties.Test_config,
test.Properties.Test_config_template, test.testDecorator.InstallerProperties.Test_suites, configs, test.Properties.Auto_gen_config, testInstallBase)
test.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(test.Properties.Test_config).
SetTestTemplateConfigProp(test.Properties.Test_config_template).
SetTestSuites(test.testDecorator.InstallerProperties.Test_suites).
SetConfig(configs).
SetAutoGenConfig(test.Properties.Auto_gen_config).
SetTestInstallBase(testInstallBase).
SetDeviceTemplate("${NativeTestConfigTemplate}").
SetHostTemplate("${NativeHostTestConfigTemplate}").
Build()
test.extraTestConfigs = android.PathsForModuleSrc(ctx, test.Properties.Test_options.Extra_test_configs)
@ -616,8 +624,15 @@ func (benchmark *benchmarkDecorator) install(ctx ModuleContext, file android.Pat
if Bool(benchmark.Properties.Require_root) {
configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.RootTargetPreparer", nil})
}
benchmark.testConfig = tradefed.AutoGenNativeBenchmarkTestConfig(ctx, benchmark.Properties.Test_config,
benchmark.Properties.Test_config_template, benchmark.Properties.Test_suites, configs, benchmark.Properties.Auto_gen_config)
benchmark.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(benchmark.Properties.Test_config).
SetTestTemplateConfigProp(benchmark.Properties.Test_config_template).
SetTestSuites(benchmark.Properties.Test_suites).
SetConfig(configs).
SetAutoGenConfig(benchmark.Properties.Auto_gen_config).
SetDeviceTemplate("${NativeBenchmarkTestConfigTemplate}").
SetHostTemplate("${NativeBenchmarkTestConfigTemplate}").
Build()
benchmark.binaryDecorator.baseInstaller.dir = filepath.Join("benchmarktest", ctx.ModuleName())
benchmark.binaryDecorator.baseInstaller.dir64 = filepath.Join("benchmarktest64", ctx.ModuleName())

View file

@ -888,6 +888,10 @@ type TestOptions struct {
// a list of extra test configuration files that should be installed with the module.
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 {
@ -1166,8 +1170,18 @@ func (j *Test) generateAndroidBuildActionsWithConfig(ctx android.ModuleContext,
j.testProperties.Test_options.Unit_test = proptools.BoolPtr(defaultUnitTest)
}
j.testConfig = tradefed.AutoGenJavaTestConfig(ctx, j.testProperties.Test_config, j.testProperties.Test_config_template,
j.testProperties.Test_suites, configs, j.testProperties.Auto_gen_config, j.testProperties.Test_options.Unit_test)
j.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(j.testProperties.Test_config).
SetTestTemplateConfigProp(j.testProperties.Test_config_template).
SetTestSuites(j.testProperties.Test_suites).
SetConfig(configs).
SetOptionsForAutogenerated(j.testProperties.Test_options.Tradefed_options).
SetAutoGenConfig(j.testProperties.Auto_gen_config).
SetUnitTest(j.testProperties.Test_options.Unit_test).
SetDeviceTemplate("${JavaTestConfigTemplate}").
SetHostTemplate("${JavaHostTestConfigTemplate}").
SetHostUnitTestTemplate("${JavaHostUnitTestConfigTemplate}").
Build()
j.data = android.PathsForModuleSrc(ctx, j.testProperties.Data)
@ -1212,8 +1226,13 @@ func (j *TestHelperLibrary) GenerateAndroidBuildActions(ctx android.ModuleContex
}
func (j *JavaTestImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
j.testConfig = tradefed.AutoGenJavaTestConfig(ctx, j.prebuiltTestProperties.Test_config, nil,
j.prebuiltTestProperties.Test_suites, nil, nil, nil)
j.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(j.prebuiltTestProperties.Test_config).
SetTestSuites(j.prebuiltTestProperties.Test_suites).
SetDeviceTemplate("${JavaTestConfigTemplate}").
SetHostTemplate("${JavaHostTestConfigTemplate}").
SetHostUnitTestTemplate("${JavaHostUnitTestConfigTemplate}").
Build()
j.Import.GenerateAndroidBuildActions(ctx)
}

View file

@ -1945,3 +1945,25 @@ 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"
}
]
}
}
`)
args := result.ModuleForTests("foo", "linux_glibc_common").
Output("out/soong/.intermediates/foo/linux_glibc_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.forceArchType = ctx.Config().BuildArch
r.testConfig = tradefed.AutoGenRobolectricTestConfig(ctx, r.testProperties.Test_config,
r.testProperties.Test_config_template, r.testProperties.Test_suites,
r.testProperties.Auto_gen_config)
r.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(r.testProperties.Test_config).
SetTestTemplateConfigProp(r.testProperties.Test_config_template).
SetTestSuites(r.testProperties.Test_suites).
SetAutoGenConfig(r.testProperties.Auto_gen_config).
SetDeviceTemplate("${RobolectricTestConfigTemplate}").
SetHostTemplate("${RobolectricTestConfigTemplate}").
Build()
r.data = android.PathsForModuleSrc(ctx, r.testProperties.Data)
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) {
test.testConfig = tradefed.AutoGenPythonBinaryHostTestConfig(ctx, test.testProperties.Test_config,
test.testProperties.Test_config_template, test.binaryDecorator.binaryProperties.Test_suites,
test.binaryDecorator.binaryProperties.Auto_gen_config)
test.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(test.testProperties.Test_config).
SetTestTemplateConfigProp(test.testProperties.Test_config_template).
SetTestSuites(test.binaryDecorator.binaryProperties.Test_suites).
SetAutoGenConfig(test.binaryDecorator.binaryProperties.Auto_gen_config).
SetDeviceTemplate("${PythonBinaryHostTestConfigTemplate}").
SetHostTemplate("${PythonBinaryHostTestConfigTemplate}").
Build()
test.binaryDecorator.pythonInstaller.dir = "nativetest"
test.binaryDecorator.pythonInstaller.dir64 = "nativetest64"

View file

@ -112,12 +112,14 @@ func (benchmark *benchmarkDecorator) compilerProps() []interface{} {
}
func (benchmark *benchmarkDecorator) install(ctx ModuleContext) {
benchmark.testConfig = tradefed.AutoGenRustBenchmarkConfig(ctx,
benchmark.Properties.Test_config,
benchmark.Properties.Test_config_template,
benchmark.Properties.Test_suites,
nil,
benchmark.Properties.Auto_gen_config)
benchmark.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(benchmark.Properties.Test_config).
SetTestTemplateConfigProp(benchmark.Properties.Test_config_template).
SetTestSuites(benchmark.Properties.Test_suites).
SetAutoGenConfig(benchmark.Properties.Auto_gen_config).
SetDeviceTemplate("${RustDeviceBenchmarkConfigTemplate}").
SetHostTemplate("${RustHostBenchmarkConfigTemplate}").
Build()
// default relative install path is module name
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})
}
test.testConfig = tradefed.AutoGenRustTestConfig(ctx,
test.Properties.Test_config,
test.Properties.Test_config_template,
test.Properties.Test_suites,
configs,
test.Properties.Auto_gen_config,
testInstallBase)
test.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(test.Properties.Test_config).
SetTestTemplateConfigProp(test.Properties.Test_config_template).
SetTestSuites(test.Properties.Test_suites).
SetConfig(configs).
SetAutoGenConfig(test.Properties.Auto_gen_config).
SetTestInstallBase(testInstallBase).
SetDeviceTemplate("${RustDeviceTestConfigTemplate}").
SetHostTemplate("${RustHostTestConfigTemplate}").
Build()
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})
}
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())
s.testConfig = tradefed.NewMaybeAutoGenTestConfigBuilder(ctx).
SetTestConfigProp(s.testProperties.Test_config).
SetTestTemplateConfigProp(s.testProperties.Test_config_template).
SetTestSuites(s.testProperties.Test_suites).
SetConfig(configs).
SetAutoGenConfig(s.testProperties.Auto_gen_config).
SetOutputFileName(s.outputFilePath.Base()).
SetDeviceTemplate("${ShellTestConfigTemplate}").
SetHostTemplate("${ShellTestConfigTemplate}").
Build()
s.dataModules = make(map[string]android.Path)
ctx.VisitDirectDeps(func(dep android.Module) {

View file

@ -107,15 +107,134 @@ func (ob Object) Config() string {
}
func autogenTemplate(ctx android.ModuleContext, output android.WritablePath, template string, configs []Config, testInstallBase string) {
autogenTemplateWithNameAndOutputFile(ctx, ctx.ModuleName(), output, template, configs, "", testInstallBase)
// MaybeAutoGenTestConfigBuilder provides a Build() method that will either
// generate a AndroidTest.xml file, or use an existing user-supplied one.
// It used to be a bunch of separate functions for each language, but was
// converted to this builder pattern to have one function that accepts many
// optional arguments.
type MaybeAutoGenTestConfigBuilder struct {
ctx android.ModuleContext
name string
outputFileName string
testConfigProp *string
testConfigTemplateProp *string
testSuites []string
config []Config
configsForAutogenerated []Config
autoGenConfig *bool
unitTest *bool
testInstallBase string
deviceTemplate string
hostTemplate string
hostUnitTestTemplate string
}
func autogenTemplateWithName(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config, testInstallBase string) {
autogenTemplateWithNameAndOutputFile(ctx, name, output, template, configs, "", testInstallBase)
func NewMaybeAutoGenTestConfigBuilder(ctx android.ModuleContext) *MaybeAutoGenTestConfigBuilder {
return &MaybeAutoGenTestConfigBuilder{
ctx: ctx,
name: ctx.ModuleName(),
}
}
func autogenTemplateWithNameAndOutputFile(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config, outputFileName string, testInstallBase string) {
func (b *MaybeAutoGenTestConfigBuilder) SetName(name string) *MaybeAutoGenTestConfigBuilder {
b.name = name
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetOutputFileName(outputFileName string) *MaybeAutoGenTestConfigBuilder {
b.outputFileName = outputFileName
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetTestConfigProp(testConfigProp *string) *MaybeAutoGenTestConfigBuilder {
b.testConfigProp = testConfigProp
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetTestTemplateConfigProp(testConfigTemplateProp *string) *MaybeAutoGenTestConfigBuilder {
b.testConfigTemplateProp = testConfigTemplateProp
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetTestSuites(testSuites []string) *MaybeAutoGenTestConfigBuilder {
b.testSuites = testSuites
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetConfig(config []Config) *MaybeAutoGenTestConfigBuilder {
b.config = config
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetOptionsForAutogenerated(configsForAutogenerated []Option) *MaybeAutoGenTestConfigBuilder {
configs := make([]Config, 0, len(configsForAutogenerated))
for _, c := range configsForAutogenerated {
configs = append(configs, c)
}
b.configsForAutogenerated = configs
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetUnitTest(unitTest *bool) *MaybeAutoGenTestConfigBuilder {
b.unitTest = unitTest
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetAutoGenConfig(autoGenConfig *bool) *MaybeAutoGenTestConfigBuilder {
b.autoGenConfig = autoGenConfig
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetTestInstallBase(testInstallBase string) *MaybeAutoGenTestConfigBuilder {
b.testInstallBase = testInstallBase
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetDeviceTemplate(deviceTemplate string) *MaybeAutoGenTestConfigBuilder {
b.deviceTemplate = deviceTemplate
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetHostTemplate(hostTemplate string) *MaybeAutoGenTestConfigBuilder {
b.hostTemplate = hostTemplate
return b
}
func (b *MaybeAutoGenTestConfigBuilder) SetHostUnitTestTemplate(hostUnitTestTemplate string) *MaybeAutoGenTestConfigBuilder {
b.hostUnitTestTemplate = hostUnitTestTemplate
return b
}
func (b *MaybeAutoGenTestConfigBuilder) Build() android.Path {
config := append(b.config, b.configsForAutogenerated...)
path, autogenPath := testConfigPath(b.ctx, b.testConfigProp, b.testSuites, b.autoGenConfig, b.testConfigTemplateProp)
if autogenPath != nil {
templatePath := getTestConfigTemplate(b.ctx, b.testConfigTemplateProp)
if templatePath.Valid() {
autogenTemplate(b.ctx, b.name, autogenPath, templatePath.String(), config, b.outputFileName, b.testInstallBase)
} else {
if b.ctx.Device() {
autogenTemplate(b.ctx, b.name, autogenPath, b.deviceTemplate, config, b.outputFileName, b.testInstallBase)
} else {
if Bool(b.unitTest) {
autogenTemplate(b.ctx, b.name, autogenPath, b.hostUnitTestTemplate, config, b.outputFileName, b.testInstallBase)
} else {
autogenTemplate(b.ctx, b.name, autogenPath, b.hostTemplate, config, b.outputFileName, b.testInstallBase)
}
}
}
return autogenPath
}
if len(b.configsForAutogenerated) > 0 {
b.ctx.ModuleErrorf("Extra tradefed configurations were provided for an autogenerated xml file, but the autogenerated xml file was not used.")
}
return path
}
func autogenTemplate(ctx android.ModuleContext, name string, output android.WritablePath, template string, configs []Config, outputFileName string, testInstallBase string) {
if template == "" {
ctx.ModuleErrorf("Empty template")
}
var configStrings []string
for _, config := range configs {
configStrings = append(configStrings, config.Config())
@ -137,148 +256,6 @@ func autogenTemplateWithNameAndOutputFile(ctx android.ModuleContext, name string
})
}
func AutoGenNativeTestConfig(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, "${NativeTestConfigTemplate}", config, testInstallBase)
} else {
autogenTemplate(ctx, autogenPath, "${NativeHostTestConfigTemplate}", config, 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 {
autogenTemplate(ctx, autogenPath, "${JavaHostTestConfigTemplate}", config, "")
}
}
}
return autogenPath
}
return path
}
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
}
var autogenInstrumentationTest = pctx.StaticRule("autogenInstrumentationTest", blueprint.RuleParams{
Command: "${AutoGenTestConfigScript} $out $in ${EmptyTestConfig} $template ${extraConfigs}",
CommandDeps: []string{