1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "runtime" 20*333d2b36SAndroid Build Coastguard Worker "strings" 21*333d2b36SAndroid Build Coastguard Worker "testing" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 25*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 26*333d2b36SAndroid Build Coastguard Worker) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workerfunc init() { 29*333d2b36SAndroid Build Coastguard Worker RegisterFakeRuntimeApexMutator() 30*333d2b36SAndroid Build Coastguard Worker} 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Workerfunc TestDexpreoptEnabled(t *testing.T) { 33*333d2b36SAndroid Build Coastguard Worker tests := []struct { 34*333d2b36SAndroid Build Coastguard Worker name string 35*333d2b36SAndroid Build Coastguard Worker bp string 36*333d2b36SAndroid Build Coastguard Worker moduleName string 37*333d2b36SAndroid Build Coastguard Worker apexVariant bool 38*333d2b36SAndroid Build Coastguard Worker enabled bool 39*333d2b36SAndroid Build Coastguard Worker }{ 40*333d2b36SAndroid Build Coastguard Worker { 41*333d2b36SAndroid Build Coastguard Worker name: "app", 42*333d2b36SAndroid Build Coastguard Worker bp: ` 43*333d2b36SAndroid Build Coastguard Worker android_app { 44*333d2b36SAndroid Build Coastguard Worker name: "foo", 45*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 46*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 47*333d2b36SAndroid Build Coastguard Worker }`, 48*333d2b36SAndroid Build Coastguard Worker enabled: true, 49*333d2b36SAndroid Build Coastguard Worker }, 50*333d2b36SAndroid Build Coastguard Worker { 51*333d2b36SAndroid Build Coastguard Worker name: "installable java library", 52*333d2b36SAndroid Build Coastguard Worker bp: ` 53*333d2b36SAndroid Build Coastguard Worker java_library { 54*333d2b36SAndroid Build Coastguard Worker name: "foo", 55*333d2b36SAndroid Build Coastguard Worker installable: true, 56*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 57*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 58*333d2b36SAndroid Build Coastguard Worker }`, 59*333d2b36SAndroid Build Coastguard Worker enabled: true, 60*333d2b36SAndroid Build Coastguard Worker }, 61*333d2b36SAndroid Build Coastguard Worker { 62*333d2b36SAndroid Build Coastguard Worker name: "java binary", 63*333d2b36SAndroid Build Coastguard Worker bp: ` 64*333d2b36SAndroid Build Coastguard Worker java_binary { 65*333d2b36SAndroid Build Coastguard Worker name: "foo", 66*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 67*333d2b36SAndroid Build Coastguard Worker main_class: "foo.bar.jb", 68*333d2b36SAndroid Build Coastguard Worker }`, 69*333d2b36SAndroid Build Coastguard Worker enabled: true, 70*333d2b36SAndroid Build Coastguard Worker }, 71*333d2b36SAndroid Build Coastguard Worker { 72*333d2b36SAndroid Build Coastguard Worker name: "app without sources", 73*333d2b36SAndroid Build Coastguard Worker bp: ` 74*333d2b36SAndroid Build Coastguard Worker android_app { 75*333d2b36SAndroid Build Coastguard Worker name: "foo", 76*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 77*333d2b36SAndroid Build Coastguard Worker }`, 78*333d2b36SAndroid Build Coastguard Worker enabled: false, 79*333d2b36SAndroid Build Coastguard Worker }, 80*333d2b36SAndroid Build Coastguard Worker { 81*333d2b36SAndroid Build Coastguard Worker name: "app with libraries", 82*333d2b36SAndroid Build Coastguard Worker bp: ` 83*333d2b36SAndroid Build Coastguard Worker android_app { 84*333d2b36SAndroid Build Coastguard Worker name: "foo", 85*333d2b36SAndroid Build Coastguard Worker static_libs: ["lib"], 86*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 87*333d2b36SAndroid Build Coastguard Worker } 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker java_library { 90*333d2b36SAndroid Build Coastguard Worker name: "lib", 91*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 92*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 93*333d2b36SAndroid Build Coastguard Worker }`, 94*333d2b36SAndroid Build Coastguard Worker enabled: true, 95*333d2b36SAndroid Build Coastguard Worker }, 96*333d2b36SAndroid Build Coastguard Worker { 97*333d2b36SAndroid Build Coastguard Worker name: "installable java library without sources", 98*333d2b36SAndroid Build Coastguard Worker bp: ` 99*333d2b36SAndroid Build Coastguard Worker java_library { 100*333d2b36SAndroid Build Coastguard Worker name: "foo", 101*333d2b36SAndroid Build Coastguard Worker installable: true, 102*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 103*333d2b36SAndroid Build Coastguard Worker }`, 104*333d2b36SAndroid Build Coastguard Worker enabled: false, 105*333d2b36SAndroid Build Coastguard Worker }, 106*333d2b36SAndroid Build Coastguard Worker { 107*333d2b36SAndroid Build Coastguard Worker name: "static java library", 108*333d2b36SAndroid Build Coastguard Worker bp: ` 109*333d2b36SAndroid Build Coastguard Worker java_library { 110*333d2b36SAndroid Build Coastguard Worker name: "foo", 111*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 112*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 113*333d2b36SAndroid Build Coastguard Worker }`, 114*333d2b36SAndroid Build Coastguard Worker enabled: false, 115*333d2b36SAndroid Build Coastguard Worker }, 116*333d2b36SAndroid Build Coastguard Worker { 117*333d2b36SAndroid Build Coastguard Worker name: "java test", 118*333d2b36SAndroid Build Coastguard Worker bp: ` 119*333d2b36SAndroid Build Coastguard Worker java_test { 120*333d2b36SAndroid Build Coastguard Worker name: "foo", 121*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 122*333d2b36SAndroid Build Coastguard Worker }`, 123*333d2b36SAndroid Build Coastguard Worker enabled: false, 124*333d2b36SAndroid Build Coastguard Worker }, 125*333d2b36SAndroid Build Coastguard Worker { 126*333d2b36SAndroid Build Coastguard Worker name: "android test", 127*333d2b36SAndroid Build Coastguard Worker bp: ` 128*333d2b36SAndroid Build Coastguard Worker android_test { 129*333d2b36SAndroid Build Coastguard Worker name: "foo", 130*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 131*333d2b36SAndroid Build Coastguard Worker }`, 132*333d2b36SAndroid Build Coastguard Worker enabled: false, 133*333d2b36SAndroid Build Coastguard Worker }, 134*333d2b36SAndroid Build Coastguard Worker { 135*333d2b36SAndroid Build Coastguard Worker name: "android test helper app", 136*333d2b36SAndroid Build Coastguard Worker bp: ` 137*333d2b36SAndroid Build Coastguard Worker android_test_helper_app { 138*333d2b36SAndroid Build Coastguard Worker name: "foo", 139*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 140*333d2b36SAndroid Build Coastguard Worker }`, 141*333d2b36SAndroid Build Coastguard Worker enabled: false, 142*333d2b36SAndroid Build Coastguard Worker }, 143*333d2b36SAndroid Build Coastguard Worker { 144*333d2b36SAndroid Build Coastguard Worker name: "compile_dex", 145*333d2b36SAndroid Build Coastguard Worker bp: ` 146*333d2b36SAndroid Build Coastguard Worker java_library { 147*333d2b36SAndroid Build Coastguard Worker name: "foo", 148*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 149*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 150*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 151*333d2b36SAndroid Build Coastguard Worker }`, 152*333d2b36SAndroid Build Coastguard Worker enabled: false, 153*333d2b36SAndroid Build Coastguard Worker }, 154*333d2b36SAndroid Build Coastguard Worker { 155*333d2b36SAndroid Build Coastguard Worker name: "dex_import", 156*333d2b36SAndroid Build Coastguard Worker bp: ` 157*333d2b36SAndroid Build Coastguard Worker dex_import { 158*333d2b36SAndroid Build Coastguard Worker name: "foo", 159*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 160*333d2b36SAndroid Build Coastguard Worker }`, 161*333d2b36SAndroid Build Coastguard Worker enabled: true, 162*333d2b36SAndroid Build Coastguard Worker }, 163*333d2b36SAndroid Build Coastguard Worker { 164*333d2b36SAndroid Build Coastguard Worker name: "apex variant", 165*333d2b36SAndroid Build Coastguard Worker bp: ` 166*333d2b36SAndroid Build Coastguard Worker java_library { 167*333d2b36SAndroid Build Coastguard Worker name: "foo", 168*333d2b36SAndroid Build Coastguard Worker installable: true, 169*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 170*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.apex1"], 171*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 172*333d2b36SAndroid Build Coastguard Worker }`, 173*333d2b36SAndroid Build Coastguard Worker apexVariant: true, 174*333d2b36SAndroid Build Coastguard Worker enabled: false, 175*333d2b36SAndroid Build Coastguard Worker }, 176*333d2b36SAndroid Build Coastguard Worker { 177*333d2b36SAndroid Build Coastguard Worker name: "apex variant of apex system server jar", 178*333d2b36SAndroid Build Coastguard Worker bp: ` 179*333d2b36SAndroid Build Coastguard Worker java_library { 180*333d2b36SAndroid Build Coastguard Worker name: "service-foo", 181*333d2b36SAndroid Build Coastguard Worker installable: true, 182*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 183*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.apex1"], 184*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 185*333d2b36SAndroid Build Coastguard Worker }`, 186*333d2b36SAndroid Build Coastguard Worker moduleName: "service-foo", 187*333d2b36SAndroid Build Coastguard Worker apexVariant: true, 188*333d2b36SAndroid Build Coastguard Worker enabled: true, 189*333d2b36SAndroid Build Coastguard Worker }, 190*333d2b36SAndroid Build Coastguard Worker { 191*333d2b36SAndroid Build Coastguard Worker name: "apex variant of prebuilt apex system server jar", 192*333d2b36SAndroid Build Coastguard Worker bp: ` 193*333d2b36SAndroid Build Coastguard Worker java_library { 194*333d2b36SAndroid Build Coastguard Worker name: "prebuilt_service-foo", 195*333d2b36SAndroid Build Coastguard Worker installable: true, 196*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 197*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.apex1"], 198*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 199*333d2b36SAndroid Build Coastguard Worker }`, 200*333d2b36SAndroid Build Coastguard Worker moduleName: "prebuilt_service-foo", 201*333d2b36SAndroid Build Coastguard Worker apexVariant: true, 202*333d2b36SAndroid Build Coastguard Worker enabled: true, 203*333d2b36SAndroid Build Coastguard Worker }, 204*333d2b36SAndroid Build Coastguard Worker { 205*333d2b36SAndroid Build Coastguard Worker name: "platform variant of apex system server jar", 206*333d2b36SAndroid Build Coastguard Worker bp: ` 207*333d2b36SAndroid Build Coastguard Worker java_library { 208*333d2b36SAndroid Build Coastguard Worker name: "service-foo", 209*333d2b36SAndroid Build Coastguard Worker installable: true, 210*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 211*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.apex1"], 212*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 213*333d2b36SAndroid Build Coastguard Worker }`, 214*333d2b36SAndroid Build Coastguard Worker moduleName: "service-foo", 215*333d2b36SAndroid Build Coastguard Worker apexVariant: false, 216*333d2b36SAndroid Build Coastguard Worker enabled: false, 217*333d2b36SAndroid Build Coastguard Worker }, 218*333d2b36SAndroid Build Coastguard Worker } 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 221*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 222*333d2b36SAndroid Build Coastguard Worker preparers := android.GroupFixturePreparers( 223*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDexpreopt, 224*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFakeApexMutator, 225*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"), 226*333d2b36SAndroid Build Coastguard Worker ) 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Worker result := preparers.RunTestWithBp(t, test.bp) 229*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 230*333d2b36SAndroid Build Coastguard Worker 231*333d2b36SAndroid Build Coastguard Worker moduleName := "foo" 232*333d2b36SAndroid Build Coastguard Worker if test.moduleName != "" { 233*333d2b36SAndroid Build Coastguard Worker moduleName = test.moduleName 234*333d2b36SAndroid Build Coastguard Worker } 235*333d2b36SAndroid Build Coastguard Worker 236*333d2b36SAndroid Build Coastguard Worker variant := "android_common" 237*333d2b36SAndroid Build Coastguard Worker if test.apexVariant { 238*333d2b36SAndroid Build Coastguard Worker variant += "_apex1000" 239*333d2b36SAndroid Build Coastguard Worker } 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker dexpreopt := ctx.ModuleForTests(moduleName, variant).MaybeRule("dexpreopt") 242*333d2b36SAndroid Build Coastguard Worker enabled := dexpreopt.Rule != nil 243*333d2b36SAndroid Build Coastguard Worker 244*333d2b36SAndroid Build Coastguard Worker if enabled != test.enabled { 245*333d2b36SAndroid Build Coastguard Worker t.Fatalf("want dexpreopt %s, got %s", enabledString(test.enabled), enabledString(enabled)) 246*333d2b36SAndroid Build Coastguard Worker } 247*333d2b36SAndroid Build Coastguard Worker }) 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Worker } 250*333d2b36SAndroid Build Coastguard Worker} 251*333d2b36SAndroid Build Coastguard Worker 252*333d2b36SAndroid Build Coastguard Workerfunc enabledString(enabled bool) string { 253*333d2b36SAndroid Build Coastguard Worker if enabled { 254*333d2b36SAndroid Build Coastguard Worker return "enabled" 255*333d2b36SAndroid Build Coastguard Worker } else { 256*333d2b36SAndroid Build Coastguard Worker return "disabled" 257*333d2b36SAndroid Build Coastguard Worker } 258*333d2b36SAndroid Build Coastguard Worker} 259*333d2b36SAndroid Build Coastguard Worker 260*333d2b36SAndroid Build Coastguard Workerfunc TestDex2oatToolDeps(t *testing.T) { 261*333d2b36SAndroid Build Coastguard Worker if runtime.GOOS != "linux" { 262*333d2b36SAndroid Build Coastguard Worker // The host binary paths checked below are build OS dependent. 263*333d2b36SAndroid Build Coastguard Worker t.Skipf("Unsupported build OS %s", runtime.GOOS) 264*333d2b36SAndroid Build Coastguard Worker } 265*333d2b36SAndroid Build Coastguard Worker 266*333d2b36SAndroid Build Coastguard Worker preparers := android.GroupFixturePreparers( 267*333d2b36SAndroid Build Coastguard Worker cc.PrepareForTestWithCcDefaultModules, 268*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDexpreoptWithoutFakeDex2oatd, 269*333d2b36SAndroid Build Coastguard Worker dexpreopt.PrepareForTestByEnablingDexpreopt) 270*333d2b36SAndroid Build Coastguard Worker 271*333d2b36SAndroid Build Coastguard Worker testDex2oatToolDep := func(sourceEnabled, prebuiltEnabled, prebuiltPreferred bool, 272*333d2b36SAndroid Build Coastguard Worker expectedDex2oatPath string) { 273*333d2b36SAndroid Build Coastguard Worker name := fmt.Sprintf("sourceEnabled:%t,prebuiltEnabled:%t,prebuiltPreferred:%t", 274*333d2b36SAndroid Build Coastguard Worker sourceEnabled, prebuiltEnabled, prebuiltPreferred) 275*333d2b36SAndroid Build Coastguard Worker t.Run(name, func(t *testing.T) { 276*333d2b36SAndroid Build Coastguard Worker result := preparers.RunTestWithBp(t, fmt.Sprintf(` 277*333d2b36SAndroid Build Coastguard Worker cc_binary { 278*333d2b36SAndroid Build Coastguard Worker name: "dex2oatd", 279*333d2b36SAndroid Build Coastguard Worker enabled: %t, 280*333d2b36SAndroid Build Coastguard Worker host_supported: true, 281*333d2b36SAndroid Build Coastguard Worker } 282*333d2b36SAndroid Build Coastguard Worker cc_prebuilt_binary { 283*333d2b36SAndroid Build Coastguard Worker name: "dex2oatd", 284*333d2b36SAndroid Build Coastguard Worker enabled: %t, 285*333d2b36SAndroid Build Coastguard Worker prefer: %t, 286*333d2b36SAndroid Build Coastguard Worker host_supported: true, 287*333d2b36SAndroid Build Coastguard Worker srcs: ["x86_64/bin/dex2oatd"], 288*333d2b36SAndroid Build Coastguard Worker } 289*333d2b36SAndroid Build Coastguard Worker java_library { 290*333d2b36SAndroid Build Coastguard Worker name: "myjavalib", 291*333d2b36SAndroid Build Coastguard Worker } 292*333d2b36SAndroid Build Coastguard Worker `, sourceEnabled, prebuiltEnabled, prebuiltPreferred)) 293*333d2b36SAndroid Build Coastguard Worker pathContext := android.PathContextForTesting(result.Config) 294*333d2b36SAndroid Build Coastguard Worker dex2oatPath := dexpreopt.GetCachedGlobalSoongConfig(pathContext).Dex2oat 295*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Testing "+name, expectedDex2oatPath, android.NormalizePathForTesting(dex2oatPath)) 296*333d2b36SAndroid Build Coastguard Worker }) 297*333d2b36SAndroid Build Coastguard Worker } 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Worker sourceDex2oatPath := "host/linux-x86/bin/dex2oatd" 300*333d2b36SAndroid Build Coastguard Worker prebuiltDex2oatPath := ".intermediates/prebuilt_dex2oatd/linux_glibc_x86_64/dex2oatd" 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Worker testDex2oatToolDep(true, false, false, sourceDex2oatPath) 303*333d2b36SAndroid Build Coastguard Worker testDex2oatToolDep(true, true, false, sourceDex2oatPath) 304*333d2b36SAndroid Build Coastguard Worker testDex2oatToolDep(true, true, true, prebuiltDex2oatPath) 305*333d2b36SAndroid Build Coastguard Worker testDex2oatToolDep(false, true, false, prebuiltDex2oatPath) 306*333d2b36SAndroid Build Coastguard Worker} 307*333d2b36SAndroid Build Coastguard Worker 308*333d2b36SAndroid Build Coastguard Workerfunc TestDexpreoptBuiltInstalledForApex(t *testing.T) { 309*333d2b36SAndroid Build Coastguard Worker preparers := android.GroupFixturePreparers( 310*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDexpreopt, 311*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFakeApexMutator, 312*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"), 313*333d2b36SAndroid Build Coastguard Worker ) 314*333d2b36SAndroid Build Coastguard Worker 315*333d2b36SAndroid Build Coastguard Worker // An APEX system server jar. 316*333d2b36SAndroid Build Coastguard Worker result := preparers.RunTestWithBp(t, ` 317*333d2b36SAndroid Build Coastguard Worker java_library { 318*333d2b36SAndroid Build Coastguard Worker name: "service-foo", 319*333d2b36SAndroid Build Coastguard Worker installable: true, 320*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 321*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.apex1"], 322*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 323*333d2b36SAndroid Build Coastguard Worker }`) 324*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 325*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("service-foo", "android_common_apex1000") 326*333d2b36SAndroid Build Coastguard Worker library := module.Module().(*Library) 327*333d2b36SAndroid Build Coastguard Worker 328*333d2b36SAndroid Build Coastguard Worker installs := library.dexpreopter.DexpreoptBuiltInstalledForApex() 329*333d2b36SAndroid Build Coastguard Worker 330*333d2b36SAndroid Build Coastguard Worker android.AssertIntEquals(t, "install count", 2, len(installs)) 331*333d2b36SAndroid Build Coastguard Worker 332*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs[0] FullModuleName", 333*333d2b36SAndroid Build Coastguard Worker "[email protected]@[email protected]@classes.odex", 334*333d2b36SAndroid Build Coastguard Worker installs[0].FullModuleName()) 335*333d2b36SAndroid Build Coastguard Worker 336*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs[0] SubModuleName", 337*333d2b36SAndroid Build Coastguard Worker "[email protected]@[email protected]@classes.odex", 338*333d2b36SAndroid Build Coastguard Worker installs[0].SubModuleName()) 339*333d2b36SAndroid Build Coastguard Worker 340*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs[1] FullModuleName", 341*333d2b36SAndroid Build Coastguard Worker "[email protected]@[email protected]@classes.vdex", 342*333d2b36SAndroid Build Coastguard Worker installs[1].FullModuleName()) 343*333d2b36SAndroid Build Coastguard Worker 344*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs[1] SubModuleName", 345*333d2b36SAndroid Build Coastguard Worker "[email protected]@[email protected]@classes.vdex", 346*333d2b36SAndroid Build Coastguard Worker installs[1].SubModuleName()) 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker // Not an APEX system server jar. 349*333d2b36SAndroid Build Coastguard Worker result = preparers.RunTestWithBp(t, ` 350*333d2b36SAndroid Build Coastguard Worker java_library { 351*333d2b36SAndroid Build Coastguard Worker name: "foo", 352*333d2b36SAndroid Build Coastguard Worker installable: true, 353*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 354*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 355*333d2b36SAndroid Build Coastguard Worker }`) 356*333d2b36SAndroid Build Coastguard Worker ctx = result.TestContext 357*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("foo", "android_common") 358*333d2b36SAndroid Build Coastguard Worker library = module.Module().(*Library) 359*333d2b36SAndroid Build Coastguard Worker 360*333d2b36SAndroid Build Coastguard Worker installs = library.dexpreopter.DexpreoptBuiltInstalledForApex() 361*333d2b36SAndroid Build Coastguard Worker 362*333d2b36SAndroid Build Coastguard Worker android.AssertIntEquals(t, "install count", 0, len(installs)) 363*333d2b36SAndroid Build Coastguard Worker} 364*333d2b36SAndroid Build Coastguard Worker 365*333d2b36SAndroid Build Coastguard Workerfunc filterDexpreoptEntriesList(entriesList []android.AndroidMkEntries) []android.AndroidMkEntries { 366*333d2b36SAndroid Build Coastguard Worker var results []android.AndroidMkEntries 367*333d2b36SAndroid Build Coastguard Worker for _, entries := range entriesList { 368*333d2b36SAndroid Build Coastguard Worker if strings.Contains(entries.EntryMap["LOCAL_MODULE"][0], "-dexpreopt-") { 369*333d2b36SAndroid Build Coastguard Worker results = append(results, entries) 370*333d2b36SAndroid Build Coastguard Worker } 371*333d2b36SAndroid Build Coastguard Worker } 372*333d2b36SAndroid Build Coastguard Worker return results 373*333d2b36SAndroid Build Coastguard Worker} 374*333d2b36SAndroid Build Coastguard Worker 375*333d2b36SAndroid Build Coastguard Workerfunc verifyEntries(t *testing.T, message string, expectedModule string, 376*333d2b36SAndroid Build Coastguard Worker expectedPrebuiltModuleFile string, expectedModulePath string, expectedInstalledModuleStem string, 377*333d2b36SAndroid Build Coastguard Worker entries android.AndroidMkEntries) { 378*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, message+" LOCAL_MODULE", expectedModule, 379*333d2b36SAndroid Build Coastguard Worker entries.EntryMap["LOCAL_MODULE"][0]) 380*333d2b36SAndroid Build Coastguard Worker 381*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, message+" LOCAL_MODULE_CLASS", "ETC", 382*333d2b36SAndroid Build Coastguard Worker entries.EntryMap["LOCAL_MODULE_CLASS"][0]) 383*333d2b36SAndroid Build Coastguard Worker 384*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, message+" LOCAL_PREBUILT_MODULE_FILE", 385*333d2b36SAndroid Build Coastguard Worker entries.EntryMap["LOCAL_PREBUILT_MODULE_FILE"][0], expectedPrebuiltModuleFile) 386*333d2b36SAndroid Build Coastguard Worker 387*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, message+" LOCAL_MODULE_PATH", 388*333d2b36SAndroid Build Coastguard Worker entries.EntryMap["LOCAL_MODULE_PATH"][0], expectedModulePath) 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, message+" LOCAL_INSTALLED_MODULE_STEM", 391*333d2b36SAndroid Build Coastguard Worker expectedInstalledModuleStem, entries.EntryMap["LOCAL_INSTALLED_MODULE_STEM"][0]) 392*333d2b36SAndroid Build Coastguard Worker 393*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, message+" LOCAL_NOT_AVAILABLE_FOR_PLATFORM", 394*333d2b36SAndroid Build Coastguard Worker "false", entries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"][0]) 395*333d2b36SAndroid Build Coastguard Worker} 396*333d2b36SAndroid Build Coastguard Worker 397*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidMkEntriesForApex(t *testing.T) { 398*333d2b36SAndroid Build Coastguard Worker preparers := android.GroupFixturePreparers( 399*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDexpreopt, 400*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFakeApexMutator, 401*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetApexSystemServerJars("com.android.apex1:service-foo"), 402*333d2b36SAndroid Build Coastguard Worker ) 403*333d2b36SAndroid Build Coastguard Worker 404*333d2b36SAndroid Build Coastguard Worker // An APEX system server jar. 405*333d2b36SAndroid Build Coastguard Worker result := preparers.RunTestWithBp(t, ` 406*333d2b36SAndroid Build Coastguard Worker java_library { 407*333d2b36SAndroid Build Coastguard Worker name: "service-foo", 408*333d2b36SAndroid Build Coastguard Worker installable: true, 409*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 410*333d2b36SAndroid Build Coastguard Worker apex_available: ["com.android.apex1"], 411*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 412*333d2b36SAndroid Build Coastguard Worker }`) 413*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 414*333d2b36SAndroid Build Coastguard Worker module := ctx.ModuleForTests("service-foo", "android_common_apex1000") 415*333d2b36SAndroid Build Coastguard Worker 416*333d2b36SAndroid Build Coastguard Worker entriesList := android.AndroidMkEntriesForTest(t, ctx, module.Module()) 417*333d2b36SAndroid Build Coastguard Worker entriesList = filterDexpreoptEntriesList(entriesList) 418*333d2b36SAndroid Build Coastguard Worker 419*333d2b36SAndroid Build Coastguard Worker android.AssertIntEquals(t, "entries count", 2, len(entriesList)) 420*333d2b36SAndroid Build Coastguard Worker 421*333d2b36SAndroid Build Coastguard Worker verifyEntries(t, 422*333d2b36SAndroid Build Coastguard Worker "entriesList[0]", 423*333d2b36SAndroid Build Coastguard Worker "[email protected]@[email protected]@classes.odex", 424*333d2b36SAndroid Build Coastguard Worker "/dexpreopt/service-foo/oat/arm64/javalib.odex", 425*333d2b36SAndroid Build Coastguard Worker "/system/framework/oat/arm64", 426*333d2b36SAndroid Build Coastguard Worker "[email protected]@[email protected]@classes.odex", 427*333d2b36SAndroid Build Coastguard Worker entriesList[0]) 428*333d2b36SAndroid Build Coastguard Worker 429*333d2b36SAndroid Build Coastguard Worker verifyEntries(t, 430*333d2b36SAndroid Build Coastguard Worker "entriesList[1]", 431*333d2b36SAndroid Build Coastguard Worker "[email protected]@[email protected]@classes.vdex", 432*333d2b36SAndroid Build Coastguard Worker "/dexpreopt/service-foo/oat/arm64/javalib.vdex", 433*333d2b36SAndroid Build Coastguard Worker "/system/framework/oat/arm64", 434*333d2b36SAndroid Build Coastguard Worker "[email protected]@[email protected]@classes.vdex", 435*333d2b36SAndroid Build Coastguard Worker entriesList[1]) 436*333d2b36SAndroid Build Coastguard Worker 437*333d2b36SAndroid Build Coastguard Worker // Not an APEX system server jar. 438*333d2b36SAndroid Build Coastguard Worker result = preparers.RunTestWithBp(t, ` 439*333d2b36SAndroid Build Coastguard Worker java_library { 440*333d2b36SAndroid Build Coastguard Worker name: "foo", 441*333d2b36SAndroid Build Coastguard Worker installable: true, 442*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 443*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 444*333d2b36SAndroid Build Coastguard Worker }`) 445*333d2b36SAndroid Build Coastguard Worker ctx = result.TestContext 446*333d2b36SAndroid Build Coastguard Worker module = ctx.ModuleForTests("foo", "android_common") 447*333d2b36SAndroid Build Coastguard Worker 448*333d2b36SAndroid Build Coastguard Worker entriesList = android.AndroidMkEntriesForTest(t, ctx, module.Module()) 449*333d2b36SAndroid Build Coastguard Worker entriesList = filterDexpreoptEntriesList(entriesList) 450*333d2b36SAndroid Build Coastguard Worker 451*333d2b36SAndroid Build Coastguard Worker android.AssertIntEquals(t, "entries count", 0, len(entriesList)) 452*333d2b36SAndroid Build Coastguard Worker} 453*333d2b36SAndroid Build Coastguard Worker 454*333d2b36SAndroid Build Coastguard Workerfunc TestGenerateProfileEvenIfDexpreoptIsDisabled(t *testing.T) { 455*333d2b36SAndroid Build Coastguard Worker preparers := android.GroupFixturePreparers( 456*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 457*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFakeApexMutator, 458*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureDisableDexpreopt(true), 459*333d2b36SAndroid Build Coastguard Worker ) 460*333d2b36SAndroid Build Coastguard Worker 461*333d2b36SAndroid Build Coastguard Worker result := preparers.RunTestWithBp(t, ` 462*333d2b36SAndroid Build Coastguard Worker java_library { 463*333d2b36SAndroid Build Coastguard Worker name: "foo", 464*333d2b36SAndroid Build Coastguard Worker installable: true, 465*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 466*333d2b36SAndroid Build Coastguard Worker profile: "art-profile", 467*333d2b36SAndroid Build Coastguard Worker }, 468*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 469*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 470*333d2b36SAndroid Build Coastguard Worker }`) 471*333d2b36SAndroid Build Coastguard Worker 472*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 473*333d2b36SAndroid Build Coastguard Worker dexpreopt := ctx.ModuleForTests("foo", "android_common").MaybeRule("dexpreopt") 474*333d2b36SAndroid Build Coastguard Worker 475*333d2b36SAndroid Build Coastguard Worker expected := []string{"out/soong/.intermediates/foo/android_common/dexpreopt/foo/profile.prof"} 476*333d2b36SAndroid Build Coastguard Worker 477*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "outputs", expected, dexpreopt.AllOutputs()) 478*333d2b36SAndroid Build Coastguard Worker} 479