|  | // 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_version_or_codename:    stringPtr("S"), | 
|  | Platform_sdk_codename:               stringPtr("S"), | 
|  | Platform_base_sdk_extension_version: intPtr(1), | 
|  | Platform_version_active_codenames:   []string{"S", "Tiramisu"}, | 
|  | DeviceSystemSdkVersions:             []string{"29", "30", "S"}, | 
|  | Platform_systemsdk_versions:         []string{"29", "30", "S", "Tiramisu"}, | 
|  | AAPTConfig:                          []string{"normal", "large", "xlarge", "hdpi", "xhdpi", "xxhdpi"}, | 
|  | AAPTPreferredConfig:                 stringPtr("xhdpi"), | 
|  | AAPTCharacteristics:                 stringPtr("nosdcard"), | 
|  | AAPTPrebuiltDPI:                     []string{"xhdpi", "xxhdpi"}, | 
|  | UncompressPrivAppDex:                boolPtr(true), | 
|  | Shipping_api_level:                  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, | 
|  |  | 
|  | BuildMode: AnalysisNoBazel, | 
|  | } | 
|  | 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 | 
|  | } |