xref: /aosp_15_r20/build/soong/android/test_suites.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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