| package testing | 
 |  | 
 | import ( | 
 | 	"android/soong/android" | 
 | ) | 
 |  | 
 | const ownershipDirectory = "ownership" | 
 | const fileContainingFilePaths = "all_test_spec_paths.rsp" | 
 | const allTestSpecsFile = "all_test_specs.pb" | 
 |  | 
 | func AllTestSpecsFactory() android.Singleton { | 
 | 	return &allTestSpecsSingleton{} | 
 | } | 
 |  | 
 | type allTestSpecsSingleton struct { | 
 | 	// Path where the collected metadata is stored after successful validation. | 
 | 	outputPath android.OutputPath | 
 | } | 
 |  | 
 | func (this *allTestSpecsSingleton) GenerateBuildActions(ctx android.SingletonContext) { | 
 | 	var intermediateMetadataPaths android.Paths | 
 |  | 
 | 	ctx.VisitAllModules(func(module android.Module) { | 
 | 		if metadata, ok := android.SingletonModuleProvider(ctx, module, TestSpecProviderKey); ok { | 
 | 			intermediateMetadataPaths = append(intermediateMetadataPaths, metadata.IntermediatePath) | 
 | 		} | 
 | 	}) | 
 |  | 
 | 	rspFile := android.PathForOutput(ctx, fileContainingFilePaths) | 
 | 	this.outputPath = android.PathForOutput(ctx, ownershipDirectory, allTestSpecsFile) | 
 |  | 
 | 	rule := android.NewRuleBuilder(pctx, ctx) | 
 | 	cmd := rule.Command(). | 
 | 		BuiltTool("metadata"). | 
 | 		FlagWithArg("-rule ", "test_spec"). | 
 | 		FlagWithRspFileInputList("-inputFile ", rspFile, intermediateMetadataPaths) | 
 | 	cmd.FlagWithOutput("-outputFile ", this.outputPath) | 
 | 	rule.Build("all_test_specs_rule", "Generate all test specifications") | 
 | 	ctx.Phony("all_test_specs", this.outputPath) | 
 | } | 
 |  | 
 | func (this *allTestSpecsSingleton) MakeVars(ctx android.MakeVarsContext) { | 
 | 	ctx.DistForGoal("test_specs", this.outputPath) | 
 | } |