xref: /aosp_15_r20/build/soong/android/test_config.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2022 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	"encoding/json"
19*333d2b36SAndroid Build Coastguard Worker	"os"
20*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
21*333d2b36SAndroid Build Coastguard Worker	"runtime"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Worker// TestConfig returns a Config object for testing.
27*333d2b36SAndroid Build Coastguard Workerfunc TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
28*333d2b36SAndroid Build Coastguard Worker	envCopy := make(map[string]string)
29*333d2b36SAndroid Build Coastguard Worker	for k, v := range env {
30*333d2b36SAndroid Build Coastguard Worker		envCopy[k] = v
31*333d2b36SAndroid Build Coastguard Worker	}
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Worker	// Copy the real PATH value to the test environment, it's needed by
34*333d2b36SAndroid Build Coastguard Worker	// NonHermeticHostSystemTool() used in x86_darwin_host.go
35*333d2b36SAndroid Build Coastguard Worker	envCopy["PATH"] = os.Getenv("PATH")
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Worker	config := &config{
38*333d2b36SAndroid Build Coastguard Worker		productVariables: ProductVariables{
39*333d2b36SAndroid Build Coastguard Worker			DeviceName:                          stringPtr("test_device"),
40*333d2b36SAndroid Build Coastguard Worker			DeviceProduct:                       stringPtr("test_product"),
41*333d2b36SAndroid Build Coastguard Worker			Platform_sdk_version:                intPtr(30),
42*333d2b36SAndroid Build Coastguard Worker			Platform_sdk_version_or_codename:    stringPtr("S"),
43*333d2b36SAndroid Build Coastguard Worker			Platform_sdk_codename:               stringPtr("S"),
44*333d2b36SAndroid Build Coastguard Worker			Platform_base_sdk_extension_version: intPtr(1),
45*333d2b36SAndroid Build Coastguard Worker			Platform_version_active_codenames:   []string{"S", "Tiramisu"},
46*333d2b36SAndroid Build Coastguard Worker			DeviceSystemSdkVersions:             []string{"29", "30", "S"},
47*333d2b36SAndroid Build Coastguard Worker			Platform_systemsdk_versions:         []string{"29", "30", "S", "Tiramisu"},
48*333d2b36SAndroid Build Coastguard Worker			VendorApiLevel:                      stringPtr("202404"),
49*333d2b36SAndroid Build Coastguard Worker			AAPTConfig:                          []string{"normal", "large", "xlarge", "hdpi", "xhdpi", "xxhdpi"},
50*333d2b36SAndroid Build Coastguard Worker			AAPTPreferredConfig:                 stringPtr("xhdpi"),
51*333d2b36SAndroid Build Coastguard Worker			AAPTCharacteristics:                 stringPtr("nosdcard"),
52*333d2b36SAndroid Build Coastguard Worker			AAPTPrebuiltDPI:                     []string{"xhdpi", "xxhdpi"},
53*333d2b36SAndroid Build Coastguard Worker			UncompressPrivAppDex:                boolPtr(true),
54*333d2b36SAndroid Build Coastguard Worker			Shipping_api_level:                  stringPtr("30"),
55*333d2b36SAndroid Build Coastguard Worker		},
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker		outDir:       buildDir,
58*333d2b36SAndroid Build Coastguard Worker		soongOutDir:  filepath.Join(buildDir, "soong"),
59*333d2b36SAndroid Build Coastguard Worker		captureBuild: true,
60*333d2b36SAndroid Build Coastguard Worker		env:          envCopy,
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker		// Set testAllowNonExistentPaths so that test contexts don't need to specify every path
63*333d2b36SAndroid Build Coastguard Worker		// passed to PathForSource or PathForModuleSrc.
64*333d2b36SAndroid Build Coastguard Worker		TestAllowNonExistentPaths: true,
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker		BuildMode: AnalysisNoBazel,
67*333d2b36SAndroid Build Coastguard Worker	}
68*333d2b36SAndroid Build Coastguard Worker	config.deviceConfig = &deviceConfig{
69*333d2b36SAndroid Build Coastguard Worker		config: config,
70*333d2b36SAndroid Build Coastguard Worker	}
71*333d2b36SAndroid Build Coastguard Worker	config.TestProductVariables = &config.productVariables
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker	config.mockFileSystem(bp, fs)
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker	determineBuildOS(config)
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Worker	return Config{config}
78*333d2b36SAndroid Build Coastguard Worker}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Workerfunc modifyTestConfigToSupportArchMutator(testConfig Config) {
81*333d2b36SAndroid Build Coastguard Worker	config := testConfig.config
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker	config.Targets = map[OsType][]Target{
84*333d2b36SAndroid Build Coastguard Worker		Android: []Target{
85*333d2b36SAndroid Build Coastguard Worker			{Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled, "", "", false},
86*333d2b36SAndroid Build Coastguard Worker			{Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled, "", "", false},
87*333d2b36SAndroid Build Coastguard Worker		},
88*333d2b36SAndroid Build Coastguard Worker		config.BuildOS: []Target{
89*333d2b36SAndroid Build Coastguard Worker			{config.BuildOS, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", false},
90*333d2b36SAndroid Build Coastguard Worker			{config.BuildOS, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", false},
91*333d2b36SAndroid Build Coastguard Worker		},
92*333d2b36SAndroid Build Coastguard Worker	}
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	// Make the CommonOS OsType available for all products.
95*333d2b36SAndroid Build Coastguard Worker	config.Targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker	if runtime.GOOS == "darwin" {
98*333d2b36SAndroid Build Coastguard Worker		config.Targets[config.BuildOS] = config.Targets[config.BuildOS][:1]
99*333d2b36SAndroid Build Coastguard Worker	}
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Worker	config.BuildOSTarget = config.Targets[config.BuildOS][0]
102*333d2b36SAndroid Build Coastguard Worker	config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
103*333d2b36SAndroid Build Coastguard Worker	config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0]
104*333d2b36SAndroid Build Coastguard Worker	config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0]
105*333d2b36SAndroid Build Coastguard Worker	config.TestProductVariables.DeviceArch = proptools.StringPtr("arm64")
106*333d2b36SAndroid Build Coastguard Worker	config.TestProductVariables.DeviceArchVariant = proptools.StringPtr("armv8-a")
107*333d2b36SAndroid Build Coastguard Worker	config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm")
108*333d2b36SAndroid Build Coastguard Worker	config.TestProductVariables.DeviceSecondaryArchVariant = proptools.StringPtr("armv7-a-neon")
109*333d2b36SAndroid Build Coastguard Worker}
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker// ModifyTestConfigForMusl takes a Config returned by TestConfig and changes the host targets from glibc to musl.
112*333d2b36SAndroid Build Coastguard Workerfunc ModifyTestConfigForMusl(config Config) {
113*333d2b36SAndroid Build Coastguard Worker	delete(config.Targets, config.BuildOS)
114*333d2b36SAndroid Build Coastguard Worker	config.productVariables.HostMusl = boolPtr(true)
115*333d2b36SAndroid Build Coastguard Worker	determineBuildOS(config.config)
116*333d2b36SAndroid Build Coastguard Worker	config.Targets[config.BuildOS] = []Target{
117*333d2b36SAndroid Build Coastguard Worker		{config.BuildOS, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", false},
118*333d2b36SAndroid Build Coastguard Worker		{config.BuildOS, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", false},
119*333d2b36SAndroid Build Coastguard Worker	}
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Worker	config.BuildOSTarget = config.Targets[config.BuildOS][0]
122*333d2b36SAndroid Build Coastguard Worker	config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0]
123*333d2b36SAndroid Build Coastguard Worker}
124*333d2b36SAndroid Build Coastguard Worker
125*333d2b36SAndroid Build Coastguard Workerfunc modifyTestConfigForMuslArm64HostCross(config Config) {
126*333d2b36SAndroid Build Coastguard Worker	config.Targets[LinuxMusl] = append(config.Targets[LinuxMusl],
127*333d2b36SAndroid Build Coastguard Worker		Target{config.BuildOS, Arch{ArchType: Arm64}, NativeBridgeDisabled, "", "", true})
128*333d2b36SAndroid Build Coastguard Worker}
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker// TestArchConfig returns a Config object suitable for using for tests that
131*333d2b36SAndroid Build Coastguard Worker// need to run the arch mutator.
132*333d2b36SAndroid Build Coastguard Workerfunc TestArchConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config {
133*333d2b36SAndroid Build Coastguard Worker	testConfig := TestConfig(buildDir, env, bp, fs)
134*333d2b36SAndroid Build Coastguard Worker	modifyTestConfigToSupportArchMutator(testConfig)
135*333d2b36SAndroid Build Coastguard Worker	return testConfig
136*333d2b36SAndroid Build Coastguard Worker}
137*333d2b36SAndroid Build Coastguard Worker
138*333d2b36SAndroid Build Coastguard Worker// CreateTestConfiguredJarList is a function to create ConfiguredJarList for tests.
139*333d2b36SAndroid Build Coastguard Workerfunc CreateTestConfiguredJarList(list []string) ConfiguredJarList {
140*333d2b36SAndroid Build Coastguard Worker	// Create the ConfiguredJarList in as similar way as it is created at runtime by marshalling to
141*333d2b36SAndroid Build Coastguard Worker	// a json list of strings and then unmarshalling into a ConfiguredJarList instance.
142*333d2b36SAndroid Build Coastguard Worker	b, err := json.Marshal(list)
143*333d2b36SAndroid Build Coastguard Worker	if err != nil {
144*333d2b36SAndroid Build Coastguard Worker		panic(err)
145*333d2b36SAndroid Build Coastguard Worker	}
146*333d2b36SAndroid Build Coastguard Worker
147*333d2b36SAndroid Build Coastguard Worker	var jarList ConfiguredJarList
148*333d2b36SAndroid Build Coastguard Worker	err = json.Unmarshal(b, &jarList)
149*333d2b36SAndroid Build Coastguard Worker	if err != nil {
150*333d2b36SAndroid Build Coastguard Worker		panic(err)
151*333d2b36SAndroid Build Coastguard Worker	}
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Worker	return jarList
154*333d2b36SAndroid Build Coastguard Worker}
155