| // Copyright 2022 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package android |
| |
| import ( |
| "encoding/json" |
| "os" |
| "path/filepath" |
| "runtime" |
| |
| "github.com/google/blueprint/proptools" |
| ) |
| |
| // TestConfig returns a Config object for testing. |
| func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config { |
| envCopy := make(map[string]string) |
| for k, v := range env { |
| envCopy[k] = v |
| } |
| |
| // Copy the real PATH value to the test environment, it's needed by |
| // NonHermeticHostSystemTool() used in x86_darwin_host.go |
| envCopy["PATH"] = os.Getenv("PATH") |
| |
| config := &config{ |
| productVariables: productVariables{ |
| DeviceName: stringPtr("test_device"), |
| DeviceProduct: stringPtr("test_product"), |
| Platform_sdk_version: intPtr(30), |
| Platform_sdk_codename: stringPtr("S"), |
| Platform_base_sdk_extension_version: intPtr(1), |
| Platform_version_active_codenames: []string{"S", "Tiramisu"}, |
| DeviceSystemSdkVersions: []string{"14", "15"}, |
| Platform_systemsdk_versions: []string{"29", "30"}, |
| AAPTConfig: []string{"normal", "large", "xlarge", "hdpi", "xhdpi", "xxhdpi"}, |
| AAPTPreferredConfig: stringPtr("xhdpi"), |
| AAPTCharacteristics: stringPtr("nosdcard"), |
| AAPTPrebuiltDPI: []string{"xhdpi", "xxhdpi"}, |
| UncompressPrivAppDex: boolPtr(true), |
| ShippingApiLevel: stringPtr("30"), |
| }, |
| |
| outDir: buildDir, |
| soongOutDir: filepath.Join(buildDir, "soong"), |
| captureBuild: true, |
| env: envCopy, |
| |
| // Set testAllowNonExistentPaths so that test contexts don't need to specify every path |
| // passed to PathForSource or PathForModuleSrc. |
| TestAllowNonExistentPaths: true, |
| |
| BazelContext: noopBazelContext{}, |
| BuildMode: BazelProdMode, |
| mixedBuildDisabledModules: make(map[string]struct{}), |
| mixedBuildEnabledModules: make(map[string]struct{}), |
| bazelForceEnabledModules: make(map[string]struct{}), |
| } |
| config.deviceConfig = &deviceConfig{ |
| config: config, |
| } |
| config.TestProductVariables = &config.productVariables |
| |
| config.mockFileSystem(bp, fs) |
| |
| determineBuildOS(config) |
| |
| return Config{config} |
| } |
| |
| func modifyTestConfigToSupportArchMutator(testConfig Config) { |
| config := testConfig.config |
| |
| config.Targets = map[OsType][]Target{ |
| Android: []Target{ |
| {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled, "", "", false}, |
| {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled, "", "", false}, |
| }, |
| config.BuildOS: []Target{ |
| {config.BuildOS, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", false}, |
| {config.BuildOS, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", false}, |
| }, |
| } |
| |
| // Make the CommonOS OsType available for all products. |
| config.Targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]} |
| |
| if runtime.GOOS == "darwin" { |
| config.Targets[config.BuildOS] = config.Targets[config.BuildOS][:1] |
| } |
| |
| config.BuildOSTarget = config.Targets[config.BuildOS][0] |
| config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0] |
| config.AndroidCommonTarget = getCommonTargets(config.Targets[Android])[0] |
| config.AndroidFirstDeviceTarget = FirstTarget(config.Targets[Android], "lib64", "lib32")[0] |
| config.TestProductVariables.DeviceArch = proptools.StringPtr("arm64") |
| config.TestProductVariables.DeviceArchVariant = proptools.StringPtr("armv8-a") |
| config.TestProductVariables.DeviceSecondaryArch = proptools.StringPtr("arm") |
| config.TestProductVariables.DeviceSecondaryArchVariant = proptools.StringPtr("armv7-a-neon") |
| } |
| |
| // ModifyTestConfigForMusl takes a Config returned by TestConfig and changes the host targets from glibc to musl. |
| func ModifyTestConfigForMusl(config Config) { |
| delete(config.Targets, config.BuildOS) |
| config.productVariables.HostMusl = boolPtr(true) |
| determineBuildOS(config.config) |
| config.Targets[config.BuildOS] = []Target{ |
| {config.BuildOS, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", false}, |
| {config.BuildOS, Arch{ArchType: X86}, NativeBridgeDisabled, "", "", false}, |
| } |
| |
| config.BuildOSTarget = config.Targets[config.BuildOS][0] |
| config.BuildOSCommonTarget = getCommonTargets(config.Targets[config.BuildOS])[0] |
| } |
| |
| func modifyTestConfigForMuslArm64HostCross(config Config) { |
| config.Targets[LinuxMusl] = append(config.Targets[LinuxMusl], |
| Target{config.BuildOS, Arch{ArchType: Arm64}, NativeBridgeDisabled, "", "", true}) |
| } |
| |
| // TestArchConfig returns a Config object suitable for using for tests that |
| // need to run the arch mutator. |
| func TestArchConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) Config { |
| testConfig := TestConfig(buildDir, env, bp, fs) |
| modifyTestConfigToSupportArchMutator(testConfig) |
| return testConfig |
| } |
| |
| // CreateTestConfiguredJarList is a function to create ConfiguredJarList for tests. |
| func CreateTestConfiguredJarList(list []string) ConfiguredJarList { |
| // Create the ConfiguredJarList in as similar way as it is created at runtime by marshalling to |
| // a json list of strings and then unmarshalling into a ConfiguredJarList instance. |
| b, err := json.Marshal(list) |
| if err != nil { |
| panic(err) |
| } |
| |
| var jarList ConfiguredJarList |
| err = json.Unmarshal(b, &jarList) |
| if err != nil { |
| panic(err) |
| } |
| |
| return jarList |
| } |