|  | 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) | 
|  | } |