xref: /aosp_15_r20/build/soong/apex/classpath_element_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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