1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage android 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "path/filepath" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker) 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Workerfunc init() { 23*333d2b36SAndroid Build Coastguard Worker RegisterParallelSingletonType("testsuites", testSuiteFilesFactory) 24*333d2b36SAndroid Build Coastguard Worker} 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc testSuiteFilesFactory() Singleton { 27*333d2b36SAndroid Build Coastguard Worker return &testSuiteFiles{} 28*333d2b36SAndroid Build Coastguard Worker} 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workertype testSuiteFiles struct { 31*333d2b36SAndroid Build Coastguard Worker robolectric []Path 32*333d2b36SAndroid Build Coastguard Worker ravenwood []Path 33*333d2b36SAndroid Build Coastguard Worker} 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workertype TestSuiteModule interface { 36*333d2b36SAndroid Build Coastguard Worker Module 37*333d2b36SAndroid Build Coastguard Worker TestSuites() []string 38*333d2b36SAndroid Build Coastguard Worker} 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Workerfunc (t *testSuiteFiles) GenerateBuildActions(ctx SingletonContext) { 41*333d2b36SAndroid Build Coastguard Worker files := make(map[string]map[string]InstallPaths) 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModules(func(m Module) { 44*333d2b36SAndroid Build Coastguard Worker if tsm, ok := m.(TestSuiteModule); ok { 45*333d2b36SAndroid Build Coastguard Worker for _, testSuite := range tsm.TestSuites() { 46*333d2b36SAndroid Build Coastguard Worker if files[testSuite] == nil { 47*333d2b36SAndroid Build Coastguard Worker files[testSuite] = make(map[string]InstallPaths) 48*333d2b36SAndroid Build Coastguard Worker } 49*333d2b36SAndroid Build Coastguard Worker name := ctx.ModuleName(m) 50*333d2b36SAndroid Build Coastguard Worker files[testSuite][name] = append(files[testSuite][name], 51*333d2b36SAndroid Build Coastguard Worker OtherModuleProviderOrDefault(ctx, tsm, InstallFilesProvider).InstallFiles...) 52*333d2b36SAndroid Build Coastguard Worker } 53*333d2b36SAndroid Build Coastguard Worker } 54*333d2b36SAndroid Build Coastguard Worker }) 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker t.robolectric = robolectricTestSuite(ctx, files["robolectric-tests"]) 57*333d2b36SAndroid Build Coastguard Worker ctx.Phony("robolectric-tests", t.robolectric...) 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker t.ravenwood = ravenwoodTestSuite(ctx, files["ravenwood-tests"]) 60*333d2b36SAndroid Build Coastguard Worker ctx.Phony("ravenwood-tests", t.ravenwood...) 61*333d2b36SAndroid Build Coastguard Worker} 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Workerfunc (t *testSuiteFiles) MakeVars(ctx MakeVarsContext) { 64*333d2b36SAndroid Build Coastguard Worker ctx.DistForGoal("robolectric-tests", t.robolectric...) 65*333d2b36SAndroid Build Coastguard Worker ctx.DistForGoal("ravenwood-tests", t.ravenwood...) 66*333d2b36SAndroid Build Coastguard Worker} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Workerfunc robolectricTestSuite(ctx SingletonContext, files map[string]InstallPaths) []Path { 69*333d2b36SAndroid Build Coastguard Worker var installedPaths InstallPaths 70*333d2b36SAndroid Build Coastguard Worker for _, module := range SortedKeys(files) { 71*333d2b36SAndroid Build Coastguard Worker installedPaths = append(installedPaths, files[module]...) 72*333d2b36SAndroid Build Coastguard Worker } 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker outputFile := pathForPackaging(ctx, "robolectric-tests.zip") 75*333d2b36SAndroid Build Coastguard Worker rule := NewRuleBuilder(pctx, ctx) 76*333d2b36SAndroid Build Coastguard Worker rule.Command().BuiltTool("soong_zip"). 77*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-o ", outputFile). 78*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-P ", "host/testcases"). 79*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-C ", pathForTestCases(ctx).String()). 80*333d2b36SAndroid Build Coastguard Worker FlagWithRspFileInputList("-r ", outputFile.ReplaceExtension(ctx, "rsp"), installedPaths.Paths()). 81*333d2b36SAndroid Build Coastguard Worker Flag("-sha256") // necessary to save cas_uploader's time 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker testList := buildTestList(ctx, "robolectric-tests_list", installedPaths) 84*333d2b36SAndroid Build Coastguard Worker testListZipOutputFile := pathForPackaging(ctx, "robolectric-tests_list.zip") 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Worker rule.Command().BuiltTool("soong_zip"). 87*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-o ", testListZipOutputFile). 88*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-C ", pathForPackaging(ctx).String()). 89*333d2b36SAndroid Build Coastguard Worker FlagWithInput("-f ", testList). 90*333d2b36SAndroid Build Coastguard Worker Flag("-sha256") 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Worker rule.Build("robolectric_tests_zip", "robolectric-tests.zip") 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker return []Path{outputFile, testListZipOutputFile} 95*333d2b36SAndroid Build Coastguard Worker} 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Workerfunc ravenwoodTestSuite(ctx SingletonContext, files map[string]InstallPaths) []Path { 98*333d2b36SAndroid Build Coastguard Worker var installedPaths InstallPaths 99*333d2b36SAndroid Build Coastguard Worker for _, module := range SortedKeys(files) { 100*333d2b36SAndroid Build Coastguard Worker installedPaths = append(installedPaths, files[module]...) 101*333d2b36SAndroid Build Coastguard Worker } 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker outputFile := pathForPackaging(ctx, "ravenwood-tests.zip") 104*333d2b36SAndroid Build Coastguard Worker rule := NewRuleBuilder(pctx, ctx) 105*333d2b36SAndroid Build Coastguard Worker rule.Command().BuiltTool("soong_zip"). 106*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-o ", outputFile). 107*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-P ", "host/testcases"). 108*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-C ", pathForTestCases(ctx).String()). 109*333d2b36SAndroid Build Coastguard Worker FlagWithRspFileInputList("-r ", outputFile.ReplaceExtension(ctx, "rsp"), installedPaths.Paths()). 110*333d2b36SAndroid Build Coastguard Worker Flag("-sha256") // necessary to save cas_uploader's time 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker testList := buildTestList(ctx, "ravenwood-tests_list", installedPaths) 113*333d2b36SAndroid Build Coastguard Worker testListZipOutputFile := pathForPackaging(ctx, "ravenwood-tests_list.zip") 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker rule.Command().BuiltTool("soong_zip"). 116*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-o ", testListZipOutputFile). 117*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-C ", pathForPackaging(ctx).String()). 118*333d2b36SAndroid Build Coastguard Worker FlagWithInput("-f ", testList). 119*333d2b36SAndroid Build Coastguard Worker Flag("-sha256") 120*333d2b36SAndroid Build Coastguard Worker 121*333d2b36SAndroid Build Coastguard Worker rule.Build("ravenwood_tests_zip", "ravenwood-tests.zip") 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Worker return []Path{outputFile, testListZipOutputFile} 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Workerfunc buildTestList(ctx SingletonContext, listFile string, installedPaths InstallPaths) Path { 127*333d2b36SAndroid Build Coastguard Worker buf := &strings.Builder{} 128*333d2b36SAndroid Build Coastguard Worker for _, p := range installedPaths { 129*333d2b36SAndroid Build Coastguard Worker if p.Ext() != ".config" { 130*333d2b36SAndroid Build Coastguard Worker continue 131*333d2b36SAndroid Build Coastguard Worker } 132*333d2b36SAndroid Build Coastguard Worker pc, err := toTestListPath(p.String(), pathForTestCases(ctx).String(), "host/testcases") 133*333d2b36SAndroid Build Coastguard Worker if err != nil { 134*333d2b36SAndroid Build Coastguard Worker ctx.Errorf("Failed to convert path: %s, %v", p.String(), err) 135*333d2b36SAndroid Build Coastguard Worker continue 136*333d2b36SAndroid Build Coastguard Worker } 137*333d2b36SAndroid Build Coastguard Worker buf.WriteString(pc) 138*333d2b36SAndroid Build Coastguard Worker buf.WriteString("\n") 139*333d2b36SAndroid Build Coastguard Worker } 140*333d2b36SAndroid Build Coastguard Worker outputFile := pathForPackaging(ctx, listFile) 141*333d2b36SAndroid Build Coastguard Worker WriteFileRuleVerbatim(ctx, outputFile, buf.String()) 142*333d2b36SAndroid Build Coastguard Worker return outputFile 143*333d2b36SAndroid Build Coastguard Worker} 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Workerfunc toTestListPath(path, relativeRoot, prefix string) (string, error) { 146*333d2b36SAndroid Build Coastguard Worker dest, err := filepath.Rel(relativeRoot, path) 147*333d2b36SAndroid Build Coastguard Worker if err != nil { 148*333d2b36SAndroid Build Coastguard Worker return "", err 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker return filepath.Join(prefix, dest), nil 151*333d2b36SAndroid Build Coastguard Worker} 152*333d2b36SAndroid Build Coastguard Worker 153*333d2b36SAndroid Build Coastguard Workerfunc pathForPackaging(ctx PathContext, pathComponents ...string) OutputPath { 154*333d2b36SAndroid Build Coastguard Worker pathComponents = append([]string{"packaging"}, pathComponents...) 155*333d2b36SAndroid Build Coastguard Worker return PathForOutput(ctx, pathComponents...) 156*333d2b36SAndroid Build Coastguard Worker} 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Workerfunc pathForTestCases(ctx PathContext) InstallPath { 159*333d2b36SAndroid Build Coastguard Worker return pathForInstall(ctx, ctx.Config().BuildOS, X86, "testcases") 160*333d2b36SAndroid Build Coastguard Worker} 161