1// Copyright 2020 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 dexpreopt 16 17import ( 18 "fmt" 19 20 "android/soong/android" 21) 22 23type fakeToolBinary struct { 24 android.ModuleBase 25} 26 27func (m *fakeToolBinary) GenerateAndroidBuildActions(ctx android.ModuleContext) {} 28 29func (m *fakeToolBinary) HostToolPath() android.OptionalPath { 30 return android.OptionalPathForPath(android.PathForTesting("dex2oat")) 31} 32 33func fakeToolBinaryFactory() android.Module { 34 module := &fakeToolBinary{} 35 android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst) 36 return module 37} 38 39func RegisterToolModulesForTest(ctx android.RegistrationContext) { 40 ctx.RegisterModuleType("fake_tool_binary", fakeToolBinaryFactory) 41} 42 43func BpToolModulesForTest() string { 44 return ` 45 fake_tool_binary { 46 name: "dex2oatd", 47 } 48 ` 49} 50 51func CompatLibDefinitionsForTest() string { 52 bp := "" 53 54 // For class loader context and <uses-library> tests. 55 dexpreoptModules := []string{"android.test.runner"} 56 dexpreoptModules = append(dexpreoptModules, CompatUsesLibs...) 57 dexpreoptModules = append(dexpreoptModules, OptionalCompatUsesLibs...) 58 59 for _, extra := range dexpreoptModules { 60 bp += fmt.Sprintf(` 61 java_library { 62 name: "%s", 63 srcs: ["a.java"], 64 sdk_version: "none", 65 system_modules: "stable-core-platform-api-stubs-system-modules", 66 compile_dex: true, 67 installable: true, 68 } 69 `, extra) 70 } 71 72 return bp 73} 74 75var PrepareForTestWithDexpreoptCompatLibs = android.GroupFixturePreparers( 76 android.FixtureAddFile("defaults/dexpreopt/compat/a.java", nil), 77 android.FixtureAddTextFile("defaults/dexpreopt/compat/Android.bp", CompatLibDefinitionsForTest()), 78) 79 80var PrepareForTestWithFakeDex2oatd = android.GroupFixturePreparers( 81 android.FixtureRegisterWithContext(RegisterToolModulesForTest), 82 android.FixtureAddTextFile("defaults/dexpreopt/Android.bp", BpToolModulesForTest()), 83) 84 85// Prepares a test fixture by enabling dexpreopt, registering the fake_tool_binary module type and 86// using that to define the `dex2oatd` module. 87var PrepareForTestByEnablingDexpreopt = android.GroupFixturePreparers( 88 FixtureModifyGlobalConfig(func(android.PathContext, *GlobalConfig) {}), 89) 90 91// FixtureModifyGlobalConfig enables dexpreopt (unless modified by the mutator) and modifies the 92// configuration. 93func FixtureModifyGlobalConfig(configModifier func(ctx android.PathContext, dexpreoptConfig *GlobalConfig)) android.FixturePreparer { 94 return android.FixtureModifyConfig(func(config android.Config) { 95 // Initialize the dexpreopt GlobalConfig to an empty structure. This has no effect if it has 96 // already been set. 97 pathCtx := android.PathContextForTesting(config) 98 dexpreoptConfig := GlobalConfigForTests(pathCtx) 99 SetTestGlobalConfig(config, dexpreoptConfig) 100 101 // Retrieve the existing configuration and modify it. 102 dexpreoptConfig = GetGlobalConfig(pathCtx) 103 configModifier(pathCtx, dexpreoptConfig) 104 }) 105} 106 107// FixtureSetArtBootJars enables dexpreopt and sets the ArtApexJars property. 108func FixtureSetArtBootJars(bootJars ...string) android.FixturePreparer { 109 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 110 dexpreoptConfig.ArtApexJars = android.CreateTestConfiguredJarList(bootJars) 111 }) 112} 113 114// FixtureSetBootJars enables dexpreopt and sets the BootJars property. 115func FixtureSetBootJars(bootJars ...string) android.FixturePreparer { 116 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 117 dexpreoptConfig.BootJars = android.CreateTestConfiguredJarList(bootJars) 118 }) 119} 120 121// FixtureSetApexBootJars sets the ApexBootJars property in the global config. 122func FixtureSetApexBootJars(bootJars ...string) android.FixturePreparer { 123 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 124 dexpreoptConfig.ApexBootJars = android.CreateTestConfiguredJarList(bootJars) 125 }) 126} 127 128// FixtureSetStandaloneSystemServerJars sets the StandaloneSystemServerJars property. 129func FixtureSetStandaloneSystemServerJars(jars ...string) android.FixturePreparer { 130 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 131 dexpreoptConfig.StandaloneSystemServerJars = android.CreateTestConfiguredJarList(jars) 132 }) 133} 134 135// FixtureSetSystemServerJars sets the SystemServerJars property. 136func FixtureSetSystemServerJars(jars ...string) android.FixturePreparer { 137 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 138 dexpreoptConfig.SystemServerJars = android.CreateTestConfiguredJarList(jars) 139 }) 140} 141 142// FixtureSetApexSystemServerJars sets the ApexSystemServerJars property in the global config. 143func FixtureSetApexSystemServerJars(jars ...string) android.FixturePreparer { 144 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 145 dexpreoptConfig.ApexSystemServerJars = android.CreateTestConfiguredJarList(jars) 146 }) 147} 148 149// FixtureSetApexStandaloneSystemServerJars sets the ApexStandaloneSystemServerJars property in the 150// global config. 151func FixtureSetApexStandaloneSystemServerJars(jars ...string) android.FixturePreparer { 152 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 153 dexpreoptConfig.ApexStandaloneSystemServerJars = android.CreateTestConfiguredJarList(jars) 154 }) 155} 156 157// FixtureSetPreoptWithUpdatableBcp sets the PreoptWithUpdatableBcp property in the global config. 158func FixtureSetPreoptWithUpdatableBcp(value bool) android.FixturePreparer { 159 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 160 dexpreoptConfig.PreoptWithUpdatableBcp = value 161 }) 162} 163 164// FixtureSetBootImageProfiles sets the BootImageProfiles property in the global config. 165func FixtureSetBootImageProfiles(profiles ...string) android.FixturePreparer { 166 return FixtureModifyGlobalConfig(func(ctx android.PathContext, dexpreoptConfig *GlobalConfig) { 167 dexpreoptConfig.BootImageProfiles = android.PathsForSource(ctx, profiles) 168 }) 169} 170 171// FixtureDisableGenerateProfile sets the DisableGenerateProfile property in the global config. 172func FixtureDisableGenerateProfile(disable bool) android.FixturePreparer { 173 return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { 174 dexpreoptConfig.DisableGenerateProfile = disable 175 }) 176} 177