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