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