blob: 936d2b651fabde164005a3eeb2818792a1badac3 [file] [log] [blame]
Colin Cross8eebb132020-01-29 20:07:03 -08001// Copyright 2020 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package android
16
Weijia He299d62d2024-04-18 22:55:10 +000017import (
18 "path/filepath"
19 "strings"
20)
21
Colin Cross8eebb132020-01-29 20:07:03 -080022func init() {
LaMont Jones0c10e4d2023-05-16 00:58:37 +000023 RegisterParallelSingletonType("testsuites", testSuiteFilesFactory)
Colin Cross8eebb132020-01-29 20:07:03 -080024}
25
26func testSuiteFilesFactory() Singleton {
27 return &testSuiteFiles{}
28}
29
30type testSuiteFiles struct {
Weijia He299d62d2024-04-18 22:55:10 +000031 robolectric []Path
32 ravenwood []Path
Colin Cross8eebb132020-01-29 20:07:03 -080033}
34
35type TestSuiteModule interface {
36 Module
37 TestSuites() []string
38}
39
40func (t *testSuiteFiles) GenerateBuildActions(ctx SingletonContext) {
41 files := make(map[string]map[string]InstallPaths)
42
43 ctx.VisitAllModules(func(m Module) {
44 if tsm, ok := m.(TestSuiteModule); ok {
45 for _, testSuite := range tsm.TestSuites() {
46 if files[testSuite] == nil {
47 files[testSuite] = make(map[string]InstallPaths)
48 }
49 name := ctx.ModuleName(m)
Yu Liud46e5ae2024-08-15 18:46:17 +000050 files[testSuite][name] = append(files[testSuite][name],
51 OtherModuleProviderOrDefault(ctx, tsm, InstallFilesProvider).InstallFiles...)
Colin Cross8eebb132020-01-29 20:07:03 -080052 }
53 }
54 })
55
56 t.robolectric = robolectricTestSuite(ctx, files["robolectric-tests"])
Weijia He299d62d2024-04-18 22:55:10 +000057 ctx.Phony("robolectric-tests", t.robolectric...)
Makoto Onuki4a9869d2023-10-20 10:42:47 -070058
59 t.ravenwood = ravenwoodTestSuite(ctx, files["ravenwood-tests"])
Weijia He299d62d2024-04-18 22:55:10 +000060 ctx.Phony("ravenwood-tests", t.ravenwood...)
Colin Cross8eebb132020-01-29 20:07:03 -080061}
62
63func (t *testSuiteFiles) MakeVars(ctx MakeVarsContext) {
Weijia He299d62d2024-04-18 22:55:10 +000064 ctx.DistForGoal("robolectric-tests", t.robolectric...)
65 ctx.DistForGoal("ravenwood-tests", t.ravenwood...)
Colin Cross8eebb132020-01-29 20:07:03 -080066}
67
Weijia He299d62d2024-04-18 22:55:10 +000068func robolectricTestSuite(ctx SingletonContext, files map[string]InstallPaths) []Path {
Colin Cross8eebb132020-01-29 20:07:03 -080069 var installedPaths InstallPaths
Cole Faust18994c72023-02-28 16:02:16 -080070 for _, module := range SortedKeys(files) {
Colin Cross8eebb132020-01-29 20:07:03 -080071 installedPaths = append(installedPaths, files[module]...)
72 }
Colin Cross8eebb132020-01-29 20:07:03 -080073
Weijia He299d62d2024-04-18 22:55:10 +000074 outputFile := pathForPackaging(ctx, "robolectric-tests.zip")
Colin Crossf1a035e2020-11-16 17:32:30 -080075 rule := NewRuleBuilder(pctx, ctx)
76 rule.Command().BuiltTool("soong_zip").
Colin Cross8eebb132020-01-29 20:07:03 -080077 FlagWithOutput("-o ", outputFile).
78 FlagWithArg("-P ", "host/testcases").
Weijia He299d62d2024-04-18 22:55:10 +000079 FlagWithArg("-C ", pathForTestCases(ctx).String()).
Julien Desprezf3680732023-06-27 20:48:04 +000080 FlagWithRspFileInputList("-r ", outputFile.ReplaceExtension(ctx, "rsp"), installedPaths.Paths()).
Weijia He299d62d2024-04-18 22:55:10 +000081 Flag("-sha256") // necessary to save cas_uploader's time
82
83 testList := buildTestList(ctx, "robolectric-tests_list", installedPaths)
84 testListZipOutputFile := pathForPackaging(ctx, "robolectric-tests_list.zip")
85
86 rule.Command().BuiltTool("soong_zip").
87 FlagWithOutput("-o ", testListZipOutputFile).
88 FlagWithArg("-C ", pathForPackaging(ctx).String()).
89 FlagWithInput("-f ", testList).
Cole Faust3b703f32023-10-16 13:30:51 -070090 Flag("-sha256")
Weijia He299d62d2024-04-18 22:55:10 +000091
Colin Crossf1a035e2020-11-16 17:32:30 -080092 rule.Build("robolectric_tests_zip", "robolectric-tests.zip")
Colin Cross8eebb132020-01-29 20:07:03 -080093
Weijia He299d62d2024-04-18 22:55:10 +000094 return []Path{outputFile, testListZipOutputFile}
Colin Cross8eebb132020-01-29 20:07:03 -080095}
Makoto Onuki4a9869d2023-10-20 10:42:47 -070096
Weijia He299d62d2024-04-18 22:55:10 +000097func ravenwoodTestSuite(ctx SingletonContext, files map[string]InstallPaths) []Path {
Makoto Onuki4a9869d2023-10-20 10:42:47 -070098 var installedPaths InstallPaths
99 for _, module := range SortedKeys(files) {
100 installedPaths = append(installedPaths, files[module]...)
101 }
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700102
Weijia He299d62d2024-04-18 22:55:10 +0000103 outputFile := pathForPackaging(ctx, "ravenwood-tests.zip")
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700104 rule := NewRuleBuilder(pctx, ctx)
105 rule.Command().BuiltTool("soong_zip").
106 FlagWithOutput("-o ", outputFile).
107 FlagWithArg("-P ", "host/testcases").
Weijia He299d62d2024-04-18 22:55:10 +0000108 FlagWithArg("-C ", pathForTestCases(ctx).String()).
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700109 FlagWithRspFileInputList("-r ", outputFile.ReplaceExtension(ctx, "rsp"), installedPaths.Paths()).
Weijia He299d62d2024-04-18 22:55:10 +0000110 Flag("-sha256") // necessary to save cas_uploader's time
111
112 testList := buildTestList(ctx, "ravenwood-tests_list", installedPaths)
113 testListZipOutputFile := pathForPackaging(ctx, "ravenwood-tests_list.zip")
114
115 rule.Command().BuiltTool("soong_zip").
116 FlagWithOutput("-o ", testListZipOutputFile).
117 FlagWithArg("-C ", pathForPackaging(ctx).String()).
118 FlagWithInput("-f ", testList).
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700119 Flag("-sha256")
Weijia He299d62d2024-04-18 22:55:10 +0000120
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700121 rule.Build("ravenwood_tests_zip", "ravenwood-tests.zip")
122
Weijia He299d62d2024-04-18 22:55:10 +0000123 return []Path{outputFile, testListZipOutputFile}
124}
125
126func buildTestList(ctx SingletonContext, listFile string, installedPaths InstallPaths) Path {
127 buf := &strings.Builder{}
128 for _, p := range installedPaths {
129 if p.Ext() != ".config" {
130 continue
131 }
132 pc, err := toTestListPath(p.String(), pathForTestCases(ctx).String(), "host/testcases")
133 if err != nil {
134 ctx.Errorf("Failed to convert path: %s, %v", p.String(), err)
135 continue
136 }
137 buf.WriteString(pc)
138 buf.WriteString("\n")
139 }
140 outputFile := pathForPackaging(ctx, listFile)
141 WriteFileRuleVerbatim(ctx, outputFile, buf.String())
Makoto Onuki4a9869d2023-10-20 10:42:47 -0700142 return outputFile
143}
Weijia He299d62d2024-04-18 22:55:10 +0000144
145func toTestListPath(path, relativeRoot, prefix string) (string, error) {
146 dest, err := filepath.Rel(relativeRoot, path)
147 if err != nil {
148 return "", err
149 }
150 return filepath.Join(prefix, dest), nil
151}
152
153func pathForPackaging(ctx PathContext, pathComponents ...string) OutputPath {
154 pathComponents = append([]string{"packaging"}, pathComponents...)
155 return PathForOutput(ctx, pathComponents...)
156}
157
158func pathForTestCases(ctx PathContext) InstallPath {
159 return pathForInstall(ctx, ctx.Config().BuildOS, X86, "testcases")
160}