|  | // Copyright 2020 Google Inc. All rights reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package android | 
|  |  | 
|  | func init() { | 
|  | RegisterParallelSingletonType("testsuites", testSuiteFilesFactory) | 
|  | } | 
|  |  | 
|  | func testSuiteFilesFactory() Singleton { | 
|  | return &testSuiteFiles{} | 
|  | } | 
|  |  | 
|  | type testSuiteFiles struct { | 
|  | robolectric WritablePath | 
|  | ravenwood   WritablePath | 
|  | } | 
|  |  | 
|  | type TestSuiteModule interface { | 
|  | Module | 
|  | TestSuites() []string | 
|  | } | 
|  |  | 
|  | func (t *testSuiteFiles) GenerateBuildActions(ctx SingletonContext) { | 
|  | files := make(map[string]map[string]InstallPaths) | 
|  |  | 
|  | ctx.VisitAllModules(func(m Module) { | 
|  | if tsm, ok := m.(TestSuiteModule); ok { | 
|  | for _, testSuite := range tsm.TestSuites() { | 
|  | if files[testSuite] == nil { | 
|  | files[testSuite] = make(map[string]InstallPaths) | 
|  | } | 
|  | name := ctx.ModuleName(m) | 
|  | files[testSuite][name] = append(files[testSuite][name], tsm.FilesToInstall()...) | 
|  | } | 
|  | } | 
|  | }) | 
|  |  | 
|  | t.robolectric = robolectricTestSuite(ctx, files["robolectric-tests"]) | 
|  | ctx.Phony("robolectric-tests", t.robolectric) | 
|  |  | 
|  | t.ravenwood = ravenwoodTestSuite(ctx, files["ravenwood-tests"]) | 
|  | ctx.Phony("ravenwood-tests", t.ravenwood) | 
|  | } | 
|  |  | 
|  | func (t *testSuiteFiles) MakeVars(ctx MakeVarsContext) { | 
|  | ctx.DistForGoal("robolectric-tests", t.robolectric) | 
|  | ctx.DistForGoal("ravenwood-tests", t.ravenwood) | 
|  | } | 
|  |  | 
|  | func robolectricTestSuite(ctx SingletonContext, files map[string]InstallPaths) WritablePath { | 
|  | var installedPaths InstallPaths | 
|  | for _, module := range SortedKeys(files) { | 
|  | installedPaths = append(installedPaths, files[module]...) | 
|  | } | 
|  | testCasesDir := pathForInstall(ctx, ctx.Config().BuildOS, X86, "testcases") | 
|  |  | 
|  | outputFile := PathForOutput(ctx, "packaging", "robolectric-tests.zip") | 
|  | rule := NewRuleBuilder(pctx, ctx) | 
|  | rule.Command().BuiltTool("soong_zip"). | 
|  | FlagWithOutput("-o ", outputFile). | 
|  | FlagWithArg("-P ", "host/testcases"). | 
|  | FlagWithArg("-C ", testCasesDir.String()). | 
|  | FlagWithRspFileInputList("-r ", outputFile.ReplaceExtension(ctx, "rsp"), installedPaths.Paths()). | 
|  | Flag("-sha256") | 
|  | rule.Build("robolectric_tests_zip", "robolectric-tests.zip") | 
|  |  | 
|  | return outputFile | 
|  | } | 
|  |  | 
|  | func ravenwoodTestSuite(ctx SingletonContext, files map[string]InstallPaths) WritablePath { | 
|  | var installedPaths InstallPaths | 
|  | for _, module := range SortedKeys(files) { | 
|  | installedPaths = append(installedPaths, files[module]...) | 
|  | } | 
|  | testCasesDir := pathForInstall(ctx, ctx.Config().BuildOS, X86, "testcases") | 
|  |  | 
|  | outputFile := PathForOutput(ctx, "packaging", "ravenwood-tests.zip") | 
|  | rule := NewRuleBuilder(pctx, ctx) | 
|  | rule.Command().BuiltTool("soong_zip"). | 
|  | FlagWithOutput("-o ", outputFile). | 
|  | FlagWithArg("-P ", "host/testcases"). | 
|  | FlagWithArg("-C ", testCasesDir.String()). | 
|  | FlagWithRspFileInputList("-r ", outputFile.ReplaceExtension(ctx, "rsp"), installedPaths.Paths()). | 
|  | Flag("-sha256") | 
|  | rule.Build("ravenwood_tests_zip", "ravenwood-tests.zip") | 
|  |  | 
|  | return outputFile | 
|  | } |