1*333d2b36SAndroid Build Coastguard Worker// Copyright 2022 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 "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc TestR8(t *testing.T) { 27*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, ` 28*333d2b36SAndroid Build Coastguard Worker android_app { 29*333d2b36SAndroid Build Coastguard Worker name: "app", 30*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 31*333d2b36SAndroid Build Coastguard Worker libs: ["lib"], 32*333d2b36SAndroid Build Coastguard Worker static_libs: ["static_lib"], 33*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 34*333d2b36SAndroid Build Coastguard Worker } 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker android_app { 37*333d2b36SAndroid Build Coastguard Worker name: "stable_app", 38*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 39*333d2b36SAndroid Build Coastguard Worker sdk_version: "current", 40*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 41*333d2b36SAndroid Build Coastguard Worker } 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker android_app { 44*333d2b36SAndroid Build Coastguard Worker name: "core_platform_app", 45*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 46*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_platform", 47*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "31", 48*333d2b36SAndroid Build Coastguard Worker } 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker java_library { 51*333d2b36SAndroid Build Coastguard Worker name: "lib", 52*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 53*333d2b36SAndroid Build Coastguard Worker } 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Worker java_library { 56*333d2b36SAndroid Build Coastguard Worker name: "static_lib", 57*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 58*333d2b36SAndroid Build Coastguard Worker } 59*333d2b36SAndroid Build Coastguard Worker `) 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Worker app := result.ModuleForTests("app", "android_common") 62*333d2b36SAndroid Build Coastguard Worker stableApp := result.ModuleForTests("stable_app", "android_common") 63*333d2b36SAndroid Build Coastguard Worker corePlatformApp := result.ModuleForTests("core_platform_app", "android_common") 64*333d2b36SAndroid Build Coastguard Worker lib := result.ModuleForTests("lib", "android_common") 65*333d2b36SAndroid Build Coastguard Worker staticLib := result.ModuleForTests("static_lib", "android_common") 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker appJavac := app.Rule("javac") 68*333d2b36SAndroid Build Coastguard Worker appR8 := app.Rule("r8") 69*333d2b36SAndroid Build Coastguard Worker stableAppR8 := stableApp.Rule("r8") 70*333d2b36SAndroid Build Coastguard Worker corePlatformAppR8 := corePlatformApp.Rule("r8") 71*333d2b36SAndroid Build Coastguard Worker libHeader := lib.Output("turbine-combined/lib.jar").Output 72*333d2b36SAndroid Build Coastguard Worker staticLibHeader := staticLib.Output("turbine-combined/static_lib.jar").Output 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected lib header jar in app javac classpath", 75*333d2b36SAndroid Build Coastguard Worker appJavac.Args["classpath"], libHeader.String()) 76*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected static_lib header jar in app javac classpath", 77*333d2b36SAndroid Build Coastguard Worker appJavac.Args["classpath"], staticLibHeader.String()) 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected lib header jar in app r8 classpath", 80*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], libHeader.String()) 81*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no static_lib header jar in app r8 classpath", 82*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], staticLibHeader.String()) 83*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected -ignorewarnings in app r8 flags", 84*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "-ignorewarnings") 85*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected --android-platform-build in app r8 flags", 86*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "--android-platform-build") 87*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no --android-platform-build in stable_app r8 flags", 88*333d2b36SAndroid Build Coastguard Worker stableAppR8.Args["r8Flags"], "--android-platform-build") 89*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected --android-platform-build in core_platform_app r8 flags", 90*333d2b36SAndroid Build Coastguard Worker corePlatformAppR8.Args["r8Flags"], "--android-platform-build") 91*333d2b36SAndroid Build Coastguard Worker} 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Workerfunc TestR8TransitiveDeps(t *testing.T) { 94*333d2b36SAndroid Build Coastguard Worker bp := ` 95*333d2b36SAndroid Build Coastguard Worker override_android_app { 96*333d2b36SAndroid Build Coastguard Worker name: "override_app", 97*333d2b36SAndroid Build Coastguard Worker base: "app", 98*333d2b36SAndroid Build Coastguard Worker } 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Worker android_app { 101*333d2b36SAndroid Build Coastguard Worker name: "app", 102*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 103*333d2b36SAndroid Build Coastguard Worker libs: [ 104*333d2b36SAndroid Build Coastguard Worker "lib", 105*333d2b36SAndroid Build Coastguard Worker "uses_libs_dep_import", 106*333d2b36SAndroid Build Coastguard Worker ], 107*333d2b36SAndroid Build Coastguard Worker static_libs: [ 108*333d2b36SAndroid Build Coastguard Worker "static_lib", 109*333d2b36SAndroid Build Coastguard Worker "repeated_dep", 110*333d2b36SAndroid Build Coastguard Worker ], 111*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 112*333d2b36SAndroid Build Coastguard Worker } 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Worker java_library { 115*333d2b36SAndroid Build Coastguard Worker name: "static_lib", 116*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker java_library { 120*333d2b36SAndroid Build Coastguard Worker name: "lib", 121*333d2b36SAndroid Build Coastguard Worker libs: [ 122*333d2b36SAndroid Build Coastguard Worker "transitive_lib", 123*333d2b36SAndroid Build Coastguard Worker "repeated_dep", 124*333d2b36SAndroid Build Coastguard Worker "prebuilt_lib", 125*333d2b36SAndroid Build Coastguard Worker ], 126*333d2b36SAndroid Build Coastguard Worker static_libs: ["transitive_static_lib"], 127*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 128*333d2b36SAndroid Build Coastguard Worker } 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker java_library { 131*333d2b36SAndroid Build Coastguard Worker name: "repeated_dep", 132*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 133*333d2b36SAndroid Build Coastguard Worker } 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker java_library { 136*333d2b36SAndroid Build Coastguard Worker name: "transitive_static_lib", 137*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 138*333d2b36SAndroid Build Coastguard Worker } 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker java_library { 141*333d2b36SAndroid Build Coastguard Worker name: "transitive_lib", 142*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 143*333d2b36SAndroid Build Coastguard Worker libs: ["transitive_lib_2"], 144*333d2b36SAndroid Build Coastguard Worker } 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Worker java_library { 147*333d2b36SAndroid Build Coastguard Worker name: "transitive_lib_2", 148*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker java_import { 152*333d2b36SAndroid Build Coastguard Worker name: "lib", 153*333d2b36SAndroid Build Coastguard Worker jars: ["lib.jar"], 154*333d2b36SAndroid Build Coastguard Worker } 155*333d2b36SAndroid Build Coastguard Worker 156*333d2b36SAndroid Build Coastguard Worker java_library { 157*333d2b36SAndroid Build Coastguard Worker name: "uses_lib", 158*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 159*333d2b36SAndroid Build Coastguard Worker } 160*333d2b36SAndroid Build Coastguard Worker 161*333d2b36SAndroid Build Coastguard Worker java_library { 162*333d2b36SAndroid Build Coastguard Worker name: "optional_uses_lib", 163*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 164*333d2b36SAndroid Build Coastguard Worker } 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Worker android_library { 167*333d2b36SAndroid Build Coastguard Worker name: "uses_libs_dep", 168*333d2b36SAndroid Build Coastguard Worker uses_libs: ["uses_lib"], 169*333d2b36SAndroid Build Coastguard Worker optional_uses_libs: ["optional_uses_lib"], 170*333d2b36SAndroid Build Coastguard Worker } 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Worker android_library_import { 173*333d2b36SAndroid Build Coastguard Worker name: "uses_libs_dep_import", 174*333d2b36SAndroid Build Coastguard Worker aars: ["aar.aar"], 175*333d2b36SAndroid Build Coastguard Worker static_libs: ["uses_libs_dep"], 176*333d2b36SAndroid Build Coastguard Worker } 177*333d2b36SAndroid Build Coastguard Worker ` 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 180*333d2b36SAndroid Build Coastguard Worker name string 181*333d2b36SAndroid Build Coastguard Worker unbundled bool 182*333d2b36SAndroid Build Coastguard Worker }{ 183*333d2b36SAndroid Build Coastguard Worker { 184*333d2b36SAndroid Build Coastguard Worker name: "non-unbundled build", 185*333d2b36SAndroid Build Coastguard Worker unbundled: false, 186*333d2b36SAndroid Build Coastguard Worker }, 187*333d2b36SAndroid Build Coastguard Worker { 188*333d2b36SAndroid Build Coastguard Worker name: "unbundled build", 189*333d2b36SAndroid Build Coastguard Worker unbundled: true, 190*333d2b36SAndroid Build Coastguard Worker }, 191*333d2b36SAndroid Build Coastguard Worker } 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Worker for _, tc := range testcases { 194*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 195*333d2b36SAndroid Build Coastguard Worker fixturePreparer := PrepareForTestWithJavaDefaultModules 196*333d2b36SAndroid Build Coastguard Worker if tc.unbundled { 197*333d2b36SAndroid Build Coastguard Worker fixturePreparer = android.GroupFixturePreparers( 198*333d2b36SAndroid Build Coastguard Worker fixturePreparer, 199*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables( 200*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 201*333d2b36SAndroid Build Coastguard Worker variables.Unbundled_build = proptools.BoolPtr(true) 202*333d2b36SAndroid Build Coastguard Worker }, 203*333d2b36SAndroid Build Coastguard Worker ), 204*333d2b36SAndroid Build Coastguard Worker ) 205*333d2b36SAndroid Build Coastguard Worker } 206*333d2b36SAndroid Build Coastguard Worker result := fixturePreparer.RunTestWithBp(t, bp) 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker getHeaderJar := func(name string) android.Path { 209*333d2b36SAndroid Build Coastguard Worker mod := result.ModuleForTests(name, "android_common") 210*333d2b36SAndroid Build Coastguard Worker return mod.Output("turbine-combined/" + name + ".jar").Output 211*333d2b36SAndroid Build Coastguard Worker } 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Worker appR8 := result.ModuleForTests("app", "android_common").Rule("r8") 214*333d2b36SAndroid Build Coastguard Worker overrideAppR8 := result.ModuleForTests("app", "android_common_override_app").Rule("r8") 215*333d2b36SAndroid Build Coastguard Worker appHeader := getHeaderJar("app") 216*333d2b36SAndroid Build Coastguard Worker overrideAppHeader := result.ModuleForTests("app", "android_common_override_app").Output("turbine-combined/app.jar").Output 217*333d2b36SAndroid Build Coastguard Worker libHeader := getHeaderJar("lib") 218*333d2b36SAndroid Build Coastguard Worker transitiveLibHeader := getHeaderJar("transitive_lib") 219*333d2b36SAndroid Build Coastguard Worker transitiveLib2Header := getHeaderJar("transitive_lib_2") 220*333d2b36SAndroid Build Coastguard Worker staticLibHeader := getHeaderJar("static_lib") 221*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibHeader := getHeaderJar("transitive_static_lib") 222*333d2b36SAndroid Build Coastguard Worker repeatedDepHeader := getHeaderJar("repeated_dep") 223*333d2b36SAndroid Build Coastguard Worker usesLibHeader := getHeaderJar("uses_lib") 224*333d2b36SAndroid Build Coastguard Worker optionalUsesLibHeader := getHeaderJar("optional_uses_lib") 225*333d2b36SAndroid Build Coastguard Worker prebuiltLibHeader := result.ModuleForTests("prebuilt_lib", "android_common").Output("combined/lib.jar").Output 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker for _, rule := range []android.TestingBuildParams{appR8, overrideAppR8} { 228*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no app header jar in app r8 classpath", 229*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], appHeader.String()) 230*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no override_app header jar in app r8 classpath", 231*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], overrideAppHeader.String()) 232*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected transitive lib header jar in app r8 classpath", 233*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], transitiveLibHeader.String()) 234*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected transitive lib ^2 header jar in app r8 classpath", 235*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], transitiveLib2Header.String()) 236*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected lib header jar in app r8 classpath", 237*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], libHeader.String()) 238*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected uses_lib header jar in app r8 classpath", 239*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], usesLibHeader.String()) 240*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected optional_uses_lib header jar in app r8 classpath", 241*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], optionalUsesLibHeader.String()) 242*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no static_lib header jar in app r8 classpath", 243*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], staticLibHeader.String()) 244*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no transitive static_lib header jar in app r8 classpath", 245*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], transitiveStaticLibHeader.String()) 246*333d2b36SAndroid Build Coastguard Worker // we shouldn't list this dep because it is already included as static_libs in the app 247*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no repeated_dep header jar in app r8 classpath", 248*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], repeatedDepHeader.String()) 249*333d2b36SAndroid Build Coastguard Worker // skip a prebuilt transitive dep if the source is also a transitive dep 250*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no prebuilt header jar in app r8 classpath", 251*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], prebuiltLibHeader.String()) 252*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected -ignorewarnings in app r8 flags", 253*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], "-ignorewarnings") 254*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected --android-platform-build in app r8 flags", 255*333d2b36SAndroid Build Coastguard Worker rule.Args["r8Flags"], "--android-platform-build") 256*333d2b36SAndroid Build Coastguard Worker } 257*333d2b36SAndroid Build Coastguard Worker }) 258*333d2b36SAndroid Build Coastguard Worker } 259*333d2b36SAndroid Build Coastguard Worker} 260*333d2b36SAndroid Build Coastguard Worker 261*333d2b36SAndroid Build Coastguard Workerfunc TestR8Flags(t *testing.T) { 262*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, ` 263*333d2b36SAndroid Build Coastguard Worker android_app { 264*333d2b36SAndroid Build Coastguard Worker name: "app", 265*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 266*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 267*333d2b36SAndroid Build Coastguard Worker optimize: { 268*333d2b36SAndroid Build Coastguard Worker shrink: false, 269*333d2b36SAndroid Build Coastguard Worker optimize: false, 270*333d2b36SAndroid Build Coastguard Worker obfuscate: false, 271*333d2b36SAndroid Build Coastguard Worker ignore_warnings: false, 272*333d2b36SAndroid Build Coastguard Worker }, 273*333d2b36SAndroid Build Coastguard Worker } 274*333d2b36SAndroid Build Coastguard Worker `) 275*333d2b36SAndroid Build Coastguard Worker 276*333d2b36SAndroid Build Coastguard Worker app := result.ModuleForTests("app", "android_common") 277*333d2b36SAndroid Build Coastguard Worker appR8 := app.Rule("r8") 278*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected -dontshrink in app r8 flags", 279*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "-dontshrink") 280*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected -dontoptimize in app r8 flags", 281*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "-dontoptimize") 282*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected -dontobfuscate in app r8 flags", 283*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "-dontobfuscate") 284*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no -ignorewarnings in app r8 flags", 285*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "-ignorewarnings") 286*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected --android-platform-build in app r8 flags", 287*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "--android-platform-build") 288*333d2b36SAndroid Build Coastguard Worker} 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Workerfunc TestD8(t *testing.T) { 291*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, ` 292*333d2b36SAndroid Build Coastguard Worker java_library { 293*333d2b36SAndroid Build Coastguard Worker name: "foo", 294*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 295*333d2b36SAndroid Build Coastguard Worker libs: ["lib"], 296*333d2b36SAndroid Build Coastguard Worker static_libs: ["static_lib"], 297*333d2b36SAndroid Build Coastguard Worker installable: true, 298*333d2b36SAndroid Build Coastguard Worker } 299*333d2b36SAndroid Build Coastguard Worker 300*333d2b36SAndroid Build Coastguard Worker java_library { 301*333d2b36SAndroid Build Coastguard Worker name: "lib", 302*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 303*333d2b36SAndroid Build Coastguard Worker } 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker java_library { 306*333d2b36SAndroid Build Coastguard Worker name: "static_lib", 307*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 308*333d2b36SAndroid Build Coastguard Worker } 309*333d2b36SAndroid Build Coastguard Worker `) 310*333d2b36SAndroid Build Coastguard Worker 311*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 312*333d2b36SAndroid Build Coastguard Worker lib := result.ModuleForTests("lib", "android_common") 313*333d2b36SAndroid Build Coastguard Worker staticLib := result.ModuleForTests("static_lib", "android_common") 314*333d2b36SAndroid Build Coastguard Worker 315*333d2b36SAndroid Build Coastguard Worker fooJavac := foo.Rule("javac") 316*333d2b36SAndroid Build Coastguard Worker fooD8 := foo.Rule("d8") 317*333d2b36SAndroid Build Coastguard Worker libHeader := lib.Output("turbine-combined/lib.jar").Output 318*333d2b36SAndroid Build Coastguard Worker staticLibHeader := staticLib.Output("turbine-combined/static_lib.jar").Output 319*333d2b36SAndroid Build Coastguard Worker 320*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected lib header jar in foo javac classpath", 321*333d2b36SAndroid Build Coastguard Worker fooJavac.Args["classpath"], libHeader.String()) 322*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected static_lib header jar in foo javac classpath", 323*333d2b36SAndroid Build Coastguard Worker fooJavac.Args["classpath"], staticLibHeader.String()) 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected lib header jar in foo d8 classpath", 326*333d2b36SAndroid Build Coastguard Worker fooD8.Args["d8Flags"], libHeader.String()) 327*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "expected no static_lib header jar in foo javac classpath", 328*333d2b36SAndroid Build Coastguard Worker fooD8.Args["d8Flags"], staticLibHeader.String()) 329*333d2b36SAndroid Build Coastguard Worker} 330*333d2b36SAndroid Build Coastguard Worker 331*333d2b36SAndroid Build Coastguard Workerfunc TestProguardFlagsInheritanceStatic(t *testing.T) { 332*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, ` 333*333d2b36SAndroid Build Coastguard Worker android_app { 334*333d2b36SAndroid Build Coastguard Worker name: "app", 335*333d2b36SAndroid Build Coastguard Worker static_libs: [ 336*333d2b36SAndroid Build Coastguard Worker "primary_android_lib", 337*333d2b36SAndroid Build Coastguard Worker "primary_lib", 338*333d2b36SAndroid Build Coastguard Worker ], 339*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 340*333d2b36SAndroid Build Coastguard Worker } 341*333d2b36SAndroid Build Coastguard Worker 342*333d2b36SAndroid Build Coastguard Worker java_library { 343*333d2b36SAndroid Build Coastguard Worker name: "primary_lib", 344*333d2b36SAndroid Build Coastguard Worker optimize: { 345*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["primary.flags"], 346*333d2b36SAndroid Build Coastguard Worker }, 347*333d2b36SAndroid Build Coastguard Worker } 348*333d2b36SAndroid Build Coastguard Worker 349*333d2b36SAndroid Build Coastguard Worker android_library { 350*333d2b36SAndroid Build Coastguard Worker name: "primary_android_lib", 351*333d2b36SAndroid Build Coastguard Worker static_libs: ["secondary_lib"], 352*333d2b36SAndroid Build Coastguard Worker optimize: { 353*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["primary_android.flags"], 354*333d2b36SAndroid Build Coastguard Worker }, 355*333d2b36SAndroid Build Coastguard Worker } 356*333d2b36SAndroid Build Coastguard Worker 357*333d2b36SAndroid Build Coastguard Worker java_library { 358*333d2b36SAndroid Build Coastguard Worker name: "secondary_lib", 359*333d2b36SAndroid Build Coastguard Worker static_libs: ["tertiary_lib"], 360*333d2b36SAndroid Build Coastguard Worker optimize: { 361*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["secondary.flags"], 362*333d2b36SAndroid Build Coastguard Worker }, 363*333d2b36SAndroid Build Coastguard Worker } 364*333d2b36SAndroid Build Coastguard Worker 365*333d2b36SAndroid Build Coastguard Worker java_library { 366*333d2b36SAndroid Build Coastguard Worker name: "tertiary_lib", 367*333d2b36SAndroid Build Coastguard Worker optimize: { 368*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["tertiary.flags"], 369*333d2b36SAndroid Build Coastguard Worker }, 370*333d2b36SAndroid Build Coastguard Worker } 371*333d2b36SAndroid Build Coastguard Worker `) 372*333d2b36SAndroid Build Coastguard Worker 373*333d2b36SAndroid Build Coastguard Worker app := result.ModuleForTests("app", "android_common") 374*333d2b36SAndroid Build Coastguard Worker appR8 := app.Rule("r8") 375*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected primary_lib's proguard flags from direct dep", 376*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "primary.flags") 377*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected primary_android_lib's proguard flags from direct dep", 378*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "primary_android.flags") 379*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected secondary_lib's proguard flags from inherited dep", 380*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "secondary.flags") 381*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected tertiary_lib's proguard flags from inherited dep", 382*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "tertiary.flags") 383*333d2b36SAndroid Build Coastguard Worker} 384*333d2b36SAndroid Build Coastguard Worker 385*333d2b36SAndroid Build Coastguard Workerfunc TestProguardFlagsInheritance(t *testing.T) { 386*333d2b36SAndroid Build Coastguard Worker directDepFlagsFileName := "direct_dep.flags" 387*333d2b36SAndroid Build Coastguard Worker transitiveDepFlagsFileName := "transitive_dep.flags" 388*333d2b36SAndroid Build Coastguard Worker 389*333d2b36SAndroid Build Coastguard Worker topLevelModules := []struct { 390*333d2b36SAndroid Build Coastguard Worker name string 391*333d2b36SAndroid Build Coastguard Worker definition string 392*333d2b36SAndroid Build Coastguard Worker }{ 393*333d2b36SAndroid Build Coastguard Worker { 394*333d2b36SAndroid Build Coastguard Worker name: "android_app", 395*333d2b36SAndroid Build Coastguard Worker definition: ` 396*333d2b36SAndroid Build Coastguard Worker android_app { 397*333d2b36SAndroid Build Coastguard Worker name: "app", 398*333d2b36SAndroid Build Coastguard Worker static_libs: ["androidlib"], // this must be static_libs to initate dexing 399*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 400*333d2b36SAndroid Build Coastguard Worker } 401*333d2b36SAndroid Build Coastguard Worker `, 402*333d2b36SAndroid Build Coastguard Worker }, 403*333d2b36SAndroid Build Coastguard Worker { 404*333d2b36SAndroid Build Coastguard Worker name: "android_library", 405*333d2b36SAndroid Build Coastguard Worker definition: ` 406*333d2b36SAndroid Build Coastguard Worker android_library { 407*333d2b36SAndroid Build Coastguard Worker name: "app", 408*333d2b36SAndroid Build Coastguard Worker static_libs: ["androidlib"], // this must be static_libs to initate dexing 409*333d2b36SAndroid Build Coastguard Worker installable: true, 410*333d2b36SAndroid Build Coastguard Worker optimize: { 411*333d2b36SAndroid Build Coastguard Worker enabled: true, 412*333d2b36SAndroid Build Coastguard Worker shrink: true, 413*333d2b36SAndroid Build Coastguard Worker }, 414*333d2b36SAndroid Build Coastguard Worker } 415*333d2b36SAndroid Build Coastguard Worker `, 416*333d2b36SAndroid Build Coastguard Worker }, 417*333d2b36SAndroid Build Coastguard Worker { 418*333d2b36SAndroid Build Coastguard Worker name: "java_library", 419*333d2b36SAndroid Build Coastguard Worker definition: ` 420*333d2b36SAndroid Build Coastguard Worker java_library { 421*333d2b36SAndroid Build Coastguard Worker name: "app", 422*333d2b36SAndroid Build Coastguard Worker static_libs: ["androidlib"], // this must be static_libs to initate dexing 423*333d2b36SAndroid Build Coastguard Worker srcs: ["Foo.java"], 424*333d2b36SAndroid Build Coastguard Worker installable: true, 425*333d2b36SAndroid Build Coastguard Worker optimize: { 426*333d2b36SAndroid Build Coastguard Worker enabled: true, 427*333d2b36SAndroid Build Coastguard Worker shrink: true, 428*333d2b36SAndroid Build Coastguard Worker }, 429*333d2b36SAndroid Build Coastguard Worker } 430*333d2b36SAndroid Build Coastguard Worker `, 431*333d2b36SAndroid Build Coastguard Worker }, 432*333d2b36SAndroid Build Coastguard Worker } 433*333d2b36SAndroid Build Coastguard Worker 434*333d2b36SAndroid Build Coastguard Worker bp := ` 435*333d2b36SAndroid Build Coastguard Worker android_library { 436*333d2b36SAndroid Build Coastguard Worker name: "androidlib", 437*333d2b36SAndroid Build Coastguard Worker static_libs: ["app_dep"], 438*333d2b36SAndroid Build Coastguard Worker } 439*333d2b36SAndroid Build Coastguard Worker 440*333d2b36SAndroid Build Coastguard Worker java_library { 441*333d2b36SAndroid Build Coastguard Worker name: "app_dep", 442*333d2b36SAndroid Build Coastguard Worker %s: ["dep"], 443*333d2b36SAndroid Build Coastguard Worker } 444*333d2b36SAndroid Build Coastguard Worker 445*333d2b36SAndroid Build Coastguard Worker java_library { 446*333d2b36SAndroid Build Coastguard Worker name: "dep", 447*333d2b36SAndroid Build Coastguard Worker %s: ["transitive_dep"], 448*333d2b36SAndroid Build Coastguard Worker optimize: { 449*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["direct_dep.flags"], 450*333d2b36SAndroid Build Coastguard Worker export_proguard_flags_files: %v, 451*333d2b36SAndroid Build Coastguard Worker }, 452*333d2b36SAndroid Build Coastguard Worker } 453*333d2b36SAndroid Build Coastguard Worker 454*333d2b36SAndroid Build Coastguard Worker java_library { 455*333d2b36SAndroid Build Coastguard Worker name: "transitive_dep", 456*333d2b36SAndroid Build Coastguard Worker optimize: { 457*333d2b36SAndroid Build Coastguard Worker proguard_flags_files: ["transitive_dep.flags"], 458*333d2b36SAndroid Build Coastguard Worker export_proguard_flags_files: %v, 459*333d2b36SAndroid Build Coastguard Worker }, 460*333d2b36SAndroid Build Coastguard Worker } 461*333d2b36SAndroid Build Coastguard Worker ` 462*333d2b36SAndroid Build Coastguard Worker 463*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 464*333d2b36SAndroid Build Coastguard Worker name string 465*333d2b36SAndroid Build Coastguard Worker depType string 466*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles bool 467*333d2b36SAndroid Build Coastguard Worker transitiveDepType string 468*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles bool 469*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles []string 470*333d2b36SAndroid Build Coastguard Worker }{ 471*333d2b36SAndroid Build Coastguard Worker { 472*333d2b36SAndroid Build Coastguard Worker name: "libs_export_libs_export", 473*333d2b36SAndroid Build Coastguard Worker depType: "libs", 474*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: true, 475*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "libs", 476*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: true, 477*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 478*333d2b36SAndroid Build Coastguard Worker }, 479*333d2b36SAndroid Build Coastguard Worker { 480*333d2b36SAndroid Build Coastguard Worker name: "static_export_libs_export", 481*333d2b36SAndroid Build Coastguard Worker depType: "static_libs", 482*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: true, 483*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "libs", 484*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: true, 485*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 486*333d2b36SAndroid Build Coastguard Worker }, 487*333d2b36SAndroid Build Coastguard Worker { 488*333d2b36SAndroid Build Coastguard Worker name: "libs_no-export_static_export", 489*333d2b36SAndroid Build Coastguard Worker depType: "libs", 490*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: false, 491*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "static_libs", 492*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: true, 493*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{transitiveDepFlagsFileName}, 494*333d2b36SAndroid Build Coastguard Worker }, 495*333d2b36SAndroid Build Coastguard Worker { 496*333d2b36SAndroid Build Coastguard Worker name: "static_no-export_static_export", 497*333d2b36SAndroid Build Coastguard Worker depType: "static_libs", 498*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: false, 499*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "static_libs", 500*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: true, 501*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 502*333d2b36SAndroid Build Coastguard Worker }, 503*333d2b36SAndroid Build Coastguard Worker { 504*333d2b36SAndroid Build Coastguard Worker name: "libs_export_libs_no-export", 505*333d2b36SAndroid Build Coastguard Worker depType: "libs", 506*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: true, 507*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "libs", 508*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: false, 509*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName}, 510*333d2b36SAndroid Build Coastguard Worker }, 511*333d2b36SAndroid Build Coastguard Worker { 512*333d2b36SAndroid Build Coastguard Worker name: "static_export_libs_no-export", 513*333d2b36SAndroid Build Coastguard Worker depType: "static_libs", 514*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: true, 515*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "libs", 516*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: false, 517*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName}, 518*333d2b36SAndroid Build Coastguard Worker }, 519*333d2b36SAndroid Build Coastguard Worker { 520*333d2b36SAndroid Build Coastguard Worker name: "libs_no-export_static_no-export", 521*333d2b36SAndroid Build Coastguard Worker depType: "libs", 522*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: false, 523*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "static_libs", 524*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: false, 525*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{}, 526*333d2b36SAndroid Build Coastguard Worker }, 527*333d2b36SAndroid Build Coastguard Worker { 528*333d2b36SAndroid Build Coastguard Worker name: "static_no-export_static_no-export", 529*333d2b36SAndroid Build Coastguard Worker depType: "static_libs", 530*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: false, 531*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "static_libs", 532*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: false, 533*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 534*333d2b36SAndroid Build Coastguard Worker }, 535*333d2b36SAndroid Build Coastguard Worker { 536*333d2b36SAndroid Build Coastguard Worker name: "libs_no-export_libs_export", 537*333d2b36SAndroid Build Coastguard Worker depType: "libs", 538*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: false, 539*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "libs", 540*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: true, 541*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{transitiveDepFlagsFileName}, 542*333d2b36SAndroid Build Coastguard Worker }, 543*333d2b36SAndroid Build Coastguard Worker { 544*333d2b36SAndroid Build Coastguard Worker name: "static_no-export_libs_export", 545*333d2b36SAndroid Build Coastguard Worker depType: "static_libs", 546*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: false, 547*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "libs", 548*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: true, 549*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 550*333d2b36SAndroid Build Coastguard Worker }, 551*333d2b36SAndroid Build Coastguard Worker { 552*333d2b36SAndroid Build Coastguard Worker name: "libs_export_static_export", 553*333d2b36SAndroid Build Coastguard Worker depType: "libs", 554*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: true, 555*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "static_libs", 556*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: true, 557*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 558*333d2b36SAndroid Build Coastguard Worker }, 559*333d2b36SAndroid Build Coastguard Worker { 560*333d2b36SAndroid Build Coastguard Worker name: "static_export_static_export", 561*333d2b36SAndroid Build Coastguard Worker depType: "static_libs", 562*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: true, 563*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "static_libs", 564*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: true, 565*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 566*333d2b36SAndroid Build Coastguard Worker }, 567*333d2b36SAndroid Build Coastguard Worker { 568*333d2b36SAndroid Build Coastguard Worker name: "libs_no-export_libs_no-export", 569*333d2b36SAndroid Build Coastguard Worker depType: "libs", 570*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: false, 571*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "libs", 572*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: false, 573*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{}, 574*333d2b36SAndroid Build Coastguard Worker }, 575*333d2b36SAndroid Build Coastguard Worker { 576*333d2b36SAndroid Build Coastguard Worker name: "static_no-export_libs_no-export", 577*333d2b36SAndroid Build Coastguard Worker depType: "static_libs", 578*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: false, 579*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "libs", 580*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: false, 581*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName}, 582*333d2b36SAndroid Build Coastguard Worker }, 583*333d2b36SAndroid Build Coastguard Worker { 584*333d2b36SAndroid Build Coastguard Worker name: "libs_export_static_no-export", 585*333d2b36SAndroid Build Coastguard Worker depType: "libs", 586*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: true, 587*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "static_libs", 588*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: false, 589*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 590*333d2b36SAndroid Build Coastguard Worker }, 591*333d2b36SAndroid Build Coastguard Worker { 592*333d2b36SAndroid Build Coastguard Worker name: "static_export_static_no-export", 593*333d2b36SAndroid Build Coastguard Worker depType: "static_libs", 594*333d2b36SAndroid Build Coastguard Worker depExportsFlagsFiles: true, 595*333d2b36SAndroid Build Coastguard Worker transitiveDepType: "static_libs", 596*333d2b36SAndroid Build Coastguard Worker transitiveDepExportsFlagsFiles: false, 597*333d2b36SAndroid Build Coastguard Worker expectedFlagsFiles: []string{directDepFlagsFileName, transitiveDepFlagsFileName}, 598*333d2b36SAndroid Build Coastguard Worker }, 599*333d2b36SAndroid Build Coastguard Worker } 600*333d2b36SAndroid Build Coastguard Worker 601*333d2b36SAndroid Build Coastguard Worker for _, topLevelModuleDef := range topLevelModules { 602*333d2b36SAndroid Build Coastguard Worker for _, tc := range testcases { 603*333d2b36SAndroid Build Coastguard Worker t.Run(topLevelModuleDef.name+"-"+tc.name, func(t *testing.T) { 604*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 605*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 606*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeMockFs(android.MockFS{ 607*333d2b36SAndroid Build Coastguard Worker directDepFlagsFileName: nil, 608*333d2b36SAndroid Build Coastguard Worker transitiveDepFlagsFileName: nil, 609*333d2b36SAndroid Build Coastguard Worker }), 610*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, 611*333d2b36SAndroid Build Coastguard Worker topLevelModuleDef.definition+ 612*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf( 613*333d2b36SAndroid Build Coastguard Worker bp, 614*333d2b36SAndroid Build Coastguard Worker tc.depType, 615*333d2b36SAndroid Build Coastguard Worker tc.transitiveDepType, 616*333d2b36SAndroid Build Coastguard Worker tc.depExportsFlagsFiles, 617*333d2b36SAndroid Build Coastguard Worker tc.transitiveDepExportsFlagsFiles, 618*333d2b36SAndroid Build Coastguard Worker ), 619*333d2b36SAndroid Build Coastguard Worker ) 620*333d2b36SAndroid Build Coastguard Worker appR8 := result.ModuleForTests("app", "android_common").Rule("r8") 621*333d2b36SAndroid Build Coastguard Worker 622*333d2b36SAndroid Build Coastguard Worker shouldHaveDepFlags := android.InList(directDepFlagsFileName, tc.expectedFlagsFiles) 623*333d2b36SAndroid Build Coastguard Worker if shouldHaveDepFlags { 624*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected deps's proguard flags", 625*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], directDepFlagsFileName) 626*333d2b36SAndroid Build Coastguard Worker } else { 627*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "app did not expect deps's proguard flags", 628*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], directDepFlagsFileName) 629*333d2b36SAndroid Build Coastguard Worker } 630*333d2b36SAndroid Build Coastguard Worker 631*333d2b36SAndroid Build Coastguard Worker shouldHaveTransitiveDepFlags := android.InList(transitiveDepFlagsFileName, tc.expectedFlagsFiles) 632*333d2b36SAndroid Build Coastguard Worker if shouldHaveTransitiveDepFlags { 633*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected transitive deps's proguard flags", 634*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], transitiveDepFlagsFileName) 635*333d2b36SAndroid Build Coastguard Worker } else { 636*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "app did not expect transitive deps's proguard flags", 637*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], transitiveDepFlagsFileName) 638*333d2b36SAndroid Build Coastguard Worker } 639*333d2b36SAndroid Build Coastguard Worker }) 640*333d2b36SAndroid Build Coastguard Worker } 641*333d2b36SAndroid Build Coastguard Worker } 642*333d2b36SAndroid Build Coastguard Worker} 643*333d2b36SAndroid Build Coastguard Worker 644*333d2b36SAndroid Build Coastguard Workerfunc TestProguardFlagsInheritanceAppImport(t *testing.T) { 645*333d2b36SAndroid Build Coastguard Worker bp := ` 646*333d2b36SAndroid Build Coastguard Worker android_app { 647*333d2b36SAndroid Build Coastguard Worker name: "app", 648*333d2b36SAndroid Build Coastguard Worker static_libs: ["aarimport"], // this must be static_libs to initate dexing 649*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 650*333d2b36SAndroid Build Coastguard Worker } 651*333d2b36SAndroid Build Coastguard Worker 652*333d2b36SAndroid Build Coastguard Worker android_library_import { 653*333d2b36SAndroid Build Coastguard Worker name: "aarimport", 654*333d2b36SAndroid Build Coastguard Worker aars: ["import.aar"], 655*333d2b36SAndroid Build Coastguard Worker } 656*333d2b36SAndroid Build Coastguard Worker ` 657*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 658*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 659*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, bp) 660*333d2b36SAndroid Build Coastguard Worker 661*333d2b36SAndroid Build Coastguard Worker appR8 := result.ModuleForTests("app", "android_common").Rule("r8") 662*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected aarimports's proguard flags", 663*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "proguard.txt") 664*333d2b36SAndroid Build Coastguard Worker} 665*333d2b36SAndroid Build Coastguard Worker 666*333d2b36SAndroid Build Coastguard Workerfunc TestR8FlagsArtProfile(t *testing.T) { 667*333d2b36SAndroid Build Coastguard Worker result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, ` 668*333d2b36SAndroid Build Coastguard Worker android_app { 669*333d2b36SAndroid Build Coastguard Worker name: "app", 670*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 671*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 672*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 673*333d2b36SAndroid Build Coastguard Worker profile_guided: true, 674*333d2b36SAndroid Build Coastguard Worker profile: "profile.txt.prof", 675*333d2b36SAndroid Build Coastguard Worker enable_profile_rewriting: true, 676*333d2b36SAndroid Build Coastguard Worker }, 677*333d2b36SAndroid Build Coastguard Worker } 678*333d2b36SAndroid Build Coastguard Worker `) 679*333d2b36SAndroid Build Coastguard Worker 680*333d2b36SAndroid Build Coastguard Worker app := result.ModuleForTests("app", "android_common") 681*333d2b36SAndroid Build Coastguard Worker appR8 := app.Rule("r8") 682*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected --art-profile in app r8 flags", 683*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], "--art-profile") 684*333d2b36SAndroid Build Coastguard Worker 685*333d2b36SAndroid Build Coastguard Worker appDexpreopt := app.Rule("dexpreopt") 686*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 687*333d2b36SAndroid Build Coastguard Worker "expected --art-profile output to be used to create .prof binary", 688*333d2b36SAndroid Build Coastguard Worker appDexpreopt.RuleParams.Command, 689*333d2b36SAndroid Build Coastguard Worker "--create-profile-from=out/soong/.intermediates/app/android_common/profile.prof.txt --output-profile-type=app", 690*333d2b36SAndroid Build Coastguard Worker ) 691*333d2b36SAndroid Build Coastguard Worker} 692*333d2b36SAndroid Build Coastguard Worker 693*333d2b36SAndroid Build Coastguard Worker// This test checks that users explicitly set `enable_profile_rewriting` to true when the following are true 694*333d2b36SAndroid Build Coastguard Worker// 1. optimize or obfuscate is enabled AND 695*333d2b36SAndroid Build Coastguard Worker// 2. dex_preopt.profile_guided is enabled 696*333d2b36SAndroid Build Coastguard Worker// 697*333d2b36SAndroid Build Coastguard Worker// The rewritten profile should be used since the dex signatures in the checked-in profile will not match the optimized binary. 698*333d2b36SAndroid Build Coastguard Workerfunc TestEnableProfileRewritingIsRequiredForOptimizedApps(t *testing.T) { 699*333d2b36SAndroid Build Coastguard Worker testJavaError(t, 700*333d2b36SAndroid Build Coastguard Worker "Enable_profile_rewriting must be true when profile_guided dexpreopt and R8 optimization/obfuscation is turned on", 701*333d2b36SAndroid Build Coastguard Worker ` 702*333d2b36SAndroid Build Coastguard Workerandroid_app { 703*333d2b36SAndroid Build Coastguard Worker name: "app", 704*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 705*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 706*333d2b36SAndroid Build Coastguard Worker dex_preopt: { 707*333d2b36SAndroid Build Coastguard Worker profile_guided: true, 708*333d2b36SAndroid Build Coastguard Worker profile: "profile.txt.prof", 709*333d2b36SAndroid Build Coastguard Worker // enable_profile_rewriting is not set, this is an error 710*333d2b36SAndroid Build Coastguard Worker }, 711*333d2b36SAndroid Build Coastguard Worker optimize: { 712*333d2b36SAndroid Build Coastguard Worker optimize: true, 713*333d2b36SAndroid Build Coastguard Worker } 714*333d2b36SAndroid Build Coastguard Worker}`) 715*333d2b36SAndroid Build Coastguard Worker} 716*333d2b36SAndroid Build Coastguard Worker 717*333d2b36SAndroid Build Coastguard Workerfunc TestDebugReleaseFlags(t *testing.T) { 718*333d2b36SAndroid Build Coastguard Worker bp := ` 719*333d2b36SAndroid Build Coastguard Worker android_app { 720*333d2b36SAndroid Build Coastguard Worker name: "app", 721*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 722*333d2b36SAndroid Build Coastguard Worker platform_apis: true, 723*333d2b36SAndroid Build Coastguard Worker dxflags: ["%s"] 724*333d2b36SAndroid Build Coastguard Worker } 725*333d2b36SAndroid Build Coastguard Worker ` 726*333d2b36SAndroid Build Coastguard Worker 727*333d2b36SAndroid Build Coastguard Worker testcases := []struct { 728*333d2b36SAndroid Build Coastguard Worker name string 729*333d2b36SAndroid Build Coastguard Worker envVar string 730*333d2b36SAndroid Build Coastguard Worker isEng bool 731*333d2b36SAndroid Build Coastguard Worker dxFlags string 732*333d2b36SAndroid Build Coastguard Worker expectedFlags string 733*333d2b36SAndroid Build Coastguard Worker }{ 734*333d2b36SAndroid Build Coastguard Worker { 735*333d2b36SAndroid Build Coastguard Worker name: "app_no_optimize_dx", 736*333d2b36SAndroid Build Coastguard Worker envVar: "NO_OPTIMIZE_DX", 737*333d2b36SAndroid Build Coastguard Worker expectedFlags: "--debug", 738*333d2b36SAndroid Build Coastguard Worker }, 739*333d2b36SAndroid Build Coastguard Worker { 740*333d2b36SAndroid Build Coastguard Worker name: "app_release_no_optimize_dx", 741*333d2b36SAndroid Build Coastguard Worker envVar: "NO_OPTIMIZE_DX", 742*333d2b36SAndroid Build Coastguard Worker dxFlags: "--release", 743*333d2b36SAndroid Build Coastguard Worker // Global env vars override explicit dxflags. 744*333d2b36SAndroid Build Coastguard Worker expectedFlags: "--debug", 745*333d2b36SAndroid Build Coastguard Worker }, 746*333d2b36SAndroid Build Coastguard Worker { 747*333d2b36SAndroid Build Coastguard Worker name: "app_generate_dex_debug", 748*333d2b36SAndroid Build Coastguard Worker envVar: "GENERATE_DEX_DEBUG", 749*333d2b36SAndroid Build Coastguard Worker expectedFlags: "--debug", 750*333d2b36SAndroid Build Coastguard Worker }, 751*333d2b36SAndroid Build Coastguard Worker { 752*333d2b36SAndroid Build Coastguard Worker name: "app_release_generate_dex_debug", 753*333d2b36SAndroid Build Coastguard Worker envVar: "GENERATE_DEX_DEBUG", 754*333d2b36SAndroid Build Coastguard Worker dxFlags: "--release", 755*333d2b36SAndroid Build Coastguard Worker // Global env vars override explicit dxflags. 756*333d2b36SAndroid Build Coastguard Worker expectedFlags: "--debug", 757*333d2b36SAndroid Build Coastguard Worker }, 758*333d2b36SAndroid Build Coastguard Worker { 759*333d2b36SAndroid Build Coastguard Worker name: "app_eng", 760*333d2b36SAndroid Build Coastguard Worker isEng: true, 761*333d2b36SAndroid Build Coastguard Worker expectedFlags: "--debug", 762*333d2b36SAndroid Build Coastguard Worker }, 763*333d2b36SAndroid Build Coastguard Worker { 764*333d2b36SAndroid Build Coastguard Worker name: "app_release_eng", 765*333d2b36SAndroid Build Coastguard Worker isEng: true, 766*333d2b36SAndroid Build Coastguard Worker dxFlags: "--release", 767*333d2b36SAndroid Build Coastguard Worker // Eng mode does *not* override explicit dxflags. 768*333d2b36SAndroid Build Coastguard Worker expectedFlags: "--release", 769*333d2b36SAndroid Build Coastguard Worker }, 770*333d2b36SAndroid Build Coastguard Worker } 771*333d2b36SAndroid Build Coastguard Worker 772*333d2b36SAndroid Build Coastguard Worker for _, tc := range testcases { 773*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 774*333d2b36SAndroid Build Coastguard Worker fixturePreparer := PrepareForTestWithJavaDefaultModules 775*333d2b36SAndroid Build Coastguard Worker fixturePreparer = android.GroupFixturePreparers( 776*333d2b36SAndroid Build Coastguard Worker fixturePreparer, 777*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables( 778*333d2b36SAndroid Build Coastguard Worker func(variables android.FixtureProductVariables) { 779*333d2b36SAndroid Build Coastguard Worker variables.Eng = proptools.BoolPtr(tc.isEng) 780*333d2b36SAndroid Build Coastguard Worker }, 781*333d2b36SAndroid Build Coastguard Worker ), 782*333d2b36SAndroid Build Coastguard Worker ) 783*333d2b36SAndroid Build Coastguard Worker if tc.envVar != "" { 784*333d2b36SAndroid Build Coastguard Worker fixturePreparer = android.GroupFixturePreparers( 785*333d2b36SAndroid Build Coastguard Worker fixturePreparer, 786*333d2b36SAndroid Build Coastguard Worker android.FixtureMergeEnv(map[string]string{ 787*333d2b36SAndroid Build Coastguard Worker tc.envVar: "true", 788*333d2b36SAndroid Build Coastguard Worker }), 789*333d2b36SAndroid Build Coastguard Worker ) 790*333d2b36SAndroid Build Coastguard Worker } 791*333d2b36SAndroid Build Coastguard Worker result := fixturePreparer.RunTestWithBp(t, fmt.Sprintf(bp, tc.dxFlags)) 792*333d2b36SAndroid Build Coastguard Worker 793*333d2b36SAndroid Build Coastguard Worker appR8 := result.ModuleForTests("app", "android_common").Rule("r8") 794*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "expected flag in R8 flags", 795*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], tc.expectedFlags) 796*333d2b36SAndroid Build Coastguard Worker 797*333d2b36SAndroid Build Coastguard Worker var unexpectedFlags string 798*333d2b36SAndroid Build Coastguard Worker if tc.expectedFlags == "--debug" { 799*333d2b36SAndroid Build Coastguard Worker unexpectedFlags = "--release" 800*333d2b36SAndroid Build Coastguard Worker } else if tc.expectedFlags == "--release" { 801*333d2b36SAndroid Build Coastguard Worker unexpectedFlags = "--debug" 802*333d2b36SAndroid Build Coastguard Worker } 803*333d2b36SAndroid Build Coastguard Worker if unexpectedFlags != "" { 804*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "unexpected flag in R8 flags", 805*333d2b36SAndroid Build Coastguard Worker appR8.Args["r8Flags"], unexpectedFlags) 806*333d2b36SAndroid Build Coastguard Worker } 807*333d2b36SAndroid Build Coastguard Worker }) 808*333d2b36SAndroid Build Coastguard Worker } 809*333d2b36SAndroid Build Coastguard Worker} 810