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