1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 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 "path/filepath" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker// TODO(b/177892522): Move these tests into a more appropriate place. 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workerfunc fixtureSetPrebuiltHiddenApiDirProductVariable(prebuiltHiddenApiDir *string) android.FixturePreparer { 30*333d2b36SAndroid Build Coastguard Worker return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 31*333d2b36SAndroid Build Coastguard Worker variables.PrebuiltHiddenApiDir = prebuiltHiddenApiDir 32*333d2b36SAndroid Build Coastguard Worker }) 33*333d2b36SAndroid Build Coastguard Worker} 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithDefaultPlatformBootclasspath = android.FixtureAddTextFile("frameworks/base/boot/Android.bp", ` 36*333d2b36SAndroid Build Coastguard Worker platform_bootclasspath { 37*333d2b36SAndroid Build Coastguard Worker name: "platform-bootclasspath", 38*333d2b36SAndroid Build Coastguard Worker } 39*333d2b36SAndroid Build Coastguard Worker`) 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workervar hiddenApiFixtureFactory = android.GroupFixturePreparers( 42*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 43*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithHiddenApiBuildComponents, 44*333d2b36SAndroid Build Coastguard Worker) 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingleton(t *testing.T) { 47*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 48*333d2b36SAndroid Build Coastguard Worker hiddenApiFixtureFactory, 49*333d2b36SAndroid Build Coastguard Worker FixtureConfigureBootJars("platform:foo"), 50*333d2b36SAndroid Build Coastguard Worker prepareForTestWithDefaultPlatformBootclasspath, 51*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 52*333d2b36SAndroid Build Coastguard Worker java_library { 53*333d2b36SAndroid Build Coastguard Worker name: "foo", 54*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 55*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 56*333d2b36SAndroid Build Coastguard Worker } 57*333d2b36SAndroid Build Coastguard Worker `) 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") 60*333d2b36SAndroid Build Coastguard Worker hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") 61*333d2b36SAndroid Build Coastguard Worker want := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar" 62*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, want) 63*333d2b36SAndroid Build Coastguard Worker} 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithSourceAndPrebuiltPreferredButNoDex(t *testing.T) { 66*333d2b36SAndroid Build Coastguard Worker expectedErrorMessage := "module prebuilt_foo{os:android,arch:common} does not provide a dex jar" 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 69*333d2b36SAndroid Build Coastguard Worker hiddenApiFixtureFactory, 70*333d2b36SAndroid Build Coastguard Worker FixtureConfigureBootJars("platform:foo"), 71*333d2b36SAndroid Build Coastguard Worker prepareForTestWithDefaultPlatformBootclasspath, 72*333d2b36SAndroid Build Coastguard Worker ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorMessage)). 73*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 74*333d2b36SAndroid Build Coastguard Worker java_library { 75*333d2b36SAndroid Build Coastguard Worker name: "foo", 76*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 77*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 78*333d2b36SAndroid Build Coastguard Worker } 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker java_import { 81*333d2b36SAndroid Build Coastguard Worker name: "foo", 82*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 83*333d2b36SAndroid Build Coastguard Worker prefer: true, 84*333d2b36SAndroid Build Coastguard Worker } 85*333d2b36SAndroid Build Coastguard Worker `) 86*333d2b36SAndroid Build Coastguard Worker} 87*333d2b36SAndroid Build Coastguard Worker 88*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithPrebuilt(t *testing.T) { 89*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 90*333d2b36SAndroid Build Coastguard Worker hiddenApiFixtureFactory, 91*333d2b36SAndroid Build Coastguard Worker FixtureConfigureBootJars("platform:foo"), 92*333d2b36SAndroid Build Coastguard Worker prepareForTestWithDefaultPlatformBootclasspath, 93*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 94*333d2b36SAndroid Build Coastguard Worker java_import { 95*333d2b36SAndroid Build Coastguard Worker name: "foo", 96*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 97*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 98*333d2b36SAndroid Build Coastguard Worker } 99*333d2b36SAndroid Build Coastguard Worker `) 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") 102*333d2b36SAndroid Build Coastguard Worker hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") 103*333d2b36SAndroid Build Coastguard Worker want := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar" 104*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, want) 105*333d2b36SAndroid Build Coastguard Worker} 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithPrebuiltUseSource(t *testing.T) { 108*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 109*333d2b36SAndroid Build Coastguard Worker hiddenApiFixtureFactory, 110*333d2b36SAndroid Build Coastguard Worker FixtureConfigureBootJars("platform:foo"), 111*333d2b36SAndroid Build Coastguard Worker prepareForTestWithDefaultPlatformBootclasspath, 112*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 113*333d2b36SAndroid Build Coastguard Worker java_library { 114*333d2b36SAndroid Build Coastguard Worker name: "foo", 115*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 116*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker java_import { 120*333d2b36SAndroid Build Coastguard Worker name: "foo", 121*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 122*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 123*333d2b36SAndroid Build Coastguard Worker prefer: false, 124*333d2b36SAndroid Build Coastguard Worker } 125*333d2b36SAndroid Build Coastguard Worker `) 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Worker hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") 128*333d2b36SAndroid Build Coastguard Worker hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") 129*333d2b36SAndroid Build Coastguard Worker fromSourceJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar" 130*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, fromSourceJarArg) 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker prebuiltJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/dex/foo.jar" 133*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, prebuiltJarArg) 134*333d2b36SAndroid Build Coastguard Worker} 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithPrebuiltOverrideSource(t *testing.T) { 137*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 138*333d2b36SAndroid Build Coastguard Worker hiddenApiFixtureFactory, 139*333d2b36SAndroid Build Coastguard Worker FixtureConfigureBootJars("platform:foo"), 140*333d2b36SAndroid Build Coastguard Worker prepareForTestWithDefaultPlatformBootclasspath, 141*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 142*333d2b36SAndroid Build Coastguard Worker java_library { 143*333d2b36SAndroid Build Coastguard Worker name: "foo", 144*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 145*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker 148*333d2b36SAndroid Build Coastguard Worker java_import { 149*333d2b36SAndroid Build Coastguard Worker name: "foo", 150*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 151*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 152*333d2b36SAndroid Build Coastguard Worker prefer: true, 153*333d2b36SAndroid Build Coastguard Worker } 154*333d2b36SAndroid Build Coastguard Worker `) 155*333d2b36SAndroid Build Coastguard Worker 156*333d2b36SAndroid Build Coastguard Worker hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") 157*333d2b36SAndroid Build Coastguard Worker hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") 158*333d2b36SAndroid Build Coastguard Worker prebuiltJarArg := "--boot-dex=out/soong/.intermediates/prebuilt_foo/android_common/dex/foo.jar" 159*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, prebuiltJarArg) 160*333d2b36SAndroid Build Coastguard Worker 161*333d2b36SAndroid Build Coastguard Worker fromSourceJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar" 162*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesNotContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, fromSourceJarArg) 163*333d2b36SAndroid Build Coastguard Worker} 164*333d2b36SAndroid Build Coastguard Worker 165*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonSdks(t *testing.T) { 166*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 167*333d2b36SAndroid Build Coastguard Worker name string 168*333d2b36SAndroid Build Coastguard Worker unbundledBuild bool 169*333d2b36SAndroid Build Coastguard Worker publicStub string 170*333d2b36SAndroid Build Coastguard Worker systemStub string 171*333d2b36SAndroid Build Coastguard Worker testStub string 172*333d2b36SAndroid Build Coastguard Worker corePlatformStub string 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Worker // Additional test preparer 175*333d2b36SAndroid Build Coastguard Worker preparer android.FixturePreparer 176*333d2b36SAndroid Build Coastguard Worker }{ 177*333d2b36SAndroid Build Coastguard Worker { 178*333d2b36SAndroid Build Coastguard Worker name: "testBundled", 179*333d2b36SAndroid Build Coastguard Worker unbundledBuild: false, 180*333d2b36SAndroid Build Coastguard Worker publicStub: "android_stubs_current_exportable", 181*333d2b36SAndroid Build Coastguard Worker systemStub: "android_system_stubs_current_exportable", 182*333d2b36SAndroid Build Coastguard Worker testStub: "android_test_stubs_current_exportable", 183*333d2b36SAndroid Build Coastguard Worker corePlatformStub: "legacy.core.platform.api.stubs.exportable", 184*333d2b36SAndroid Build Coastguard Worker preparer: android.GroupFixturePreparers(), 185*333d2b36SAndroid Build Coastguard Worker }, { 186*333d2b36SAndroid Build Coastguard Worker name: "testUnbundled", 187*333d2b36SAndroid Build Coastguard Worker unbundledBuild: true, 188*333d2b36SAndroid Build Coastguard Worker publicStub: "sdk_public_current_android", 189*333d2b36SAndroid Build Coastguard Worker systemStub: "sdk_system_current_android", 190*333d2b36SAndroid Build Coastguard Worker testStub: "sdk_test_current_android", 191*333d2b36SAndroid Build Coastguard Worker corePlatformStub: "legacy.core.platform.api.stubs.exportable", 192*333d2b36SAndroid Build Coastguard Worker preparer: PrepareForTestWithPrebuiltsOfCurrentApi, 193*333d2b36SAndroid Build Coastguard Worker }, 194*333d2b36SAndroid Build Coastguard Worker } 195*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 196*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 197*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 198*333d2b36SAndroid Build Coastguard Worker hiddenApiFixtureFactory, 199*333d2b36SAndroid Build Coastguard Worker tc.preparer, 200*333d2b36SAndroid Build Coastguard Worker prepareForTestWithDefaultPlatformBootclasspath, 201*333d2b36SAndroid Build Coastguard Worker // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi 202*333d2b36SAndroid Build Coastguard Worker // file creation. 203*333d2b36SAndroid Build Coastguard Worker FixtureConfigureBootJars("platform:foo"), 204*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 205*333d2b36SAndroid Build Coastguard Worker variables.Always_use_prebuilt_sdks = proptools.BoolPtr(tc.unbundledBuild) 206*333d2b36SAndroid Build Coastguard Worker }), 207*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"), 208*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 209*333d2b36SAndroid Build Coastguard Worker java_library { 210*333d2b36SAndroid Build Coastguard Worker name: "foo", 211*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 212*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 213*333d2b36SAndroid Build Coastguard Worker } 214*333d2b36SAndroid Build Coastguard Worker `) 215*333d2b36SAndroid Build Coastguard Worker 216*333d2b36SAndroid Build Coastguard Worker hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") 217*333d2b36SAndroid Build Coastguard Worker hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") 218*333d2b36SAndroid Build Coastguard Worker wantPublicStubs := "--public-stub-classpath=" + generateSdkDexPath(tc.publicStub, tc.unbundledBuild) 219*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantPublicStubs) 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Worker wantSystemStubs := "--system-stub-classpath=" + generateSdkDexPath(tc.systemStub, tc.unbundledBuild) 222*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantSystemStubs) 223*333d2b36SAndroid Build Coastguard Worker 224*333d2b36SAndroid Build Coastguard Worker wantTestStubs := "--test-stub-classpath=" + generateSdkDexPath(tc.testStub, tc.unbundledBuild) 225*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantTestStubs) 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker wantCorePlatformStubs := "--core-platform-stub-classpath=" + generateDexPath(defaultJavaDir, tc.corePlatformStub) 228*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantCorePlatformStubs) 229*333d2b36SAndroid Build Coastguard Worker }) 230*333d2b36SAndroid Build Coastguard Worker } 231*333d2b36SAndroid Build Coastguard Worker} 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Workerfunc generateDexedPath(subDir, dex, module string) string { 234*333d2b36SAndroid Build Coastguard Worker return fmt.Sprintf("out/soong/.intermediates/%s/android_common/%s/%s.jar", subDir, dex, module) 235*333d2b36SAndroid Build Coastguard Worker} 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Workerfunc generateDexPath(moduleDir string, module string) string { 238*333d2b36SAndroid Build Coastguard Worker return generateDexedPath(filepath.Join(moduleDir, module), "dex", module) 239*333d2b36SAndroid Build Coastguard Worker} 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Workerfunc generateSdkDexPath(module string, unbundled bool) string { 242*333d2b36SAndroid Build Coastguard Worker if unbundled { 243*333d2b36SAndroid Build Coastguard Worker return generateDexedPath("prebuilts/sdk/"+module, "dex", module) 244*333d2b36SAndroid Build Coastguard Worker } 245*333d2b36SAndroid Build Coastguard Worker return generateDexPath(defaultJavaDir, module) 246*333d2b36SAndroid Build Coastguard Worker} 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithPrebuiltCsvFile(t *testing.T) { 249*333d2b36SAndroid Build Coastguard Worker 250*333d2b36SAndroid Build Coastguard Worker // The idea behind this test is to ensure that when the build is 251*333d2b36SAndroid Build Coastguard Worker // confugured with a PrebuiltHiddenApiDir that the rules for the 252*333d2b36SAndroid Build Coastguard Worker // hiddenapi singleton copy the prebuilts to the typical output 253*333d2b36SAndroid Build Coastguard Worker // location, and then use that output location for the hiddenapi encode 254*333d2b36SAndroid Build Coastguard Worker // dex step. 255*333d2b36SAndroid Build Coastguard Worker 256*333d2b36SAndroid Build Coastguard Worker // Where to find the prebuilt hiddenapi files: 257*333d2b36SAndroid Build Coastguard Worker prebuiltHiddenApiDir := "path/to/prebuilt/hiddenapi" 258*333d2b36SAndroid Build Coastguard Worker 259*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 260*333d2b36SAndroid Build Coastguard Worker hiddenApiFixtureFactory, 261*333d2b36SAndroid Build Coastguard Worker FixtureConfigureBootJars("platform:foo"), 262*333d2b36SAndroid Build Coastguard Worker fixtureSetPrebuiltHiddenApiDirProductVariable(&prebuiltHiddenApiDir), 263*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 264*333d2b36SAndroid Build Coastguard Worker java_import { 265*333d2b36SAndroid Build Coastguard Worker name: "foo", 266*333d2b36SAndroid Build Coastguard Worker jars: ["a.jar"], 267*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 268*333d2b36SAndroid Build Coastguard Worker } 269*333d2b36SAndroid Build Coastguard Worker `) 270*333d2b36SAndroid Build Coastguard Worker 271*333d2b36SAndroid Build Coastguard Worker expectedCpInput := prebuiltHiddenApiDir + "/hiddenapi-flags.csv" 272*333d2b36SAndroid Build Coastguard Worker expectedCpOutput := "out/soong/hiddenapi/hiddenapi-flags.csv" 273*333d2b36SAndroid Build Coastguard Worker expectedFlagsCsv := "out/soong/hiddenapi/hiddenapi-flags.csv" 274*333d2b36SAndroid Build Coastguard Worker 275*333d2b36SAndroid Build Coastguard Worker foo := result.ModuleForTests("foo", "android_common") 276*333d2b36SAndroid Build Coastguard Worker 277*333d2b36SAndroid Build Coastguard Worker hiddenAPI := result.SingletonForTests("hiddenapi") 278*333d2b36SAndroid Build Coastguard Worker cpRule := hiddenAPI.Rule("Cp") 279*333d2b36SAndroid Build Coastguard Worker actualCpInput := cpRule.BuildParams.Input 280*333d2b36SAndroid Build Coastguard Worker actualCpOutput := cpRule.BuildParams.Output 281*333d2b36SAndroid Build Coastguard Worker encodeDexRule := foo.Rule("hiddenAPIEncodeDex") 282*333d2b36SAndroid Build Coastguard Worker actualFlagsCsv := encodeDexRule.BuildParams.Args["flagsCsv"] 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "hiddenapi cp rule input", expectedCpInput, actualCpInput) 285*333d2b36SAndroid Build Coastguard Worker 286*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "hiddenapi cp rule output", expectedCpOutput, actualCpOutput) 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "hiddenapi encode dex rule flags csv", expectedFlagsCsv, actualFlagsCsv) 289*333d2b36SAndroid Build Coastguard Worker} 290*333d2b36SAndroid Build Coastguard Worker 291*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPIEncoding_JavaSdkLibrary(t *testing.T) { 292*333d2b36SAndroid Build Coastguard Worker 293*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 294*333d2b36SAndroid Build Coastguard Worker hiddenApiFixtureFactory, 295*333d2b36SAndroid Build Coastguard Worker FixtureConfigureBootJars("platform:foo"), 296*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 297*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("foo"), 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Worker // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding 300*333d2b36SAndroid Build Coastguard Worker // is disabled. 301*333d2b36SAndroid Build Coastguard Worker android.FixtureAddTextFile("frameworks/base/Android.bp", ""), 302*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 303*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 304*333d2b36SAndroid Build Coastguard Worker name: "foo", 305*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 306*333d2b36SAndroid Build Coastguard Worker shared_library: false, 307*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 308*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 309*333d2b36SAndroid Build Coastguard Worker } 310*333d2b36SAndroid Build Coastguard Worker `) 311*333d2b36SAndroid Build Coastguard Worker 312*333d2b36SAndroid Build Coastguard Worker checkDexEncoded := func(t *testing.T, name, unencodedDexJar, encodedDexJar string) { 313*333d2b36SAndroid Build Coastguard Worker moduleForTests := result.ModuleForTests(name+".impl", "android_common") 314*333d2b36SAndroid Build Coastguard Worker 315*333d2b36SAndroid Build Coastguard Worker encodeDexRule := moduleForTests.Rule("hiddenAPIEncodeDex") 316*333d2b36SAndroid Build Coastguard Worker actualUnencodedDexJar := encodeDexRule.Input 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker // Make sure that the module has its dex jar encoded. 319*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "encode embedded java_library", unencodedDexJar, actualUnencodedDexJar.String()) 320*333d2b36SAndroid Build Coastguard Worker 321*333d2b36SAndroid Build Coastguard Worker // Make sure that the encoded dex jar is the exported one. 322*333d2b36SAndroid Build Coastguard Worker errCtx := moduleErrorfTestCtx{} 323*333d2b36SAndroid Build Coastguard Worker exportedDexJar := moduleForTests.Module().(UsesLibraryDependency).DexJarBuildPath(errCtx).Path() 324*333d2b36SAndroid Build Coastguard Worker android.AssertPathRelativeToTopEquals(t, "encode embedded java_library", encodedDexJar, exportedDexJar) 325*333d2b36SAndroid Build Coastguard Worker } 326*333d2b36SAndroid Build Coastguard Worker 327*333d2b36SAndroid Build Coastguard Worker // The java_library embedded with the java_sdk_library must be dex encoded. 328*333d2b36SAndroid Build Coastguard Worker t.Run("foo", func(t *testing.T) { 329*333d2b36SAndroid Build Coastguard Worker expectedUnencodedDexJar := "out/soong/.intermediates/foo.impl/android_common/aligned/foo.jar" 330*333d2b36SAndroid Build Coastguard Worker expectedEncodedDexJar := "out/soong/.intermediates/foo.impl/android_common/hiddenapi/foo.jar" 331*333d2b36SAndroid Build Coastguard Worker checkDexEncoded(t, "foo", expectedUnencodedDexJar, expectedEncodedDexJar) 332*333d2b36SAndroid Build Coastguard Worker }) 333*333d2b36SAndroid Build Coastguard Worker} 334