1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2021 The Android Open Source Project 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 "strings" 19*333d2b36SAndroid Build Coastguard Worker "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker// Contains some simple tests for bootclasspath_fragment logic, additional tests can be found in 26*333d2b36SAndroid Build Coastguard Worker// apex/bootclasspath_fragment_test.go as the ART boot image requires modules from the ART apex. 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithBootclasspathFragment = android.GroupFixturePreparers( 29*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaDefaultModules, 30*333d2b36SAndroid Build Coastguard Worker dexpreopt.PrepareForTestByEnablingDexpreopt, 31*333d2b36SAndroid Build Coastguard Worker) 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragment_UnknownImageName(t *testing.T) { 34*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment. 35*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( 36*333d2b36SAndroid Build Coastguard Worker `\Qimage_name: unknown image name "unknown", expected "art"\E`)). 37*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 38*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 39*333d2b36SAndroid Build Coastguard Worker name: "unknown-bootclasspath-fragment", 40*333d2b36SAndroid Build Coastguard Worker image_name: "unknown", 41*333d2b36SAndroid Build Coastguard Worker contents: ["foo"], 42*333d2b36SAndroid Build Coastguard Worker } 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker java_library { 45*333d2b36SAndroid Build Coastguard Worker name: "foo", 46*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 47*333d2b36SAndroid Build Coastguard Worker installable: true, 48*333d2b36SAndroid Build Coastguard Worker } 49*333d2b36SAndroid Build Coastguard Worker `) 50*333d2b36SAndroid Build Coastguard Worker} 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltBootclasspathFragment_UnknownImageName(t *testing.T) { 53*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment. 54*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( 55*333d2b36SAndroid Build Coastguard Worker `\Qimage_name: unknown image name "unknown", expected "art"\E`)). 56*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 57*333d2b36SAndroid Build Coastguard Worker prebuilt_bootclasspath_fragment { 58*333d2b36SAndroid Build Coastguard Worker name: "unknown-bootclasspath-fragment", 59*333d2b36SAndroid Build Coastguard Worker image_name: "unknown", 60*333d2b36SAndroid Build Coastguard Worker contents: ["foo"], 61*333d2b36SAndroid Build Coastguard Worker } 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Worker java_import { 64*333d2b36SAndroid Build Coastguard Worker name: "foo", 65*333d2b36SAndroid Build Coastguard Worker jars: ["foo.jar"], 66*333d2b36SAndroid Build Coastguard Worker } 67*333d2b36SAndroid Build Coastguard Worker `) 68*333d2b36SAndroid Build Coastguard Worker} 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragmentInconsistentArtConfiguration_Platform(t *testing.T) { 71*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 72*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment, 73*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetArtBootJars("platform:foo", "apex:bar"), 74*333d2b36SAndroid Build Coastguard Worker ). 75*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( 76*333d2b36SAndroid Build Coastguard Worker `\QArtApexJars is invalid as it requests a platform variant of "foo"\E`)). 77*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 78*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 79*333d2b36SAndroid Build Coastguard Worker name: "bootclasspath-fragment", 80*333d2b36SAndroid Build Coastguard Worker image_name: "art", 81*333d2b36SAndroid Build Coastguard Worker contents: ["foo", "bar"], 82*333d2b36SAndroid Build Coastguard Worker apex_available: [ 83*333d2b36SAndroid Build Coastguard Worker "apex", 84*333d2b36SAndroid Build Coastguard Worker ], 85*333d2b36SAndroid Build Coastguard Worker } 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker java_library { 88*333d2b36SAndroid Build Coastguard Worker name: "foo", 89*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 90*333d2b36SAndroid Build Coastguard Worker installable: true, 91*333d2b36SAndroid Build Coastguard Worker } 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Worker java_library { 94*333d2b36SAndroid Build Coastguard Worker name: "bar", 95*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.java"], 96*333d2b36SAndroid Build Coastguard Worker installable: true, 97*333d2b36SAndroid Build Coastguard Worker } 98*333d2b36SAndroid Build Coastguard Worker `) 99*333d2b36SAndroid Build Coastguard Worker} 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragmentInconsistentArtConfiguration_ApexMixture(t *testing.T) { 102*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers( 103*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment, 104*333d2b36SAndroid Build Coastguard Worker dexpreopt.FixtureSetArtBootJars("apex1:foo", "apex2:bar"), 105*333d2b36SAndroid Build Coastguard Worker ). 106*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( 107*333d2b36SAndroid Build Coastguard Worker `\QArtApexJars configuration is inconsistent, expected all jars to be in the same apex but it specifies apex "apex1" and "apex2"\E`)). 108*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, ` 109*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 110*333d2b36SAndroid Build Coastguard Worker name: "bootclasspath-fragment", 111*333d2b36SAndroid Build Coastguard Worker image_name: "art", 112*333d2b36SAndroid Build Coastguard Worker contents: ["foo", "bar"], 113*333d2b36SAndroid Build Coastguard Worker apex_available: [ 114*333d2b36SAndroid Build Coastguard Worker "apex1", 115*333d2b36SAndroid Build Coastguard Worker "apex2", 116*333d2b36SAndroid Build Coastguard Worker ], 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker java_library { 120*333d2b36SAndroid Build Coastguard Worker name: "foo", 121*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.java"], 122*333d2b36SAndroid Build Coastguard Worker installable: true, 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker java_library { 126*333d2b36SAndroid Build Coastguard Worker name: "bar", 127*333d2b36SAndroid Build Coastguard Worker srcs: ["bar.java"], 128*333d2b36SAndroid Build Coastguard Worker installable: true, 129*333d2b36SAndroid Build Coastguard Worker } 130*333d2b36SAndroid Build Coastguard Worker `) 131*333d2b36SAndroid Build Coastguard Worker} 132*333d2b36SAndroid Build Coastguard Worker 133*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragment_Coverage(t *testing.T) { 134*333d2b36SAndroid Build Coastguard Worker prepareWithBp := android.FixtureWithRootAndroidBp(` 135*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 136*333d2b36SAndroid Build Coastguard Worker name: "myfragment", 137*333d2b36SAndroid Build Coastguard Worker contents: [ 138*333d2b36SAndroid Build Coastguard Worker "mybootlib", 139*333d2b36SAndroid Build Coastguard Worker ], 140*333d2b36SAndroid Build Coastguard Worker api: { 141*333d2b36SAndroid Build Coastguard Worker stub_libs: [ 142*333d2b36SAndroid Build Coastguard Worker "mysdklibrary", 143*333d2b36SAndroid Build Coastguard Worker ], 144*333d2b36SAndroid Build Coastguard Worker }, 145*333d2b36SAndroid Build Coastguard Worker coverage: { 146*333d2b36SAndroid Build Coastguard Worker contents: [ 147*333d2b36SAndroid Build Coastguard Worker "coveragelib", 148*333d2b36SAndroid Build Coastguard Worker ], 149*333d2b36SAndroid Build Coastguard Worker api: { 150*333d2b36SAndroid Build Coastguard Worker stub_libs: [ 151*333d2b36SAndroid Build Coastguard Worker "mycoveragestubs", 152*333d2b36SAndroid Build Coastguard Worker ], 153*333d2b36SAndroid Build Coastguard Worker }, 154*333d2b36SAndroid Build Coastguard Worker }, 155*333d2b36SAndroid Build Coastguard Worker hidden_api: { 156*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 157*333d2b36SAndroid Build Coastguard Worker }, 158*333d2b36SAndroid Build Coastguard Worker } 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Worker java_library { 161*333d2b36SAndroid Build Coastguard Worker name: "mybootlib", 162*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 163*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 164*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 165*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 166*333d2b36SAndroid Build Coastguard Worker } 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Worker java_library { 169*333d2b36SAndroid Build Coastguard Worker name: "coveragelib", 170*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 171*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 172*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 173*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 174*333d2b36SAndroid Build Coastguard Worker } 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 177*333d2b36SAndroid Build Coastguard Worker name: "mysdklibrary", 178*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 179*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 180*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 181*333d2b36SAndroid Build Coastguard Worker system: {enabled: true}, 182*333d2b36SAndroid Build Coastguard Worker } 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 185*333d2b36SAndroid Build Coastguard Worker name: "mycoveragestubs", 186*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 187*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 188*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker `) 191*333d2b36SAndroid Build Coastguard Worker 192*333d2b36SAndroid Build Coastguard Worker checkContents := func(t *testing.T, result *android.TestResult, expected ...string) { 193*333d2b36SAndroid Build Coastguard Worker module := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule) 194*333d2b36SAndroid Build Coastguard Worker eval := module.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext)) 195*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "contents property", expected, module.properties.Contents.GetOrDefault(eval, nil)) 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker preparer := android.GroupFixturePreparers( 199*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment, 200*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 201*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("mysdklibrary", "mycoveragestubs"), 202*333d2b36SAndroid Build Coastguard Worker FixtureConfigureApexBootJars("someapex:mybootlib"), 203*333d2b36SAndroid Build Coastguard Worker prepareWithBp, 204*333d2b36SAndroid Build Coastguard Worker ) 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Worker t.Run("without coverage", func(t *testing.T) { 207*333d2b36SAndroid Build Coastguard Worker result := preparer.RunTest(t) 208*333d2b36SAndroid Build Coastguard Worker checkContents(t, result, "mybootlib") 209*333d2b36SAndroid Build Coastguard Worker }) 210*333d2b36SAndroid Build Coastguard Worker 211*333d2b36SAndroid Build Coastguard Worker t.Run("with coverage", func(t *testing.T) { 212*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 213*333d2b36SAndroid Build Coastguard Worker prepareForTestWithFrameworkJacocoInstrumentation, 214*333d2b36SAndroid Build Coastguard Worker preparer, 215*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 216*333d2b36SAndroid Build Coastguard Worker checkContents(t, result, "mybootlib", "coveragelib") 217*333d2b36SAndroid Build Coastguard Worker }) 218*333d2b36SAndroid Build Coastguard Worker} 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragment_StubLibs(t *testing.T) { 221*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 222*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment, 223*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 224*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"), 225*333d2b36SAndroid Build Coastguard Worker FixtureConfigureApexBootJars("someapex:mysdklibrary"), 226*333d2b36SAndroid Build Coastguard Worker android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"), 227*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 228*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 229*333d2b36SAndroid Build Coastguard Worker name: "myfragment", 230*333d2b36SAndroid Build Coastguard Worker contents: ["mysdklibrary"], 231*333d2b36SAndroid Build Coastguard Worker api: { 232*333d2b36SAndroid Build Coastguard Worker stub_libs: [ 233*333d2b36SAndroid Build Coastguard Worker "mystublib", 234*333d2b36SAndroid Build Coastguard Worker "myothersdklibrary", 235*333d2b36SAndroid Build Coastguard Worker ], 236*333d2b36SAndroid Build Coastguard Worker }, 237*333d2b36SAndroid Build Coastguard Worker core_platform_api: { 238*333d2b36SAndroid Build Coastguard Worker stub_libs: ["mycoreplatform.stubs"], 239*333d2b36SAndroid Build Coastguard Worker }, 240*333d2b36SAndroid Build Coastguard Worker hidden_api: { 241*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 242*333d2b36SAndroid Build Coastguard Worker }, 243*333d2b36SAndroid Build Coastguard Worker } 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Worker java_library { 246*333d2b36SAndroid Build Coastguard Worker name: "mystublib", 247*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 248*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 249*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 250*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 251*333d2b36SAndroid Build Coastguard Worker } 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 254*333d2b36SAndroid Build Coastguard Worker name: "mysdklibrary", 255*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 256*333d2b36SAndroid Build Coastguard Worker shared_library: false, 257*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 258*333d2b36SAndroid Build Coastguard Worker system: {enabled: true}, 259*333d2b36SAndroid Build Coastguard Worker } 260*333d2b36SAndroid Build Coastguard Worker 261*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 262*333d2b36SAndroid Build Coastguard Worker name: "myothersdklibrary", 263*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 264*333d2b36SAndroid Build Coastguard Worker shared_library: false, 265*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 266*333d2b36SAndroid Build Coastguard Worker } 267*333d2b36SAndroid Build Coastguard Worker 268*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 269*333d2b36SAndroid Build Coastguard Worker name: "mycoreplatform", 270*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 271*333d2b36SAndroid Build Coastguard Worker shared_library: false, 272*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 273*333d2b36SAndroid Build Coastguard Worker } 274*333d2b36SAndroid Build Coastguard Worker `) 275*333d2b36SAndroid Build Coastguard Worker 276*333d2b36SAndroid Build Coastguard Worker fragment := result.Module("myfragment", "android_common") 277*333d2b36SAndroid Build Coastguard Worker info, _ := android.OtherModuleProvider(result, fragment, HiddenAPIInfoProvider) 278*333d2b36SAndroid Build Coastguard Worker 279*333d2b36SAndroid Build Coastguard Worker stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar" 280*333d2b36SAndroid Build Coastguard Worker 281*333d2b36SAndroid Build Coastguard Worker // Stubs jars for mysdklibrary 282*333d2b36SAndroid Build Coastguard Worker publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar" 283*333d2b36SAndroid Build Coastguard Worker systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.exportable.system/android_common/dex/mysdklibrary.stubs.exportable.system.jar" 284*333d2b36SAndroid Build Coastguard Worker 285*333d2b36SAndroid Build Coastguard Worker // Stubs jars for myothersdklibrary 286*333d2b36SAndroid Build Coastguard Worker otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs.exportable/android_common/dex/myothersdklibrary.stubs.exportable.jar" 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Worker // Check that SdkPublic uses public stubs for all sdk libraries. 289*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(PublicHiddenAPIScope)) 290*333d2b36SAndroid Build Coastguard Worker 291*333d2b36SAndroid Build Coastguard Worker // Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary 292*333d2b36SAndroid Build Coastguard Worker // as it does not provide system stubs. 293*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(SystemHiddenAPIScope)) 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Worker // Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs 296*333d2b36SAndroid Build Coastguard Worker // and public stubs for myothersdklibrary as it does not provide test stubs either. 297*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(TestHiddenAPIScope)) 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Worker // Check that SdkCorePlatform uses public stubs from the mycoreplatform library. 300*333d2b36SAndroid Build Coastguard Worker corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar" 301*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(CorePlatformHiddenAPIScope)) 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker // Check the widest stubs.. The list contains the widest stub dex jar provided by each module. 304*333d2b36SAndroid Build Coastguard Worker expectedWidestPaths := []string{ 305*333d2b36SAndroid Build Coastguard Worker // mycoreplatform's widest API is core platform. 306*333d2b36SAndroid Build Coastguard Worker corePlatformStubsJar, 307*333d2b36SAndroid Build Coastguard Worker 308*333d2b36SAndroid Build Coastguard Worker // myothersdklibrary's widest API is public. 309*333d2b36SAndroid Build Coastguard Worker otherPublicStubsJar, 310*333d2b36SAndroid Build Coastguard Worker 311*333d2b36SAndroid Build Coastguard Worker // sdklibrary's widest API is system. 312*333d2b36SAndroid Build Coastguard Worker systemStubsJar, 313*333d2b36SAndroid Build Coastguard Worker 314*333d2b36SAndroid Build Coastguard Worker // mystublib's only provides one API and so it must be the widest. 315*333d2b36SAndroid Build Coastguard Worker stubsJar, 316*333d2b36SAndroid Build Coastguard Worker } 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "widest dex stubs jar", expectedWidestPaths, info.TransitiveStubDexJarsByScope.StubDexJarsForWidestAPIScope()) 319*333d2b36SAndroid Build Coastguard Worker} 320*333d2b36SAndroid Build Coastguard Worker 321*333d2b36SAndroid Build Coastguard Workerfunc TestFromTextWidestApiScope(t *testing.T) { 322*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 323*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment, 324*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 325*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyConfig(func(config android.Config) { 326*333d2b36SAndroid Build Coastguard Worker config.SetBuildFromTextStub(true) 327*333d2b36SAndroid Build Coastguard Worker }), 328*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("mysdklibrary", "android-non-updatable"), 329*333d2b36SAndroid Build Coastguard Worker FixtureConfigureApexBootJars("someapex:mysdklibrary"), 330*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 331*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 332*333d2b36SAndroid Build Coastguard Worker name: "myfragment", 333*333d2b36SAndroid Build Coastguard Worker contents: ["mysdklibrary"], 334*333d2b36SAndroid Build Coastguard Worker additional_stubs: [ 335*333d2b36SAndroid Build Coastguard Worker "android-non-updatable", 336*333d2b36SAndroid Build Coastguard Worker ], 337*333d2b36SAndroid Build Coastguard Worker hidden_api: { 338*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 339*333d2b36SAndroid Build Coastguard Worker }, 340*333d2b36SAndroid Build Coastguard Worker } 341*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 342*333d2b36SAndroid Build Coastguard Worker name: "mysdklibrary", 343*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 344*333d2b36SAndroid Build Coastguard Worker shared_library: false, 345*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 346*333d2b36SAndroid Build Coastguard Worker system: {enabled: true}, 347*333d2b36SAndroid Build Coastguard Worker } 348*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 349*333d2b36SAndroid Build Coastguard Worker name: "android-non-updatable", 350*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 351*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 352*333d2b36SAndroid Build Coastguard Worker public: { 353*333d2b36SAndroid Build Coastguard Worker enabled: true, 354*333d2b36SAndroid Build Coastguard Worker }, 355*333d2b36SAndroid Build Coastguard Worker system: { 356*333d2b36SAndroid Build Coastguard Worker enabled: true, 357*333d2b36SAndroid Build Coastguard Worker }, 358*333d2b36SAndroid Build Coastguard Worker test: { 359*333d2b36SAndroid Build Coastguard Worker enabled: true, 360*333d2b36SAndroid Build Coastguard Worker }, 361*333d2b36SAndroid Build Coastguard Worker module_lib: { 362*333d2b36SAndroid Build Coastguard Worker enabled: true, 363*333d2b36SAndroid Build Coastguard Worker }, 364*333d2b36SAndroid Build Coastguard Worker } 365*333d2b36SAndroid Build Coastguard Worker `) 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Worker fragment := result.ModuleForTests("myfragment", "android_common") 368*333d2b36SAndroid Build Coastguard Worker dependencyStubDexFlag := "--dependency-stub-dex=out/soong/.intermediates/default/java/android-non-updatable.stubs.test_module_lib/android_common/dex/android-non-updatable.stubs.test_module_lib.jar" 369*333d2b36SAndroid Build Coastguard Worker stubFlagsCommand := fragment.Output("modular-hiddenapi/stub-flags.csv").RuleParams.Command 370*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, 371*333d2b36SAndroid Build Coastguard Worker "Stub flags generating command does not include the expected dependency stub dex file", 372*333d2b36SAndroid Build Coastguard Worker stubFlagsCommand, dependencyStubDexFlag) 373*333d2b36SAndroid Build Coastguard Worker} 374*333d2b36SAndroid Build Coastguard Worker 375*333d2b36SAndroid Build Coastguard Workerfunc TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) { 376*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 377*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment, 378*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 379*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("mysdklibrary", "mynewlibrary"), 380*333d2b36SAndroid Build Coastguard Worker FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:mynewlibrary"), 381*333d2b36SAndroid Build Coastguard Worker android.MockFS{ 382*333d2b36SAndroid Build Coastguard Worker "my-blocked.txt": nil, 383*333d2b36SAndroid Build Coastguard Worker "my-max-target-o-low-priority.txt": nil, 384*333d2b36SAndroid Build Coastguard Worker "my-max-target-p.txt": nil, 385*333d2b36SAndroid Build Coastguard Worker "my-max-target-q.txt": nil, 386*333d2b36SAndroid Build Coastguard Worker "my-max-target-r-low-priority.txt": nil, 387*333d2b36SAndroid Build Coastguard Worker "my-removed.txt": nil, 388*333d2b36SAndroid Build Coastguard Worker "my-unsupported-packages.txt": nil, 389*333d2b36SAndroid Build Coastguard Worker "my-unsupported.txt": nil, 390*333d2b36SAndroid Build Coastguard Worker "my-new-max-target-q.txt": nil, 391*333d2b36SAndroid Build Coastguard Worker }.AddToFixture(), 392*333d2b36SAndroid Build Coastguard Worker android.FixtureWithRootAndroidBp(` 393*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 394*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspathfragment", 395*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 396*333d2b36SAndroid Build Coastguard Worker contents: ["mybootlib", "mynewlibrary"], 397*333d2b36SAndroid Build Coastguard Worker hidden_api: { 398*333d2b36SAndroid Build Coastguard Worker unsupported: [ 399*333d2b36SAndroid Build Coastguard Worker "my-unsupported.txt", 400*333d2b36SAndroid Build Coastguard Worker ], 401*333d2b36SAndroid Build Coastguard Worker removed: [ 402*333d2b36SAndroid Build Coastguard Worker "my-removed.txt", 403*333d2b36SAndroid Build Coastguard Worker ], 404*333d2b36SAndroid Build Coastguard Worker max_target_r_low_priority: [ 405*333d2b36SAndroid Build Coastguard Worker "my-max-target-r-low-priority.txt", 406*333d2b36SAndroid Build Coastguard Worker ], 407*333d2b36SAndroid Build Coastguard Worker max_target_q: [ 408*333d2b36SAndroid Build Coastguard Worker "my-max-target-q.txt", 409*333d2b36SAndroid Build Coastguard Worker ], 410*333d2b36SAndroid Build Coastguard Worker max_target_p: [ 411*333d2b36SAndroid Build Coastguard Worker "my-max-target-p.txt", 412*333d2b36SAndroid Build Coastguard Worker ], 413*333d2b36SAndroid Build Coastguard Worker max_target_o_low_priority: [ 414*333d2b36SAndroid Build Coastguard Worker "my-max-target-o-low-priority.txt", 415*333d2b36SAndroid Build Coastguard Worker ], 416*333d2b36SAndroid Build Coastguard Worker blocked: [ 417*333d2b36SAndroid Build Coastguard Worker "my-blocked.txt", 418*333d2b36SAndroid Build Coastguard Worker ], 419*333d2b36SAndroid Build Coastguard Worker unsupported_packages: [ 420*333d2b36SAndroid Build Coastguard Worker "my-unsupported-packages.txt", 421*333d2b36SAndroid Build Coastguard Worker ], 422*333d2b36SAndroid Build Coastguard Worker split_packages: ["sdklibrary"], 423*333d2b36SAndroid Build Coastguard Worker package_prefixes: ["sdklibrary.all.mine"], 424*333d2b36SAndroid Build Coastguard Worker single_packages: ["sdklibrary.mine"], 425*333d2b36SAndroid Build Coastguard Worker }, 426*333d2b36SAndroid Build Coastguard Worker } 427*333d2b36SAndroid Build Coastguard Worker 428*333d2b36SAndroid Build Coastguard Worker java_library { 429*333d2b36SAndroid Build Coastguard Worker name: "mybootlib", 430*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 431*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 432*333d2b36SAndroid Build Coastguard Worker system_modules: "none", 433*333d2b36SAndroid Build Coastguard Worker sdk_version: "none", 434*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "1", 435*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 436*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["mybootlib"], 437*333d2b36SAndroid Build Coastguard Worker } 438*333d2b36SAndroid Build Coastguard Worker 439*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 440*333d2b36SAndroid Build Coastguard Worker name: "mynewlibrary", 441*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 442*333d2b36SAndroid Build Coastguard Worker srcs: ["Test.java"], 443*333d2b36SAndroid Build Coastguard Worker min_sdk_version: "10", 444*333d2b36SAndroid Build Coastguard Worker compile_dex: true, 445*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 446*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["mysdklibrary"], 447*333d2b36SAndroid Build Coastguard Worker hidden_api: { 448*333d2b36SAndroid Build Coastguard Worker max_target_q: [ 449*333d2b36SAndroid Build Coastguard Worker "my-new-max-target-q.txt", 450*333d2b36SAndroid Build Coastguard Worker ], 451*333d2b36SAndroid Build Coastguard Worker split_packages: ["sdklibrary", "newlibrary"], 452*333d2b36SAndroid Build Coastguard Worker package_prefixes: ["newlibrary.all.mine"], 453*333d2b36SAndroid Build Coastguard Worker single_packages: ["newlibrary.mine"], 454*333d2b36SAndroid Build Coastguard Worker }, 455*333d2b36SAndroid Build Coastguard Worker } 456*333d2b36SAndroid Build Coastguard Worker `), 457*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 458*333d2b36SAndroid Build Coastguard Worker 459*333d2b36SAndroid Build Coastguard Worker // Make sure that the library exports hidden API properties for use by the bootclasspath_fragment. 460*333d2b36SAndroid Build Coastguard Worker library := result.Module("mynewlibrary", "android_common") 461*333d2b36SAndroid Build Coastguard Worker info, _ := android.OtherModuleProvider(result, library, hiddenAPIPropertyInfoProvider) 462*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "split packages", []string{"sdklibrary", "newlibrary"}, info.SplitPackages) 463*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "package prefixes", []string{"newlibrary.all.mine"}, info.PackagePrefixes) 464*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "single packages", []string{"newlibrary.mine"}, info.SinglePackages) 465*333d2b36SAndroid Build Coastguard Worker for _, c := range HiddenAPIFlagFileCategories { 466*333d2b36SAndroid Build Coastguard Worker expectedMaxTargetQPaths := []string(nil) 467*333d2b36SAndroid Build Coastguard Worker if c.PropertyName() == "max_target_q" { 468*333d2b36SAndroid Build Coastguard Worker expectedMaxTargetQPaths = []string{"my-new-max-target-q.txt"} 469*333d2b36SAndroid Build Coastguard Worker } 470*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, c.PropertyName(), expectedMaxTargetQPaths, info.FlagFilesByCategory[c]) 471*333d2b36SAndroid Build Coastguard Worker } 472*333d2b36SAndroid Build Coastguard Worker 473*333d2b36SAndroid Build Coastguard Worker // Make sure that the signature-patterns.csv is passed all the appropriate package properties 474*333d2b36SAndroid Build Coastguard Worker // from the bootclasspath_fragment and its contents. 475*333d2b36SAndroid Build Coastguard Worker fragment := result.ModuleForTests("mybootclasspathfragment", "android_common") 476*333d2b36SAndroid Build Coastguard Worker rule := fragment.Output("modular-hiddenapi/signature-patterns.csv") 477*333d2b36SAndroid Build Coastguard Worker expectedCommand := strings.Join([]string{ 478*333d2b36SAndroid Build Coastguard Worker "--split-package newlibrary", 479*333d2b36SAndroid Build Coastguard Worker "--split-package sdklibrary", 480*333d2b36SAndroid Build Coastguard Worker "--package-prefix newlibrary.all.mine", 481*333d2b36SAndroid Build Coastguard Worker "--package-prefix sdklibrary.all.mine", 482*333d2b36SAndroid Build Coastguard Worker "--single-package newlibrary.mine", 483*333d2b36SAndroid Build Coastguard Worker "--single-package sdklibrary", 484*333d2b36SAndroid Build Coastguard Worker }, " ") 485*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "signature patterns command", rule.RuleParams.Command, expectedCommand) 486*333d2b36SAndroid Build Coastguard Worker} 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragment_Test(t *testing.T) { 489*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 490*333d2b36SAndroid Build Coastguard Worker prepareForTestWithBootclasspathFragment, 491*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithJavaSdkLibraryFiles, 492*333d2b36SAndroid Build Coastguard Worker FixtureWithLastReleaseApis("mysdklibrary"), 493*333d2b36SAndroid Build Coastguard Worker ).RunTestWithBp(t, ` 494*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 495*333d2b36SAndroid Build Coastguard Worker name: "myfragment", 496*333d2b36SAndroid Build Coastguard Worker contents: ["mysdklibrary"], 497*333d2b36SAndroid Build Coastguard Worker hidden_api: { 498*333d2b36SAndroid Build Coastguard Worker split_packages: [], 499*333d2b36SAndroid Build Coastguard Worker }, 500*333d2b36SAndroid Build Coastguard Worker } 501*333d2b36SAndroid Build Coastguard Worker 502*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment_test { 503*333d2b36SAndroid Build Coastguard Worker name: "a_test_fragment", 504*333d2b36SAndroid Build Coastguard Worker contents: ["mysdklibrary"], 505*333d2b36SAndroid Build Coastguard Worker hidden_api: { 506*333d2b36SAndroid Build Coastguard Worker split_packages: [], 507*333d2b36SAndroid Build Coastguard Worker }, 508*333d2b36SAndroid Build Coastguard Worker } 509*333d2b36SAndroid Build Coastguard Worker 510*333d2b36SAndroid Build Coastguard Worker 511*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 512*333d2b36SAndroid Build Coastguard Worker name: "mysdklibrary", 513*333d2b36SAndroid Build Coastguard Worker srcs: ["a.java"], 514*333d2b36SAndroid Build Coastguard Worker shared_library: false, 515*333d2b36SAndroid Build Coastguard Worker public: {enabled: true}, 516*333d2b36SAndroid Build Coastguard Worker system: {enabled: true}, 517*333d2b36SAndroid Build Coastguard Worker } 518*333d2b36SAndroid Build Coastguard Worker `) 519*333d2b36SAndroid Build Coastguard Worker 520*333d2b36SAndroid Build Coastguard Worker fragment := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule) 521*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "not a test fragment", false, fragment.isTestFragment()) 522*333d2b36SAndroid Build Coastguard Worker 523*333d2b36SAndroid Build Coastguard Worker fragment = result.Module("a_test_fragment", "android_common").(*BootclasspathFragmentModule) 524*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "is a test fragment by type", true, fragment.isTestFragment()) 525*333d2b36SAndroid Build Coastguard Worker} 526