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 apex 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "reflect" 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/java" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker// Contains tests for java.CreateClasspathElements logic from java/classpath_element.go that 26*333d2b36SAndroid Build Coastguard Worker// requires apexes. 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker// testClasspathElementContext is a ClasspathElementContext suitable for use in tests. 29*333d2b36SAndroid Build Coastguard Workertype testClasspathElementContext struct { 30*333d2b36SAndroid Build Coastguard Worker android.OtherModuleProviderContext 31*333d2b36SAndroid Build Coastguard Worker testContext *android.TestContext 32*333d2b36SAndroid Build Coastguard Worker module android.Module 33*333d2b36SAndroid Build Coastguard Worker errs []error 34*333d2b36SAndroid Build Coastguard Worker} 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Workerfunc (t *testClasspathElementContext) ModuleErrorf(fmt string, args ...interface{}) { 37*333d2b36SAndroid Build Coastguard Worker t.errs = append(t.errs, t.testContext.ModuleErrorf(t.module, fmt, args...)) 38*333d2b36SAndroid Build Coastguard Worker} 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Workervar _ java.ClasspathElementContext = (*testClasspathElementContext)(nil) 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workerfunc TestCreateClasspathElements(t *testing.T) { 43*333d2b36SAndroid Build Coastguard Worker t.Parallel() 44*333d2b36SAndroid Build Coastguard Worker preparer := android.GroupFixturePreparers( 45*333d2b36SAndroid Build Coastguard Worker prepareForTestWithPlatformBootclasspath, 46*333d2b36SAndroid Build Coastguard Worker prepareForTestWithArtApex, 47*333d2b36SAndroid Build Coastguard Worker prepareForTestWithMyapex, 48*333d2b36SAndroid Build Coastguard Worker prepareForTestWithOtherapex, 49*333d2b36SAndroid Build Coastguard Worker java.PrepareForTestWithJavaSdkLibraryFiles, 50*333d2b36SAndroid Build Coastguard Worker java.FixtureWithLastReleaseApis("foo", "othersdklibrary"), 51*333d2b36SAndroid Build Coastguard Worker java.FixtureConfigureApexBootJars("myapex:bar"), 52*333d2b36SAndroid Build Coastguard Worker android.FixtureWithRootAndroidBp(` 53*333d2b36SAndroid Build Coastguard Worker apex { 54*333d2b36SAndroid Build Coastguard Worker name: "com.android.art", 55*333d2b36SAndroid Build Coastguard Worker key: "com.android.art.key", 56*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: [ 57*333d2b36SAndroid Build Coastguard Worker "art-bootclasspath-fragment", 58*333d2b36SAndroid Build Coastguard Worker ], 59*333d2b36SAndroid Build Coastguard Worker java_libs: [ 60*333d2b36SAndroid Build Coastguard Worker "othersdklibrary", 61*333d2b36SAndroid Build Coastguard Worker ], 62*333d2b36SAndroid Build Coastguard Worker updatable: false, 63*333d2b36SAndroid Build Coastguard Worker } 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker apex_key { 66*333d2b36SAndroid Build Coastguard Worker name: "com.android.art.key", 67*333d2b36SAndroid Build Coastguard Worker public_key: "com.android.art.avbpubkey", 68*333d2b36SAndroid Build Coastguard Worker private_key: "com.android.art.pem", 69*333d2b36SAndroid Build Coastguard Worker } 70*333d2b36SAndroid Build Coastguard Worker 71*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 72*333d2b36SAndroid Build Coastguard Worker name: "art-bootclasspath-fragment", 73*333d2b36SAndroid Build Coastguard Worker image_name: "art", 74*333d2b36SAndroid Build Coastguard Worker apex_available: [ 75*333d2b36SAndroid Build Coastguard Worker "com.android.art", 76*333d2b36SAndroid Build Coastguard Worker ], 77*333d2b36SAndroid Build Coastguard Worker contents: [ 78*333d2b36SAndroid Build Coastguard Worker "baz", 79*333d2b36SAndroid Build Coastguard Worker "quuz", 80*333d2b36SAndroid Build Coastguard Worker ], 81*333d2b36SAndroid Build Coastguard Worker hidden_api: { 82*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 83*333d2b36SAndroid Build Coastguard Worker }, 84*333d2b36SAndroid Build Coastguard Worker } 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Worker java_library { 87*333d2b36SAndroid Build Coastguard Worker name: "baz", 88*333d2b36SAndroid Build Coastguard Worker apex_available: [ 89*333d2b36SAndroid Build Coastguard Worker "com.android.art", 90*333d2b36SAndroid Build Coastguard Worker ], 91*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 92*333d2b36SAndroid Build Coastguard Worker installable: true, 93*333d2b36SAndroid Build Coastguard Worker sdk_version: "core_current", 94*333d2b36SAndroid Build Coastguard Worker } 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker java_library { 97*333d2b36SAndroid Build Coastguard Worker name: "quuz", 98*333d2b36SAndroid Build Coastguard Worker apex_available: [ 99*333d2b36SAndroid Build Coastguard Worker "com.android.art", 100*333d2b36SAndroid Build Coastguard Worker ], 101*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 102*333d2b36SAndroid Build Coastguard Worker installable: true, 103*333d2b36SAndroid Build Coastguard Worker } 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Worker apex { 106*333d2b36SAndroid Build Coastguard Worker name: "myapex", 107*333d2b36SAndroid Build Coastguard Worker key: "myapex.key", 108*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragments: [ 109*333d2b36SAndroid Build Coastguard Worker "mybootclasspath-fragment", 110*333d2b36SAndroid Build Coastguard Worker ], 111*333d2b36SAndroid Build Coastguard Worker java_libs: [ 112*333d2b36SAndroid Build Coastguard Worker "othersdklibrary", 113*333d2b36SAndroid Build Coastguard Worker ], 114*333d2b36SAndroid Build Coastguard Worker updatable: false, 115*333d2b36SAndroid Build Coastguard Worker } 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker apex_key { 118*333d2b36SAndroid Build Coastguard Worker name: "myapex.key", 119*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 120*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 121*333d2b36SAndroid Build Coastguard Worker } 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Worker bootclasspath_fragment { 124*333d2b36SAndroid Build Coastguard Worker name: "mybootclasspath-fragment", 125*333d2b36SAndroid Build Coastguard Worker apex_available: [ 126*333d2b36SAndroid Build Coastguard Worker "myapex", 127*333d2b36SAndroid Build Coastguard Worker ], 128*333d2b36SAndroid Build Coastguard Worker contents: [ 129*333d2b36SAndroid Build Coastguard Worker "bar", 130*333d2b36SAndroid Build Coastguard Worker ], 131*333d2b36SAndroid Build Coastguard Worker hidden_api: { 132*333d2b36SAndroid Build Coastguard Worker split_packages: ["*"], 133*333d2b36SAndroid Build Coastguard Worker }, 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker java_library { 137*333d2b36SAndroid Build Coastguard Worker name: "bar", 138*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 139*333d2b36SAndroid Build Coastguard Worker installable: true, 140*333d2b36SAndroid Build Coastguard Worker apex_available: ["myapex"], 141*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["bar"], 142*333d2b36SAndroid Build Coastguard Worker } 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 145*333d2b36SAndroid Build Coastguard Worker name: "foo", 146*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Worker java_sdk_library { 150*333d2b36SAndroid Build Coastguard Worker name: "othersdklibrary", 151*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 152*333d2b36SAndroid Build Coastguard Worker shared_library: false, 153*333d2b36SAndroid Build Coastguard Worker apex_available: [ 154*333d2b36SAndroid Build Coastguard Worker "com.android.art", 155*333d2b36SAndroid Build Coastguard Worker "myapex", 156*333d2b36SAndroid Build Coastguard Worker ], 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker apex { 160*333d2b36SAndroid Build Coastguard Worker name: "otherapex", 161*333d2b36SAndroid Build Coastguard Worker key: "otherapex.key", 162*333d2b36SAndroid Build Coastguard Worker java_libs: [ 163*333d2b36SAndroid Build Coastguard Worker "otherapexlibrary", 164*333d2b36SAndroid Build Coastguard Worker ], 165*333d2b36SAndroid Build Coastguard Worker updatable: false, 166*333d2b36SAndroid Build Coastguard Worker } 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Worker apex_key { 169*333d2b36SAndroid Build Coastguard Worker name: "otherapex.key", 170*333d2b36SAndroid Build Coastguard Worker public_key: "testkey.avbpubkey", 171*333d2b36SAndroid Build Coastguard Worker private_key: "testkey.pem", 172*333d2b36SAndroid Build Coastguard Worker } 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Worker java_library { 175*333d2b36SAndroid Build Coastguard Worker name: "otherapexlibrary", 176*333d2b36SAndroid Build Coastguard Worker srcs: ["b.java"], 177*333d2b36SAndroid Build Coastguard Worker installable: true, 178*333d2b36SAndroid Build Coastguard Worker apex_available: ["otherapex"], 179*333d2b36SAndroid Build Coastguard Worker permitted_packages: ["otherapexlibrary"], 180*333d2b36SAndroid Build Coastguard Worker } 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Worker platform_bootclasspath { 183*333d2b36SAndroid Build Coastguard Worker name: "myplatform-bootclasspath", 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Worker fragments: [ 186*333d2b36SAndroid Build Coastguard Worker { 187*333d2b36SAndroid Build Coastguard Worker apex: "com.android.art", 188*333d2b36SAndroid Build Coastguard Worker module: "art-bootclasspath-fragment", 189*333d2b36SAndroid Build Coastguard Worker }, 190*333d2b36SAndroid Build Coastguard Worker { 191*333d2b36SAndroid Build Coastguard Worker apex: "myapex", 192*333d2b36SAndroid Build Coastguard Worker module: "mybootclasspath-fragment", 193*333d2b36SAndroid Build Coastguard Worker }, 194*333d2b36SAndroid Build Coastguard Worker ], 195*333d2b36SAndroid Build Coastguard Worker } 196*333d2b36SAndroid Build Coastguard Worker `), 197*333d2b36SAndroid Build Coastguard Worker ) 198*333d2b36SAndroid Build Coastguard Worker 199*333d2b36SAndroid Build Coastguard Worker result := preparer.RunTest(t) 200*333d2b36SAndroid Build Coastguard Worker 201*333d2b36SAndroid Build Coastguard Worker artFragment := result.Module("art-bootclasspath-fragment", "android_common_apex10000") 202*333d2b36SAndroid Build Coastguard Worker artBaz := result.Module("baz", "android_common_apex10000") 203*333d2b36SAndroid Build Coastguard Worker artQuuz := result.Module("quuz", "android_common_apex10000") 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Worker myFragment := result.Module("mybootclasspath-fragment", "android_common_apex10000") 206*333d2b36SAndroid Build Coastguard Worker myBar := result.Module("bar", "android_common_apex10000") 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Worker other := result.Module("othersdklibrary", "android_common_apex10000") 209*333d2b36SAndroid Build Coastguard Worker 210*333d2b36SAndroid Build Coastguard Worker otherApexLibrary := result.Module("otherapexlibrary", "android_common_apex10000") 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Worker platformFoo := result.Module("quuz", "android_common") 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker bootclasspath := result.Module("myplatform-bootclasspath", "android_common") 215*333d2b36SAndroid Build Coastguard Worker 216*333d2b36SAndroid Build Coastguard Worker // Use a custom assertion method instead of AssertDeepEquals as the latter formats the output 217*333d2b36SAndroid Build Coastguard Worker // using %#v which results in meaningless output as ClasspathElements are pointers. 218*333d2b36SAndroid Build Coastguard Worker assertElementsEquals := func(t *testing.T, message string, expected, actual java.ClasspathElements) { 219*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, actual) { 220*333d2b36SAndroid Build Coastguard Worker t.Errorf("%s: expected:\n %s\n got:\n %s", message, expected, actual) 221*333d2b36SAndroid Build Coastguard Worker } 222*333d2b36SAndroid Build Coastguard Worker } 223*333d2b36SAndroid Build Coastguard Worker 224*333d2b36SAndroid Build Coastguard Worker expectFragmentElement := func(module android.Module, contents ...android.Module) java.ClasspathElement { 225*333d2b36SAndroid Build Coastguard Worker return &java.ClasspathFragmentElement{module, contents} 226*333d2b36SAndroid Build Coastguard Worker } 227*333d2b36SAndroid Build Coastguard Worker expectLibraryElement := func(module android.Module) java.ClasspathElement { 228*333d2b36SAndroid Build Coastguard Worker return &java.ClasspathLibraryElement{module} 229*333d2b36SAndroid Build Coastguard Worker } 230*333d2b36SAndroid Build Coastguard Worker 231*333d2b36SAndroid Build Coastguard Worker newCtx := func() *testClasspathElementContext { 232*333d2b36SAndroid Build Coastguard Worker return &testClasspathElementContext{ 233*333d2b36SAndroid Build Coastguard Worker OtherModuleProviderContext: result.TestContext.OtherModuleProviderAdaptor(), 234*333d2b36SAndroid Build Coastguard Worker testContext: result.TestContext, 235*333d2b36SAndroid Build Coastguard Worker module: bootclasspath, 236*333d2b36SAndroid Build Coastguard Worker } 237*333d2b36SAndroid Build Coastguard Worker } 238*333d2b36SAndroid Build Coastguard Worker 239*333d2b36SAndroid Build Coastguard Worker // Verify that CreateClasspathElements works when given valid input. 240*333d2b36SAndroid Build Coastguard Worker t.Run("art:baz, art:quuz, my:bar, foo", func(t *testing.T) { 241*333d2b36SAndroid Build Coastguard Worker t.Parallel() 242*333d2b36SAndroid Build Coastguard Worker ctx := newCtx() 243*333d2b36SAndroid Build Coastguard Worker elements := java.CreateClasspathElements(ctx, []android.Module{artBaz, artQuuz, myBar, platformFoo}, []android.Module{artFragment, myFragment}) 244*333d2b36SAndroid Build Coastguard Worker expectedElements := java.ClasspathElements{ 245*333d2b36SAndroid Build Coastguard Worker expectFragmentElement(artFragment, artBaz, artQuuz), 246*333d2b36SAndroid Build Coastguard Worker expectFragmentElement(myFragment, myBar), 247*333d2b36SAndroid Build Coastguard Worker expectLibraryElement(platformFoo), 248*333d2b36SAndroid Build Coastguard Worker } 249*333d2b36SAndroid Build Coastguard Worker assertElementsEquals(t, "elements", expectedElements, elements) 250*333d2b36SAndroid Build Coastguard Worker }) 251*333d2b36SAndroid Build Coastguard Worker 252*333d2b36SAndroid Build Coastguard Worker // Verify that CreateClasspathElements detects when an apex has multiple fragments. 253*333d2b36SAndroid Build Coastguard Worker t.Run("multiple fragments for same apex", func(t *testing.T) { 254*333d2b36SAndroid Build Coastguard Worker t.Parallel() 255*333d2b36SAndroid Build Coastguard Worker ctx := newCtx() 256*333d2b36SAndroid Build Coastguard Worker elements := java.CreateClasspathElements(ctx, []android.Module{}, []android.Module{artFragment, artFragment}) 257*333d2b36SAndroid Build Coastguard Worker android.FailIfNoMatchingErrors(t, "apex com.android.art has multiple fragments, art-bootclasspath-fragment{.*} and art-bootclasspath-fragment{.*}", ctx.errs) 258*333d2b36SAndroid Build Coastguard Worker expectedElements := java.ClasspathElements{} 259*333d2b36SAndroid Build Coastguard Worker assertElementsEquals(t, "elements", expectedElements, elements) 260*333d2b36SAndroid Build Coastguard Worker }) 261*333d2b36SAndroid Build Coastguard Worker 262*333d2b36SAndroid Build Coastguard Worker // Verify that CreateClasspathElements detects when a library is in multiple fragments. 263*333d2b36SAndroid Build Coastguard Worker t.Run("library from multiple fragments", func(t *testing.T) { 264*333d2b36SAndroid Build Coastguard Worker t.Parallel() 265*333d2b36SAndroid Build Coastguard Worker ctx := newCtx() 266*333d2b36SAndroid Build Coastguard Worker elements := java.CreateClasspathElements(ctx, []android.Module{other}, []android.Module{artFragment, myFragment}) 267*333d2b36SAndroid Build Coastguard Worker android.FailIfNoMatchingErrors(t, "library othersdklibrary{.*} is in two separate fragments, art-bootclasspath-fragment{.*} and mybootclasspath-fragment{.*}", ctx.errs) 268*333d2b36SAndroid Build Coastguard Worker expectedElements := java.ClasspathElements{} 269*333d2b36SAndroid Build Coastguard Worker assertElementsEquals(t, "elements", expectedElements, elements) 270*333d2b36SAndroid Build Coastguard Worker }) 271*333d2b36SAndroid Build Coastguard Worker 272*333d2b36SAndroid Build Coastguard Worker // Verify that CreateClasspathElements detects when a fragment's contents are not contiguous and 273*333d2b36SAndroid Build Coastguard Worker // are separated by a library from another fragment. 274*333d2b36SAndroid Build Coastguard Worker t.Run("discontiguous separated by fragment", func(t *testing.T) { 275*333d2b36SAndroid Build Coastguard Worker t.Parallel() 276*333d2b36SAndroid Build Coastguard Worker ctx := newCtx() 277*333d2b36SAndroid Build Coastguard Worker elements := java.CreateClasspathElements(ctx, []android.Module{artBaz, myBar, artQuuz, platformFoo}, []android.Module{artFragment, myFragment}) 278*333d2b36SAndroid Build Coastguard Worker expectedElements := java.ClasspathElements{ 279*333d2b36SAndroid Build Coastguard Worker expectFragmentElement(artFragment, artBaz, artQuuz), 280*333d2b36SAndroid Build Coastguard Worker expectFragmentElement(myFragment, myBar), 281*333d2b36SAndroid Build Coastguard Worker expectLibraryElement(platformFoo), 282*333d2b36SAndroid Build Coastguard Worker } 283*333d2b36SAndroid Build Coastguard Worker assertElementsEquals(t, "elements", expectedElements, elements) 284*333d2b36SAndroid Build Coastguard Worker android.FailIfNoMatchingErrors(t, "libraries from the same fragment must be contiguous, however baz{.*} and quuz{os:android,arch:common,apex:apex10000} from fragment art-bootclasspath-fragment{.*} are separated by libraries from fragment mybootclasspath-fragment{.*} like bar{.*}", ctx.errs) 285*333d2b36SAndroid Build Coastguard Worker }) 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Worker // Verify that CreateClasspathElements detects when a fragment's contents are not contiguous and 288*333d2b36SAndroid Build Coastguard Worker // are separated by a standalone library. 289*333d2b36SAndroid Build Coastguard Worker t.Run("discontiguous separated by library", func(t *testing.T) { 290*333d2b36SAndroid Build Coastguard Worker t.Parallel() 291*333d2b36SAndroid Build Coastguard Worker ctx := newCtx() 292*333d2b36SAndroid Build Coastguard Worker elements := java.CreateClasspathElements(ctx, []android.Module{artBaz, platformFoo, artQuuz, myBar}, []android.Module{artFragment, myFragment}) 293*333d2b36SAndroid Build Coastguard Worker expectedElements := java.ClasspathElements{ 294*333d2b36SAndroid Build Coastguard Worker expectFragmentElement(artFragment, artBaz, artQuuz), 295*333d2b36SAndroid Build Coastguard Worker expectLibraryElement(platformFoo), 296*333d2b36SAndroid Build Coastguard Worker expectFragmentElement(myFragment, myBar), 297*333d2b36SAndroid Build Coastguard Worker } 298*333d2b36SAndroid Build Coastguard Worker assertElementsEquals(t, "elements", expectedElements, elements) 299*333d2b36SAndroid Build Coastguard Worker android.FailIfNoMatchingErrors(t, "libraries from the same fragment must be contiguous, however baz{.*} and quuz{os:android,arch:common,apex:apex10000} from fragment art-bootclasspath-fragment{.*} are separated by library quuz{.*}", ctx.errs) 300*333d2b36SAndroid Build Coastguard Worker }) 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Worker // Verify that CreateClasspathElements detects when there a library on the classpath that 303*333d2b36SAndroid Build Coastguard Worker // indicates it is from an apex the supplied fragments list does not contain a fragment for that 304*333d2b36SAndroid Build Coastguard Worker // apex. 305*333d2b36SAndroid Build Coastguard Worker t.Run("no fragment for apex", func(t *testing.T) { 306*333d2b36SAndroid Build Coastguard Worker t.Parallel() 307*333d2b36SAndroid Build Coastguard Worker ctx := newCtx() 308*333d2b36SAndroid Build Coastguard Worker elements := java.CreateClasspathElements(ctx, []android.Module{artBaz, otherApexLibrary}, []android.Module{artFragment}) 309*333d2b36SAndroid Build Coastguard Worker expectedElements := java.ClasspathElements{ 310*333d2b36SAndroid Build Coastguard Worker expectFragmentElement(artFragment, artBaz), 311*333d2b36SAndroid Build Coastguard Worker } 312*333d2b36SAndroid Build Coastguard Worker assertElementsEquals(t, "elements", expectedElements, elements) 313*333d2b36SAndroid Build Coastguard Worker android.FailIfNoMatchingErrors(t, `library otherapexlibrary{.*} is from apexes \[otherapex\] which have no corresponding fragment in \[art-bootclasspath-fragment{.*}\]`, ctx.errs) 314*333d2b36SAndroid Build Coastguard Worker }) 315*333d2b36SAndroid Build Coastguard Worker} 316