xref: /aosp_15_r20/build/soong/java/sdk_library_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 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	"regexp"
21*333d2b36SAndroid Build Coastguard Worker	"strings"
22*333d2b36SAndroid Build Coastguard Worker	"testing"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary(t *testing.T) {
28*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
29*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
30*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
31*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
32*333d2b36SAndroid Build Coastguard Worker			"28": {"foo"},
33*333d2b36SAndroid Build Coastguard Worker			"29": {"foo"},
34*333d2b36SAndroid Build Coastguard Worker			"30": {"bar", "barney", "baz", "betty", "foo", "fred", "quuz", "wilma"},
35*333d2b36SAndroid Build Coastguard Worker		}),
36*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
37*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
38*333d2b36SAndroid Build Coastguard Worker		droiddoc_exported_dir {
39*333d2b36SAndroid Build Coastguard Worker			name: "droiddoc-templates-sdk",
40*333d2b36SAndroid Build Coastguard Worker			path: ".",
41*333d2b36SAndroid Build Coastguard Worker		}
42*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
43*333d2b36SAndroid Build Coastguard Worker			name: "foo",
44*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
45*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
46*333d2b36SAndroid Build Coastguard Worker		}
47*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
48*333d2b36SAndroid Build Coastguard Worker			name: "bar",
49*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
50*333d2b36SAndroid Build Coastguard Worker			api_packages: ["bar"],
51*333d2b36SAndroid Build Coastguard Worker			exclude_kotlinc_generated_files: true,
52*333d2b36SAndroid Build Coastguard Worker		}
53*333d2b36SAndroid Build Coastguard Worker		java_library {
54*333d2b36SAndroid Build Coastguard Worker			name: "baz",
55*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
56*333d2b36SAndroid Build Coastguard Worker			libs: ["foo.stubs.system", "bar.stubs"],
57*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
58*333d2b36SAndroid Build Coastguard Worker		}
59*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
60*333d2b36SAndroid Build Coastguard Worker			name: "barney",
61*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
62*333d2b36SAndroid Build Coastguard Worker			api_only: true,
63*333d2b36SAndroid Build Coastguard Worker		}
64*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
65*333d2b36SAndroid Build Coastguard Worker			name: "betty",
66*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
67*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
68*333d2b36SAndroid Build Coastguard Worker		}
69*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
70*333d2b36SAndroid Build Coastguard Worker		    name: "quuz",
71*333d2b36SAndroid Build Coastguard Worker				public: {
72*333d2b36SAndroid Build Coastguard Worker					jars: ["c.jar"],
73*333d2b36SAndroid Build Coastguard Worker					current_api: "api/current.txt",
74*333d2b36SAndroid Build Coastguard Worker					removed_api: "api/removed.txt",
75*333d2b36SAndroid Build Coastguard Worker				},
76*333d2b36SAndroid Build Coastguard Worker		}
77*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
78*333d2b36SAndroid Build Coastguard Worker		    name: "fred",
79*333d2b36SAndroid Build Coastguard Worker				public: {
80*333d2b36SAndroid Build Coastguard Worker					jars: ["b.jar"],
81*333d2b36SAndroid Build Coastguard Worker				},
82*333d2b36SAndroid Build Coastguard Worker		}
83*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
84*333d2b36SAndroid Build Coastguard Worker		    name: "wilma",
85*333d2b36SAndroid Build Coastguard Worker				public: {
86*333d2b36SAndroid Build Coastguard Worker					jars: ["b.jar"],
87*333d2b36SAndroid Build Coastguard Worker				},
88*333d2b36SAndroid Build Coastguard Worker				shared_library: false,
89*333d2b36SAndroid Build Coastguard Worker		}
90*333d2b36SAndroid Build Coastguard Worker		java_library {
91*333d2b36SAndroid Build Coastguard Worker		    name: "qux",
92*333d2b36SAndroid Build Coastguard Worker		    srcs: ["c.java"],
93*333d2b36SAndroid Build Coastguard Worker		    libs: ["baz", "fred.stubs", "quuz.stubs", "wilma.stubs", "barney.stubs.system", "betty.stubs.system"],
94*333d2b36SAndroid Build Coastguard Worker		    sdk_version: "system_current",
95*333d2b36SAndroid Build Coastguard Worker		}
96*333d2b36SAndroid Build Coastguard Worker		java_library {
97*333d2b36SAndroid Build Coastguard Worker			name: "baz-test",
98*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
99*333d2b36SAndroid Build Coastguard Worker			libs: ["foo.stubs.test"],
100*333d2b36SAndroid Build Coastguard Worker			sdk_version: "test_current",
101*333d2b36SAndroid Build Coastguard Worker		}
102*333d2b36SAndroid Build Coastguard Worker		java_library {
103*333d2b36SAndroid Build Coastguard Worker			name: "baz-29",
104*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
105*333d2b36SAndroid Build Coastguard Worker			libs: ["sdk_system_29_foo"],
106*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_29",
107*333d2b36SAndroid Build Coastguard Worker		}
108*333d2b36SAndroid Build Coastguard Worker		java_library {
109*333d2b36SAndroid Build Coastguard Worker			name: "baz-module-30",
110*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
111*333d2b36SAndroid Build Coastguard Worker			libs: ["sdk_module-lib_30_foo"],
112*333d2b36SAndroid Build Coastguard Worker			sdk_version: "module_30",
113*333d2b36SAndroid Build Coastguard Worker		}
114*333d2b36SAndroid Build Coastguard Worker	`)
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Worker	// check the existence of the internal modules
117*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
118*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
119*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
120*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
121*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
122*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
123*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
124*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "")
125*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopePublic.apiLibraryModuleName("foo"), "android_common")
126*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
127*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests("foo.api.public.28", "")
128*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests("foo.api.system.28", "")
129*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests("foo.api.test.28", "")
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Worker	exportedComponentsInfo, _ := android.OtherModuleProvider(result, foo.Module(), android.ExportedComponentsInfoProvider)
132*333d2b36SAndroid Build Coastguard Worker	expectedFooExportedComponents := []string{
133*333d2b36SAndroid Build Coastguard Worker		"foo-removed.api.combined.public.latest",
134*333d2b36SAndroid Build Coastguard Worker		"foo-removed.api.combined.system.latest",
135*333d2b36SAndroid Build Coastguard Worker		"foo.api.combined.public.latest",
136*333d2b36SAndroid Build Coastguard Worker		"foo.api.combined.system.latest",
137*333d2b36SAndroid Build Coastguard Worker		"foo.stubs",
138*333d2b36SAndroid Build Coastguard Worker		"foo.stubs.exportable",
139*333d2b36SAndroid Build Coastguard Worker		"foo.stubs.exportable.system",
140*333d2b36SAndroid Build Coastguard Worker		"foo.stubs.exportable.test",
141*333d2b36SAndroid Build Coastguard Worker		"foo.stubs.source",
142*333d2b36SAndroid Build Coastguard Worker		"foo.stubs.source.system",
143*333d2b36SAndroid Build Coastguard Worker		"foo.stubs.source.test",
144*333d2b36SAndroid Build Coastguard Worker		"foo.stubs.system",
145*333d2b36SAndroid Build Coastguard Worker		"foo.stubs.test",
146*333d2b36SAndroid Build Coastguard Worker	}
147*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard Worker	bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
150*333d2b36SAndroid Build Coastguard Worker	// tests if baz is actually linked to the stubs lib
151*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
152*333d2b36SAndroid Build Coastguard Worker	// ... and not to the impl lib
153*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
154*333d2b36SAndroid Build Coastguard Worker	// test if baz is not linked to the system variant of foo
155*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Worker	bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
158*333d2b36SAndroid Build Coastguard Worker	// tests if baz-test is actually linked to the test stubs lib
159*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Worker	baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
162*333d2b36SAndroid Build Coastguard Worker	// tests if baz-29 is actually linked to the system 29 stubs lib
163*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/sdk_system_29_foo/android_common/combined/sdk_system_29_foo.jar")
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Worker	bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
166*333d2b36SAndroid Build Coastguard Worker	// tests if "baz-module-30" is actually linked to the module 30 stubs lib
167*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/sdk_module-lib_30_foo/android_common/combined/sdk_module-lib_30_foo.jar")
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker	// test if baz has exported SDK lib names foo and bar to qux
170*333d2b36SAndroid Build Coastguard Worker	qux := result.ModuleForTests("qux", "android_common")
171*333d2b36SAndroid Build Coastguard Worker	if quxLib, ok := qux.Module().(*Library); ok {
172*333d2b36SAndroid Build Coastguard Worker		requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
173*333d2b36SAndroid Build Coastguard Worker		android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
174*333d2b36SAndroid Build Coastguard Worker		android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
175*333d2b36SAndroid Build Coastguard Worker	}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker	// test if quuz have created the api_contribution module
178*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "")
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Worker	fooImplDexJar := result.ModuleForTests("foo.impl", "android_common").Rule("d8")
181*333d2b36SAndroid Build Coastguard Worker	// tests if kotlinc generated files are NOT excluded from output of foo.impl.
182*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "foo.impl dex", fooImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
183*333d2b36SAndroid Build Coastguard Worker
184*333d2b36SAndroid Build Coastguard Worker	barImplDexJar := result.ModuleForTests("bar.impl", "android_common").Rule("d8")
185*333d2b36SAndroid Build Coastguard Worker	// tests if kotlinc generated files are excluded from output of bar.impl.
186*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "bar.impl dex", barImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
187*333d2b36SAndroid Build Coastguard Worker}
188*333d2b36SAndroid Build Coastguard Worker
189*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
190*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
191*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
192*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
193*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
194*333d2b36SAndroid Build Coastguard Worker			"28": {"foo"},
195*333d2b36SAndroid Build Coastguard Worker			"29": {"foo"},
196*333d2b36SAndroid Build Coastguard Worker			"30": {"foo", "fooUpdatable", "fooUpdatableErr"},
197*333d2b36SAndroid Build Coastguard Worker		}),
198*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
199*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V", "W", "X"}
200*333d2b36SAndroid Build Coastguard Worker		}),
201*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t,
202*333d2b36SAndroid Build Coastguard Worker		`
203*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
204*333d2b36SAndroid Build Coastguard Worker			name: "fooUpdatable",
205*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
206*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
207*333d2b36SAndroid Build Coastguard Worker			on_bootclasspath_since: "U",
208*333d2b36SAndroid Build Coastguard Worker			on_bootclasspath_before: "V",
209*333d2b36SAndroid Build Coastguard Worker			min_device_sdk: "W",
210*333d2b36SAndroid Build Coastguard Worker			max_device_sdk: "X",
211*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S",
212*333d2b36SAndroid Build Coastguard Worker		}
213*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
214*333d2b36SAndroid Build Coastguard Worker			name: "foo",
215*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
216*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
217*333d2b36SAndroid Build Coastguard Worker		}
218*333d2b36SAndroid Build Coastguard Worker`)
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Worker	// test that updatability attributes are passed on correctly
221*333d2b36SAndroid Build Coastguard Worker	fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Output("fooUpdatable.xml")
222*333d2b36SAndroid Build Coastguard Worker	fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable)
223*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-since="U"`)
224*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-before="V"`)
225*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `min-device-sdk="W"`)
226*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `max-device-sdk="X"`)
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Worker	// double check that updatability attributes are not written if they don't exist in the bp file
229*333d2b36SAndroid Build Coastguard Worker	// the permissions file for the foo library defined above
230*333d2b36SAndroid Build Coastguard Worker	fooPermissions := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml")
231*333d2b36SAndroid Build Coastguard Worker	fooPermissionsContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooPermissions)
232*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-since`)
233*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-before`)
234*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `min-device-sdk`)
235*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `max-device-sdk`)
236*333d2b36SAndroid Build Coastguard Worker}
237*333d2b36SAndroid Build Coastguard Worker
238*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
239*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
240*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
241*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
242*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
243*333d2b36SAndroid Build Coastguard Worker			"30": {"fooUpdatable", "fooUpdatableErr"},
244*333d2b36SAndroid Build Coastguard Worker		}),
245*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
246*333d2b36SAndroid Build Coastguard Worker		[]string{
247*333d2b36SAndroid Build Coastguard Worker			`on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
248*333d2b36SAndroid Build Coastguard Worker			`on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
249*333d2b36SAndroid Build Coastguard Worker			`min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
250*333d2b36SAndroid Build Coastguard Worker			`max_device_sdk: "current" is not an allowed value for this attribute`,
251*333d2b36SAndroid Build Coastguard Worker		})).RunTestWithBp(t,
252*333d2b36SAndroid Build Coastguard Worker		`
253*333d2b36SAndroid Build Coastguard Worker	java_sdk_library {
254*333d2b36SAndroid Build Coastguard Worker			name: "fooUpdatableErr",
255*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
256*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
257*333d2b36SAndroid Build Coastguard Worker			on_bootclasspath_since: "aaa",
258*333d2b36SAndroid Build Coastguard Worker			on_bootclasspath_before: "bbc",
259*333d2b36SAndroid Build Coastguard Worker			min_device_sdk: "ccc",
260*333d2b36SAndroid Build Coastguard Worker			max_device_sdk: "current",
261*333d2b36SAndroid Build Coastguard Worker		}
262*333d2b36SAndroid Build Coastguard Worker`)
263*333d2b36SAndroid Build Coastguard Worker}
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
266*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
267*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
268*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
269*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
270*333d2b36SAndroid Build Coastguard Worker			"28": {"foo"},
271*333d2b36SAndroid Build Coastguard Worker		}),
272*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
273*333d2b36SAndroid Build Coastguard Worker		[]string{
274*333d2b36SAndroid Build Coastguard Worker			"on_bootclasspath_since: Attribute value needs to be at least T",
275*333d2b36SAndroid Build Coastguard Worker			"on_bootclasspath_before: Attribute value needs to be at least T",
276*333d2b36SAndroid Build Coastguard Worker			"min_device_sdk: Attribute value needs to be at least T",
277*333d2b36SAndroid Build Coastguard Worker			"max_device_sdk: Attribute value needs to be at least T",
278*333d2b36SAndroid Build Coastguard Worker		},
279*333d2b36SAndroid Build Coastguard Worker	)).RunTestWithBp(t,
280*333d2b36SAndroid Build Coastguard Worker		`
281*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
282*333d2b36SAndroid Build Coastguard Worker			name: "foo",
283*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
284*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
285*333d2b36SAndroid Build Coastguard Worker			on_bootclasspath_since: "S",
286*333d2b36SAndroid Build Coastguard Worker			on_bootclasspath_before: "S",
287*333d2b36SAndroid Build Coastguard Worker			min_device_sdk: "S",
288*333d2b36SAndroid Build Coastguard Worker			max_device_sdk: "S",
289*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S",
290*333d2b36SAndroid Build Coastguard Worker		}
291*333d2b36SAndroid Build Coastguard Worker`)
292*333d2b36SAndroid Build Coastguard Worker}
293*333d2b36SAndroid Build Coastguard Worker
294*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
295*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
296*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
297*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
298*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
299*333d2b36SAndroid Build Coastguard Worker			"28": {"foo"},
300*333d2b36SAndroid Build Coastguard Worker		}),
301*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
302*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
303*333d2b36SAndroid Build Coastguard Worker		}),
304*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
305*333d2b36SAndroid Build Coastguard Worker		[]string{
306*333d2b36SAndroid Build Coastguard Worker			"min_device_sdk can't be greater than max_device_sdk",
307*333d2b36SAndroid Build Coastguard Worker		},
308*333d2b36SAndroid Build Coastguard Worker	)).RunTestWithBp(t,
309*333d2b36SAndroid Build Coastguard Worker		`
310*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
311*333d2b36SAndroid Build Coastguard Worker			name: "foo",
312*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
313*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
314*333d2b36SAndroid Build Coastguard Worker			min_device_sdk: "V",
315*333d2b36SAndroid Build Coastguard Worker			max_device_sdk: "U",
316*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S",
317*333d2b36SAndroid Build Coastguard Worker		}
318*333d2b36SAndroid Build Coastguard Worker`)
319*333d2b36SAndroid Build Coastguard Worker}
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
322*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
323*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
324*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
325*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
326*333d2b36SAndroid Build Coastguard Worker			"28": {"foo"},
327*333d2b36SAndroid Build Coastguard Worker		}),
328*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
329*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
330*333d2b36SAndroid Build Coastguard Worker		}),
331*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
332*333d2b36SAndroid Build Coastguard Worker		[]string{
333*333d2b36SAndroid Build Coastguard Worker			regexp.QuoteMeta("min_device_sdk: Can't be less than module's min sdk (V)"),
334*333d2b36SAndroid Build Coastguard Worker			regexp.QuoteMeta("max_device_sdk: Can't be less than module's min sdk (V)"),
335*333d2b36SAndroid Build Coastguard Worker		},
336*333d2b36SAndroid Build Coastguard Worker	)).RunTestWithBp(t,
337*333d2b36SAndroid Build Coastguard Worker		`
338*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
339*333d2b36SAndroid Build Coastguard Worker			name: "foo",
340*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
341*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
342*333d2b36SAndroid Build Coastguard Worker			min_device_sdk: "U",
343*333d2b36SAndroid Build Coastguard Worker			max_device_sdk: "U",
344*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "V",
345*333d2b36SAndroid Build Coastguard Worker		}
346*333d2b36SAndroid Build Coastguard Worker`)
347*333d2b36SAndroid Build Coastguard Worker}
348*333d2b36SAndroid Build Coastguard Worker
349*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) {
350*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
351*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
352*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
353*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
354*333d2b36SAndroid Build Coastguard Worker			"30": {"foo"},
355*333d2b36SAndroid Build Coastguard Worker		}),
356*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t,
357*333d2b36SAndroid Build Coastguard Worker		`
358*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
359*333d2b36SAndroid Build Coastguard Worker			name: "foo",
360*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
361*333d2b36SAndroid Build Coastguard Worker			min_device_sdk: "Tiramisu",
362*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "S",
363*333d2b36SAndroid Build Coastguard Worker		}
364*333d2b36SAndroid Build Coastguard Worker`)
365*333d2b36SAndroid Build Coastguard Worker	// test that updatability attributes are passed on correctly
366*333d2b36SAndroid Build Coastguard Worker	fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml")
367*333d2b36SAndroid Build Coastguard Worker	fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable)
368*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "foo.xml contents", fooUpdatableContents, `<apex-library`)
369*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "foo.xml contents", fooUpdatableContents, `<library`)
370*333d2b36SAndroid Build Coastguard Worker}
371*333d2b36SAndroid Build Coastguard Worker
372*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
373*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
374*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
375*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
376*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("sdklib"),
377*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
378*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
379*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
380*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
381*333d2b36SAndroid Build Coastguard Worker			libs: ["lib"],
382*333d2b36SAndroid Build Coastguard Worker			static_libs: ["static-lib"],
383*333d2b36SAndroid Build Coastguard Worker			impl_only_libs: ["impl-only-lib"],
384*333d2b36SAndroid Build Coastguard Worker			stub_only_libs: ["stub-only-lib"],
385*333d2b36SAndroid Build Coastguard Worker			stub_only_static_libs: ["stub-only-static-lib"],
386*333d2b36SAndroid Build Coastguard Worker		}
387*333d2b36SAndroid Build Coastguard Worker		java_defaults {
388*333d2b36SAndroid Build Coastguard Worker			name: "defaults",
389*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
390*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
391*333d2b36SAndroid Build Coastguard Worker		}
392*333d2b36SAndroid Build Coastguard Worker		java_library { name: "lib", defaults: ["defaults"] }
393*333d2b36SAndroid Build Coastguard Worker		java_library { name: "static-lib", defaults: ["defaults"] }
394*333d2b36SAndroid Build Coastguard Worker		java_library { name: "impl-only-lib", defaults: ["defaults"] }
395*333d2b36SAndroid Build Coastguard Worker		java_library { name: "stub-only-lib", defaults: ["defaults"] }
396*333d2b36SAndroid Build Coastguard Worker		java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
397*333d2b36SAndroid Build Coastguard Worker		`)
398*333d2b36SAndroid Build Coastguard Worker	var expectations = []struct {
399*333d2b36SAndroid Build Coastguard Worker		lib               string
400*333d2b36SAndroid Build Coastguard Worker		on_impl_classpath bool
401*333d2b36SAndroid Build Coastguard Worker		on_stub_classpath bool
402*333d2b36SAndroid Build Coastguard Worker		in_impl_combined  bool
403*333d2b36SAndroid Build Coastguard Worker		in_stub_combined  bool
404*333d2b36SAndroid Build Coastguard Worker	}{
405*333d2b36SAndroid Build Coastguard Worker		{lib: "lib", on_impl_classpath: true},
406*333d2b36SAndroid Build Coastguard Worker		{lib: "static-lib", in_impl_combined: true},
407*333d2b36SAndroid Build Coastguard Worker		{lib: "impl-only-lib", on_impl_classpath: true},
408*333d2b36SAndroid Build Coastguard Worker		{lib: "stub-only-lib", on_stub_classpath: true},
409*333d2b36SAndroid Build Coastguard Worker		{lib: "stub-only-static-lib", in_stub_combined: true},
410*333d2b36SAndroid Build Coastguard Worker	}
411*333d2b36SAndroid Build Coastguard Worker	verify := func(sdklib, dep string, cp, combined bool) {
412*333d2b36SAndroid Build Coastguard Worker		sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
413*333d2b36SAndroid Build Coastguard Worker		expected := cp || combined // Every combined jar is also on the classpath.
414*333d2b36SAndroid Build Coastguard Worker		android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
415*333d2b36SAndroid Build Coastguard Worker
416*333d2b36SAndroid Build Coastguard Worker		combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
417*333d2b36SAndroid Build Coastguard Worker		depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
418*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
419*333d2b36SAndroid Build Coastguard Worker	}
420*333d2b36SAndroid Build Coastguard Worker	for _, expectation := range expectations {
421*333d2b36SAndroid Build Coastguard Worker		verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
422*333d2b36SAndroid Build Coastguard Worker
423*333d2b36SAndroid Build Coastguard Worker		stubName := apiScopePublic.sourceStubsLibraryModuleName("sdklib")
424*333d2b36SAndroid Build Coastguard Worker		verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
425*333d2b36SAndroid Build Coastguard Worker	}
426*333d2b36SAndroid Build Coastguard Worker}
427*333d2b36SAndroid Build Coastguard Worker
428*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
429*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
430*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
431*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
432*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
433*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
434*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
435*333d2b36SAndroid Build Coastguard Worker			name: "foo",
436*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
437*333d2b36SAndroid Build Coastguard Worker			api_only: true,
438*333d2b36SAndroid Build Coastguard Worker			public: {
439*333d2b36SAndroid Build Coastguard Worker				enabled: true,
440*333d2b36SAndroid Build Coastguard Worker			},
441*333d2b36SAndroid Build Coastguard Worker		}
442*333d2b36SAndroid Build Coastguard Worker
443*333d2b36SAndroid Build Coastguard Worker		java_library {
444*333d2b36SAndroid Build Coastguard Worker			name: "bar",
445*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
446*333d2b36SAndroid Build Coastguard Worker			libs: ["foo.stubs"],
447*333d2b36SAndroid Build Coastguard Worker		}
448*333d2b36SAndroid Build Coastguard Worker		`)
449*333d2b36SAndroid Build Coastguard Worker
450*333d2b36SAndroid Build Coastguard Worker	// The bar library should depend on the stubs jar.
451*333d2b36SAndroid Build Coastguard Worker	barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
452*333d2b36SAndroid Build Coastguard Worker	if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
453*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected %q, found %#q", expected, actual)
454*333d2b36SAndroid Build Coastguard Worker	}
455*333d2b36SAndroid Build Coastguard Worker}
456*333d2b36SAndroid Build Coastguard Worker
457*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
458*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
459*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
460*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
461*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
462*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
463*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
464*333d2b36SAndroid Build Coastguard Worker			name: "foo",
465*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
466*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
467*333d2b36SAndroid Build Coastguard Worker			annotations_enabled: true,
468*333d2b36SAndroid Build Coastguard Worker			public: {
469*333d2b36SAndroid Build Coastguard Worker				enabled: true,
470*333d2b36SAndroid Build Coastguard Worker			},
471*333d2b36SAndroid Build Coastguard Worker		}
472*333d2b36SAndroid Build Coastguard Worker		java_library {
473*333d2b36SAndroid Build Coastguard Worker			name: "bar",
474*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java", ":foo{.public.stubs.source}"],
475*333d2b36SAndroid Build Coastguard Worker			java_resources: [":foo{.public.annotations.zip}"],
476*333d2b36SAndroid Build Coastguard Worker		}
477*333d2b36SAndroid Build Coastguard Worker		`)
478*333d2b36SAndroid Build Coastguard Worker}
479*333d2b36SAndroid Build Coastguard Worker
480*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
481*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
482*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
483*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
484*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
485*333d2b36SAndroid Build Coastguard Worker	).
486*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported module reference tag ".public.annotations.zip"`)).
487*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
488*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
489*333d2b36SAndroid Build Coastguard Worker			name: "foo",
490*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
491*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
492*333d2b36SAndroid Build Coastguard Worker			public: {
493*333d2b36SAndroid Build Coastguard Worker				enabled: true,
494*333d2b36SAndroid Build Coastguard Worker			},
495*333d2b36SAndroid Build Coastguard Worker		}
496*333d2b36SAndroid Build Coastguard Worker
497*333d2b36SAndroid Build Coastguard Worker		java_library {
498*333d2b36SAndroid Build Coastguard Worker			name: "bar",
499*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java", ":foo{.public.stubs.source}"],
500*333d2b36SAndroid Build Coastguard Worker			java_resources: [":foo{.public.annotations.zip}"],
501*333d2b36SAndroid Build Coastguard Worker		}
502*333d2b36SAndroid Build Coastguard Worker		`)
503*333d2b36SAndroid Build Coastguard Worker}
504*333d2b36SAndroid Build Coastguard Worker
505*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
506*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
507*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
508*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
509*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
510*333d2b36SAndroid Build Coastguard Worker	).
511*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported module reference tag ".system.stubs.source"`)).
512*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
513*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
514*333d2b36SAndroid Build Coastguard Worker			name: "foo",
515*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
516*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
517*333d2b36SAndroid Build Coastguard Worker			public: {
518*333d2b36SAndroid Build Coastguard Worker				enabled: true,
519*333d2b36SAndroid Build Coastguard Worker			},
520*333d2b36SAndroid Build Coastguard Worker		}
521*333d2b36SAndroid Build Coastguard Worker
522*333d2b36SAndroid Build Coastguard Worker		java_library {
523*333d2b36SAndroid Build Coastguard Worker			name: "bar",
524*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java", ":foo{.system.stubs.source}"],
525*333d2b36SAndroid Build Coastguard Worker		}
526*333d2b36SAndroid Build Coastguard Worker		`)
527*333d2b36SAndroid Build Coastguard Worker}
528*333d2b36SAndroid Build Coastguard Worker
529*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_Deps(t *testing.T) {
530*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
531*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
532*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
533*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("sdklib"),
534*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
535*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
536*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
537*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
538*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
539*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
540*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
541*333d2b36SAndroid Build Coastguard Worker			public: {
542*333d2b36SAndroid Build Coastguard Worker				enabled: true,
543*333d2b36SAndroid Build Coastguard Worker			},
544*333d2b36SAndroid Build Coastguard Worker		}
545*333d2b36SAndroid Build Coastguard Worker		`)
546*333d2b36SAndroid Build Coastguard Worker
547*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
548*333d2b36SAndroid Build Coastguard Worker		`dex2oatd`,
549*333d2b36SAndroid Build Coastguard Worker		`sdklib-removed.api.combined.public.latest`,
550*333d2b36SAndroid Build Coastguard Worker		`sdklib.api.combined.public.latest`,
551*333d2b36SAndroid Build Coastguard Worker		`sdklib.impl`,
552*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs`,
553*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs.exportable`,
554*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs.source`,
555*333d2b36SAndroid Build Coastguard Worker		`sdklib.xml`,
556*333d2b36SAndroid Build Coastguard Worker	})
557*333d2b36SAndroid Build Coastguard Worker}
558*333d2b36SAndroid Build Coastguard Worker
559*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
560*333d2b36SAndroid Build Coastguard Worker	prepareForJavaTest.RunTestWithBp(t, `
561*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
562*333d2b36SAndroid Build Coastguard Worker			name: "foo",
563*333d2b36SAndroid Build Coastguard Worker			public: {
564*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
565*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
566*333d2b36SAndroid Build Coastguard Worker				current_api: "api/current.txt",
567*333d2b36SAndroid Build Coastguard Worker				removed_api: "api/removed.txt",
568*333d2b36SAndroid Build Coastguard Worker				annotations: "x/annotations.zip",
569*333d2b36SAndroid Build Coastguard Worker			},
570*333d2b36SAndroid Build Coastguard Worker		}
571*333d2b36SAndroid Build Coastguard Worker
572*333d2b36SAndroid Build Coastguard Worker		java_library {
573*333d2b36SAndroid Build Coastguard Worker			name: "bar",
574*333d2b36SAndroid Build Coastguard Worker			srcs: [":foo{.public.stubs.source}"],
575*333d2b36SAndroid Build Coastguard Worker			java_resources: [
576*333d2b36SAndroid Build Coastguard Worker				":foo{.public.api.txt}",
577*333d2b36SAndroid Build Coastguard Worker				":foo{.public.removed-api.txt}",
578*333d2b36SAndroid Build Coastguard Worker				":foo{.public.annotations.zip}",
579*333d2b36SAndroid Build Coastguard Worker			],
580*333d2b36SAndroid Build Coastguard Worker		}
581*333d2b36SAndroid Build Coastguard Worker		`)
582*333d2b36SAndroid Build Coastguard Worker}
583*333d2b36SAndroid Build Coastguard Worker
584*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
585*333d2b36SAndroid Build Coastguard Worker	bp := `
586*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
587*333d2b36SAndroid Build Coastguard Worker			name: "foo",
588*333d2b36SAndroid Build Coastguard Worker			public: {
589*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
590*333d2b36SAndroid Build Coastguard Worker			},
591*333d2b36SAndroid Build Coastguard Worker		}
592*333d2b36SAndroid Build Coastguard Worker		`
593*333d2b36SAndroid Build Coastguard Worker
594*333d2b36SAndroid Build Coastguard Worker	t.Run("stubs.source", func(t *testing.T) {
595*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest.
596*333d2b36SAndroid Build Coastguard Worker			ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo" is not a SourceFileProducer or having valid output file for tag ".public.stubs.source"`)).
597*333d2b36SAndroid Build Coastguard Worker			RunTestWithBp(t, bp+`
598*333d2b36SAndroid Build Coastguard Worker				java_library {
599*333d2b36SAndroid Build Coastguard Worker					name: "bar",
600*333d2b36SAndroid Build Coastguard Worker					srcs: [":foo{.public.stubs.source}"],
601*333d2b36SAndroid Build Coastguard Worker					java_resources: [
602*333d2b36SAndroid Build Coastguard Worker						":foo{.public.api.txt}",
603*333d2b36SAndroid Build Coastguard Worker						":foo{.public.removed-api.txt}",
604*333d2b36SAndroid Build Coastguard Worker					],
605*333d2b36SAndroid Build Coastguard Worker				}
606*333d2b36SAndroid Build Coastguard Worker			`)
607*333d2b36SAndroid Build Coastguard Worker	})
608*333d2b36SAndroid Build Coastguard Worker
609*333d2b36SAndroid Build Coastguard Worker	t.Run("api.txt", func(t *testing.T) {
610*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest.
611*333d2b36SAndroid Build Coastguard Worker			ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo" is not a SourceFileProducer or having valid output file for tag ".public.api.txt"`)).
612*333d2b36SAndroid Build Coastguard Worker			RunTestWithBp(t, bp+`
613*333d2b36SAndroid Build Coastguard Worker				java_library {
614*333d2b36SAndroid Build Coastguard Worker					name: "bar",
615*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
616*333d2b36SAndroid Build Coastguard Worker					java_resources: [
617*333d2b36SAndroid Build Coastguard Worker						":foo{.public.api.txt}",
618*333d2b36SAndroid Build Coastguard Worker					],
619*333d2b36SAndroid Build Coastguard Worker				}
620*333d2b36SAndroid Build Coastguard Worker			`)
621*333d2b36SAndroid Build Coastguard Worker	})
622*333d2b36SAndroid Build Coastguard Worker
623*333d2b36SAndroid Build Coastguard Worker	t.Run("removed-api.txt", func(t *testing.T) {
624*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest.
625*333d2b36SAndroid Build Coastguard Worker			ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo" is not a SourceFileProducer or having valid output file for tag ".public.removed-api.txt"`)).
626*333d2b36SAndroid Build Coastguard Worker			RunTestWithBp(t, bp+`
627*333d2b36SAndroid Build Coastguard Worker				java_library {
628*333d2b36SAndroid Build Coastguard Worker					name: "bar",
629*333d2b36SAndroid Build Coastguard Worker					srcs: ["a.java"],
630*333d2b36SAndroid Build Coastguard Worker					java_resources: [
631*333d2b36SAndroid Build Coastguard Worker						":foo{.public.removed-api.txt}",
632*333d2b36SAndroid Build Coastguard Worker					],
633*333d2b36SAndroid Build Coastguard Worker				}
634*333d2b36SAndroid Build Coastguard Worker			`)
635*333d2b36SAndroid Build Coastguard Worker	})
636*333d2b36SAndroid Build Coastguard Worker}
637*333d2b36SAndroid Build Coastguard Worker
638*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
639*333d2b36SAndroid Build Coastguard Worker	prepareForJavaTest.
640*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
641*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
642*333d2b36SAndroid Build Coastguard Worker			java_sdk_library {
643*333d2b36SAndroid Build Coastguard Worker				name: "foo",
644*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java", "b.java"],
645*333d2b36SAndroid Build Coastguard Worker				api_packages: ["foo"],
646*333d2b36SAndroid Build Coastguard Worker				// Explicitly disable public to test the check that ensures the set of enabled
647*333d2b36SAndroid Build Coastguard Worker				// scopes is consistent.
648*333d2b36SAndroid Build Coastguard Worker				public: {
649*333d2b36SAndroid Build Coastguard Worker					enabled: false,
650*333d2b36SAndroid Build Coastguard Worker				},
651*333d2b36SAndroid Build Coastguard Worker				system: {
652*333d2b36SAndroid Build Coastguard Worker					enabled: true,
653*333d2b36SAndroid Build Coastguard Worker				},
654*333d2b36SAndroid Build Coastguard Worker			}
655*333d2b36SAndroid Build Coastguard Worker		`)
656*333d2b36SAndroid Build Coastguard Worker}
657*333d2b36SAndroid Build Coastguard Worker
658*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
659*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
660*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
661*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
662*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
663*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
664*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
665*333d2b36SAndroid Build Coastguard Worker			name: "foo",
666*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
667*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
668*333d2b36SAndroid Build Coastguard Worker			system: {
669*333d2b36SAndroid Build Coastguard Worker				enabled: true,
670*333d2b36SAndroid Build Coastguard Worker				sdk_version: "module_current",
671*333d2b36SAndroid Build Coastguard Worker			},
672*333d2b36SAndroid Build Coastguard Worker		}
673*333d2b36SAndroid Build Coastguard Worker		`)
674*333d2b36SAndroid Build Coastguard Worker}
675*333d2b36SAndroid Build Coastguard Worker
676*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_ModuleLib(t *testing.T) {
677*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
678*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
679*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
680*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
681*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
682*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
683*333d2b36SAndroid Build Coastguard Worker			name: "foo",
684*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
685*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
686*333d2b36SAndroid Build Coastguard Worker			system: {
687*333d2b36SAndroid Build Coastguard Worker				enabled: true,
688*333d2b36SAndroid Build Coastguard Worker			},
689*333d2b36SAndroid Build Coastguard Worker			module_lib: {
690*333d2b36SAndroid Build Coastguard Worker				enabled: true,
691*333d2b36SAndroid Build Coastguard Worker			},
692*333d2b36SAndroid Build Coastguard Worker		}
693*333d2b36SAndroid Build Coastguard Worker		`)
694*333d2b36SAndroid Build Coastguard Worker}
695*333d2b36SAndroid Build Coastguard Worker
696*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_SystemServer(t *testing.T) {
697*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
698*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
699*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
700*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
701*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
702*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
703*333d2b36SAndroid Build Coastguard Worker			name: "foo",
704*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
705*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
706*333d2b36SAndroid Build Coastguard Worker			system: {
707*333d2b36SAndroid Build Coastguard Worker				enabled: true,
708*333d2b36SAndroid Build Coastguard Worker			},
709*333d2b36SAndroid Build Coastguard Worker			system_server: {
710*333d2b36SAndroid Build Coastguard Worker				enabled: true,
711*333d2b36SAndroid Build Coastguard Worker			},
712*333d2b36SAndroid Build Coastguard Worker		}
713*333d2b36SAndroid Build Coastguard Worker		`)
714*333d2b36SAndroid Build Coastguard Worker}
715*333d2b36SAndroid Build Coastguard Worker
716*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_SystemServer_AccessToStubScopeLibs(t *testing.T) {
717*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
718*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
719*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
720*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo-public", "foo-system", "foo-module-lib", "foo-system-server"),
721*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
722*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
723*333d2b36SAndroid Build Coastguard Worker			name: "foo-public",
724*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
725*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
726*333d2b36SAndroid Build Coastguard Worker			public: {
727*333d2b36SAndroid Build Coastguard Worker				enabled: true,
728*333d2b36SAndroid Build Coastguard Worker			},
729*333d2b36SAndroid Build Coastguard Worker		}
730*333d2b36SAndroid Build Coastguard Worker
731*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
732*333d2b36SAndroid Build Coastguard Worker			name: "foo-system",
733*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
734*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
735*333d2b36SAndroid Build Coastguard Worker			system: {
736*333d2b36SAndroid Build Coastguard Worker				enabled: true,
737*333d2b36SAndroid Build Coastguard Worker			},
738*333d2b36SAndroid Build Coastguard Worker		}
739*333d2b36SAndroid Build Coastguard Worker
740*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
741*333d2b36SAndroid Build Coastguard Worker			name: "foo-module-lib",
742*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
743*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
744*333d2b36SAndroid Build Coastguard Worker			system: {
745*333d2b36SAndroid Build Coastguard Worker				enabled: true,
746*333d2b36SAndroid Build Coastguard Worker			},
747*333d2b36SAndroid Build Coastguard Worker			module_lib: {
748*333d2b36SAndroid Build Coastguard Worker				enabled: true,
749*333d2b36SAndroid Build Coastguard Worker			},
750*333d2b36SAndroid Build Coastguard Worker		}
751*333d2b36SAndroid Build Coastguard Worker
752*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
753*333d2b36SAndroid Build Coastguard Worker			name: "foo-system-server",
754*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
755*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
756*333d2b36SAndroid Build Coastguard Worker			system_server: {
757*333d2b36SAndroid Build Coastguard Worker				enabled: true,
758*333d2b36SAndroid Build Coastguard Worker			},
759*333d2b36SAndroid Build Coastguard Worker		}
760*333d2b36SAndroid Build Coastguard Worker
761*333d2b36SAndroid Build Coastguard Worker		java_library {
762*333d2b36SAndroid Build Coastguard Worker			name: "bar",
763*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
764*333d2b36SAndroid Build Coastguard Worker			libs: ["foo-public.stubs", "foo-system.stubs.system", "foo-module-lib.stubs.module_lib", "foo-system-server.stubs.system_server"],
765*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_server_current",
766*333d2b36SAndroid Build Coastguard Worker		}
767*333d2b36SAndroid Build Coastguard Worker		`)
768*333d2b36SAndroid Build Coastguard Worker
769*333d2b36SAndroid Build Coastguard Worker	stubsPath := func(name string, scope *apiScope) string {
770*333d2b36SAndroid Build Coastguard Worker		name = scope.stubsLibraryModuleName(name)
771*333d2b36SAndroid Build Coastguard Worker		return fmt.Sprintf("out/soong/.intermediates/%[1]s/android_common/turbine-combined/%[1]s.jar", name)
772*333d2b36SAndroid Build Coastguard Worker	}
773*333d2b36SAndroid Build Coastguard Worker
774*333d2b36SAndroid Build Coastguard Worker	// The bar library should depend on the highest (where system server is highest and public is
775*333d2b36SAndroid Build Coastguard Worker	// lowest) API scopes provided by each of the foo-* modules. The highest API scope provided by the
776*333d2b36SAndroid Build Coastguard Worker	// foo-<x> module is <x>.
777*333d2b36SAndroid Build Coastguard Worker	barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
778*333d2b36SAndroid Build Coastguard Worker	stubLibraries := []string{
779*333d2b36SAndroid Build Coastguard Worker		stubsPath("foo-public", apiScopePublic),
780*333d2b36SAndroid Build Coastguard Worker		stubsPath("foo-system", apiScopeSystem),
781*333d2b36SAndroid Build Coastguard Worker		stubsPath("foo-module-lib", apiScopeModuleLib),
782*333d2b36SAndroid Build Coastguard Worker		stubsPath("foo-system-server", apiScopeSystemServer),
783*333d2b36SAndroid Build Coastguard Worker	}
784*333d2b36SAndroid Build Coastguard Worker	expectedPattern := fmt.Sprintf(`^-classpath .*:\Q%s\E$`, strings.Join(stubLibraries, ":"))
785*333d2b36SAndroid Build Coastguard Worker	if expected, actual := expectedPattern, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
786*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected pattern %q to match %#q", expected, actual)
787*333d2b36SAndroid Build Coastguard Worker	}
788*333d2b36SAndroid Build Coastguard Worker}
789*333d2b36SAndroid Build Coastguard Worker
790*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibraryImport(t *testing.T) {
791*333d2b36SAndroid Build Coastguard Worker	result := prepareForJavaTest.RunTestWithBp(t, `
792*333d2b36SAndroid Build Coastguard Worker		java_library {
793*333d2b36SAndroid Build Coastguard Worker			name: "foo",
794*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
795*333d2b36SAndroid Build Coastguard Worker			libs: ["sdklib.stubs"],
796*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
797*333d2b36SAndroid Build Coastguard Worker		}
798*333d2b36SAndroid Build Coastguard Worker
799*333d2b36SAndroid Build Coastguard Worker		java_library {
800*333d2b36SAndroid Build Coastguard Worker			name: "foo.system",
801*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
802*333d2b36SAndroid Build Coastguard Worker			libs: ["sdklib.stubs.system"],
803*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
804*333d2b36SAndroid Build Coastguard Worker		}
805*333d2b36SAndroid Build Coastguard Worker
806*333d2b36SAndroid Build Coastguard Worker		java_library {
807*333d2b36SAndroid Build Coastguard Worker			name: "foo.test",
808*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
809*333d2b36SAndroid Build Coastguard Worker			libs: ["sdklib.stubs.test"],
810*333d2b36SAndroid Build Coastguard Worker			sdk_version: "test_current",
811*333d2b36SAndroid Build Coastguard Worker		}
812*333d2b36SAndroid Build Coastguard Worker
813*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
814*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
815*333d2b36SAndroid Build Coastguard Worker			public: {
816*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
817*333d2b36SAndroid Build Coastguard Worker			},
818*333d2b36SAndroid Build Coastguard Worker			system: {
819*333d2b36SAndroid Build Coastguard Worker				jars: ["b.jar"],
820*333d2b36SAndroid Build Coastguard Worker			},
821*333d2b36SAndroid Build Coastguard Worker			test: {
822*333d2b36SAndroid Build Coastguard Worker				jars: ["c.jar"],
823*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["c.java"],
824*333d2b36SAndroid Build Coastguard Worker			},
825*333d2b36SAndroid Build Coastguard Worker		}
826*333d2b36SAndroid Build Coastguard Worker		`)
827*333d2b36SAndroid Build Coastguard Worker
828*333d2b36SAndroid Build Coastguard Worker	for _, scope := range []string{"", ".system", ".test"} {
829*333d2b36SAndroid Build Coastguard Worker		fooModule := result.ModuleForTests("foo"+scope, "android_common")
830*333d2b36SAndroid Build Coastguard Worker		javac := fooModule.Rule("javac")
831*333d2b36SAndroid Build Coastguard Worker
832*333d2b36SAndroid Build Coastguard Worker		sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Output("combined/sdklib.stubs" + scope + ".jar").Output
833*333d2b36SAndroid Build Coastguard Worker		android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
834*333d2b36SAndroid Build Coastguard Worker	}
835*333d2b36SAndroid Build Coastguard Worker
836*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
837*333d2b36SAndroid Build Coastguard Worker		`all_apex_contributions`,
838*333d2b36SAndroid Build Coastguard Worker		`dex2oatd`,
839*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs`,
840*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs.source.test`,
841*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs.system`,
842*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs.test`,
843*333d2b36SAndroid Build Coastguard Worker	})
844*333d2b36SAndroid Build Coastguard Worker}
845*333d2b36SAndroid Build Coastguard Worker
846*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibraryImport_WithSource(t *testing.T) {
847*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
848*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
849*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
850*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("sdklib"),
851*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
852*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
853*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
854*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
855*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
856*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
857*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
858*333d2b36SAndroid Build Coastguard Worker			public: {
859*333d2b36SAndroid Build Coastguard Worker				enabled: true,
860*333d2b36SAndroid Build Coastguard Worker			},
861*333d2b36SAndroid Build Coastguard Worker		}
862*333d2b36SAndroid Build Coastguard Worker
863*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
864*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
865*333d2b36SAndroid Build Coastguard Worker			public: {
866*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
867*333d2b36SAndroid Build Coastguard Worker			},
868*333d2b36SAndroid Build Coastguard Worker		}
869*333d2b36SAndroid Build Coastguard Worker		`)
870*333d2b36SAndroid Build Coastguard Worker
871*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
872*333d2b36SAndroid Build Coastguard Worker		`dex2oatd`,
873*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib`,
874*333d2b36SAndroid Build Coastguard Worker		`sdklib-removed.api.combined.public.latest`,
875*333d2b36SAndroid Build Coastguard Worker		`sdklib.api.combined.public.latest`,
876*333d2b36SAndroid Build Coastguard Worker		`sdklib.impl`,
877*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs`,
878*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs.exportable`,
879*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs.source`,
880*333d2b36SAndroid Build Coastguard Worker		`sdklib.xml`,
881*333d2b36SAndroid Build Coastguard Worker	})
882*333d2b36SAndroid Build Coastguard Worker
883*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
884*333d2b36SAndroid Build Coastguard Worker		`all_apex_contributions`,
885*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs`,
886*333d2b36SAndroid Build Coastguard Worker		`sdklib.impl`,
887*333d2b36SAndroid Build Coastguard Worker		// This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
888*333d2b36SAndroid Build Coastguard Worker		// dependency is added after prebuilts may have been renamed and so has to use
889*333d2b36SAndroid Build Coastguard Worker		// the renamed name.
890*333d2b36SAndroid Build Coastguard Worker		`sdklib.xml`,
891*333d2b36SAndroid Build Coastguard Worker	})
892*333d2b36SAndroid Build Coastguard Worker}
893*333d2b36SAndroid Build Coastguard Worker
894*333d2b36SAndroid Build Coastguard Workerfunc testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer android.FixturePreparer) {
895*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
896*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
897*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
898*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("sdklib"),
899*333d2b36SAndroid Build Coastguard Worker		preparer,
900*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
901*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
902*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
903*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
904*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
905*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
906*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
907*333d2b36SAndroid Build Coastguard Worker			public: {
908*333d2b36SAndroid Build Coastguard Worker				enabled: true,
909*333d2b36SAndroid Build Coastguard Worker			},
910*333d2b36SAndroid Build Coastguard Worker		}
911*333d2b36SAndroid Build Coastguard Worker
912*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
913*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
914*333d2b36SAndroid Build Coastguard Worker			`+prefer+`
915*333d2b36SAndroid Build Coastguard Worker			public: {
916*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
917*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
918*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
919*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
920*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
921*333d2b36SAndroid Build Coastguard Worker			},
922*333d2b36SAndroid Build Coastguard Worker		}
923*333d2b36SAndroid Build Coastguard Worker
924*333d2b36SAndroid Build Coastguard Worker		java_library {
925*333d2b36SAndroid Build Coastguard Worker			name: "combined",
926*333d2b36SAndroid Build Coastguard Worker			static_libs: [
927*333d2b36SAndroid Build Coastguard Worker				"sdklib.stubs",
928*333d2b36SAndroid Build Coastguard Worker			],
929*333d2b36SAndroid Build Coastguard Worker			java_resources: [
930*333d2b36SAndroid Build Coastguard Worker				":sdklib.stubs.source",
931*333d2b36SAndroid Build Coastguard Worker				":sdklib{.public.api.txt}",
932*333d2b36SAndroid Build Coastguard Worker				":sdklib{.public.removed-api.txt}",
933*333d2b36SAndroid Build Coastguard Worker				":sdklib{.public.annotations.zip}",
934*333d2b36SAndroid Build Coastguard Worker			],
935*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
936*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
937*333d2b36SAndroid Build Coastguard Worker		}
938*333d2b36SAndroid Build Coastguard Worker
939*333d2b36SAndroid Build Coastguard Worker		java_library {
940*333d2b36SAndroid Build Coastguard Worker			name: "public",
941*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
942*333d2b36SAndroid Build Coastguard Worker			libs: ["sdklib.stubs"],
943*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
944*333d2b36SAndroid Build Coastguard Worker		}
945*333d2b36SAndroid Build Coastguard Worker		`)
946*333d2b36SAndroid Build Coastguard Worker
947*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
948*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib`,
949*333d2b36SAndroid Build Coastguard Worker		`sdklib-removed.api.combined.public.latest`,
950*333d2b36SAndroid Build Coastguard Worker		`sdklib.api.combined.public.latest`,
951*333d2b36SAndroid Build Coastguard Worker		`sdklib.impl`,
952*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs`,
953*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs.exportable`,
954*333d2b36SAndroid Build Coastguard Worker		`sdklib.stubs.source`,
955*333d2b36SAndroid Build Coastguard Worker		`sdklib.xml`,
956*333d2b36SAndroid Build Coastguard Worker	})
957*333d2b36SAndroid Build Coastguard Worker
958*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
959*333d2b36SAndroid Build Coastguard Worker		`all_apex_contributions`,
960*333d2b36SAndroid Build Coastguard Worker		`dex2oatd`,
961*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs`,
962*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs.source`,
963*333d2b36SAndroid Build Coastguard Worker		`sdklib.impl`,
964*333d2b36SAndroid Build Coastguard Worker		`sdklib.xml`,
965*333d2b36SAndroid Build Coastguard Worker	})
966*333d2b36SAndroid Build Coastguard Worker
967*333d2b36SAndroid Build Coastguard Worker	// Make sure that dependencies on child modules use the prebuilt when preferred.
968*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{
969*333d2b36SAndroid Build Coastguard Worker		// Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib.
970*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib`,
971*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib`,
972*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib`,
973*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs`,
974*333d2b36SAndroid Build Coastguard Worker		`prebuilt_sdklib.stubs.source`,
975*333d2b36SAndroid Build Coastguard Worker	})
976*333d2b36SAndroid Build Coastguard Worker
977*333d2b36SAndroid Build Coastguard Worker	// Make sure that dependencies on sdklib that resolve to one of the child libraries use the
978*333d2b36SAndroid Build Coastguard Worker	// prebuilt library.
979*333d2b36SAndroid Build Coastguard Worker	public := result.ModuleForTests("public", "android_common")
980*333d2b36SAndroid Build Coastguard Worker	rule := public.Output("javac/public.jar")
981*333d2b36SAndroid Build Coastguard Worker	inputs := rule.Implicits.Strings()
982*333d2b36SAndroid Build Coastguard Worker	expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar"
983*333d2b36SAndroid Build Coastguard Worker	if !android.InList(expected, inputs) {
984*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected %q to contain %q", inputs, expected)
985*333d2b36SAndroid Build Coastguard Worker	}
986*333d2b36SAndroid Build Coastguard Worker}
987*333d2b36SAndroid Build Coastguard Worker
988*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibraryImport_Preferred(t *testing.T) {
989*333d2b36SAndroid Build Coastguard Worker	t.Run("prefer", func(t *testing.T) {
990*333d2b36SAndroid Build Coastguard Worker		testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
991*333d2b36SAndroid Build Coastguard Worker	})
992*333d2b36SAndroid Build Coastguard Worker}
993*333d2b36SAndroid Build Coastguard Worker
994*333d2b36SAndroid Build Coastguard Worker// If a module is listed in `mainline_module_contributions, it should be used
995*333d2b36SAndroid Build Coastguard Worker// It will supersede any other source vs prebuilt selection mechanism like `prefer` attribute
996*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryImport_MetadataModuleSupersedesPreferred(t *testing.T) {
997*333d2b36SAndroid Build Coastguard Worker	bp := `
998*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
999*333d2b36SAndroid Build Coastguard Worker			name: "my_mainline_module_contributions",
1000*333d2b36SAndroid Build Coastguard Worker			api_domain: "my_mainline_module",
1001*333d2b36SAndroid Build Coastguard Worker			contents: [
1002*333d2b36SAndroid Build Coastguard Worker				// legacy mechanism prefers the prebuilt
1003*333d2b36SAndroid Build Coastguard Worker				// mainline_module_contributions supersedes this since source is listed explicitly
1004*333d2b36SAndroid Build Coastguard Worker				"sdklib.prebuilt_preferred_using_legacy_flags",
1005*333d2b36SAndroid Build Coastguard Worker
1006*333d2b36SAndroid Build Coastguard Worker				// legacy mechanism prefers the source
1007*333d2b36SAndroid Build Coastguard Worker				// mainline_module_contributions supersedes this since prebuilt is listed explicitly
1008*333d2b36SAndroid Build Coastguard Worker				"prebuilt_sdklib.source_preferred_using_legacy_flags",
1009*333d2b36SAndroid Build Coastguard Worker			],
1010*333d2b36SAndroid Build Coastguard Worker		}
1011*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1012*333d2b36SAndroid Build Coastguard Worker			name: "sdklib.prebuilt_preferred_using_legacy_flags",
1013*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1014*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
1015*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
1016*333d2b36SAndroid Build Coastguard Worker			public: {
1017*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1018*333d2b36SAndroid Build Coastguard Worker			},
1019*333d2b36SAndroid Build Coastguard Worker			system: {
1020*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1021*333d2b36SAndroid Build Coastguard Worker			}
1022*333d2b36SAndroid Build Coastguard Worker		}
1023*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
1024*333d2b36SAndroid Build Coastguard Worker			name: "sdklib.prebuilt_preferred_using_legacy_flags",
1025*333d2b36SAndroid Build Coastguard Worker			prefer: true, // prebuilt is preferred using legacy mechanism
1026*333d2b36SAndroid Build Coastguard Worker			public: {
1027*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1028*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1029*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1030*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1031*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1032*333d2b36SAndroid Build Coastguard Worker			},
1033*333d2b36SAndroid Build Coastguard Worker			system: {
1034*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1035*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1036*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1037*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1038*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1039*333d2b36SAndroid Build Coastguard Worker			},
1040*333d2b36SAndroid Build Coastguard Worker		}
1041*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1042*333d2b36SAndroid Build Coastguard Worker			name: "sdklib.source_preferred_using_legacy_flags",
1043*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1044*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
1045*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
1046*333d2b36SAndroid Build Coastguard Worker			public: {
1047*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1048*333d2b36SAndroid Build Coastguard Worker			},
1049*333d2b36SAndroid Build Coastguard Worker			system: {
1050*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1051*333d2b36SAndroid Build Coastguard Worker			}
1052*333d2b36SAndroid Build Coastguard Worker		}
1053*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
1054*333d2b36SAndroid Build Coastguard Worker			name: "sdklib.source_preferred_using_legacy_flags",
1055*333d2b36SAndroid Build Coastguard Worker			prefer: false, // source is preferred using legacy mechanism
1056*333d2b36SAndroid Build Coastguard Worker			public: {
1057*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1058*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1059*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1060*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1061*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1062*333d2b36SAndroid Build Coastguard Worker			},
1063*333d2b36SAndroid Build Coastguard Worker			system: {
1064*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1065*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1066*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1067*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1068*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1069*333d2b36SAndroid Build Coastguard Worker			},
1070*333d2b36SAndroid Build Coastguard Worker		}
1071*333d2b36SAndroid Build Coastguard Worker
1072*333d2b36SAndroid Build Coastguard Worker		// rdeps
1073*333d2b36SAndroid Build Coastguard Worker		java_library {
1074*333d2b36SAndroid Build Coastguard Worker			name: "public",
1075*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1076*333d2b36SAndroid Build Coastguard Worker			libs: [
1077*333d2b36SAndroid Build Coastguard Worker				// this should get source since source is listed in my_mainline_module_contributions
1078*333d2b36SAndroid Build Coastguard Worker				"sdklib.prebuilt_preferred_using_legacy_flags.stubs",
1079*333d2b36SAndroid Build Coastguard Worker				"sdklib.prebuilt_preferred_using_legacy_flags.stubs.system",
1080*333d2b36SAndroid Build Coastguard Worker
1081*333d2b36SAndroid Build Coastguard Worker				// this should get prebuilt since source is listed in my_mainline_module_contributions
1082*333d2b36SAndroid Build Coastguard Worker				"sdklib.source_preferred_using_legacy_flags.stubs",
1083*333d2b36SAndroid Build Coastguard Worker				"sdklib.source_preferred_using_legacy_flags.stubs.system",
1084*333d2b36SAndroid Build Coastguard Worker
1085*333d2b36SAndroid Build Coastguard Worker			],
1086*333d2b36SAndroid Build Coastguard Worker		}
1087*333d2b36SAndroid Build Coastguard Worker	`
1088*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1089*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1090*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1091*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("sdklib.source_preferred_using_legacy_flags", "sdklib.prebuilt_preferred_using_legacy_flags"),
1092*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
1093*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
1094*333d2b36SAndroid Build Coastguard Worker
1095*333d2b36SAndroid Build Coastguard Worker	// Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1096*333d2b36SAndroid Build Coastguard Worker	public := result.ModuleForTests("public", "android_common")
1097*333d2b36SAndroid Build Coastguard Worker	rule := public.Output("javac/public.jar")
1098*333d2b36SAndroid Build Coastguard Worker	inputs := rule.Implicits.Strings()
1099*333d2b36SAndroid Build Coastguard Worker	expectedInputs := []string{
1100*333d2b36SAndroid Build Coastguard Worker		// source
1101*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.jar",
1102*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system.jar",
1103*333d2b36SAndroid Build Coastguard Worker
1104*333d2b36SAndroid Build Coastguard Worker		// prebuilt
1105*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.jar",
1106*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs.system/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.system.jar",
1107*333d2b36SAndroid Build Coastguard Worker	}
1108*333d2b36SAndroid Build Coastguard Worker	for _, expected := range expectedInputs {
1109*333d2b36SAndroid Build Coastguard Worker		if !android.InList(expected, inputs) {
1110*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected %q to contain %q", inputs, expected)
1111*333d2b36SAndroid Build Coastguard Worker		}
1112*333d2b36SAndroid Build Coastguard Worker	}
1113*333d2b36SAndroid Build Coastguard Worker}
1114*333d2b36SAndroid Build Coastguard Worker
1115*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibraryDist(t *testing.T) {
1116*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1117*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaBuildComponents,
1118*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
1119*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1120*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis(
1121*333d2b36SAndroid Build Coastguard Worker			"sdklib_no_group",
1122*333d2b36SAndroid Build Coastguard Worker			"sdklib_group_foo",
1123*333d2b36SAndroid Build Coastguard Worker			"sdklib_owner_foo",
1124*333d2b36SAndroid Build Coastguard Worker			"foo"),
1125*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
1126*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1127*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1128*333d2b36SAndroid Build Coastguard Worker			name: "sdklib_no_group",
1129*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
1130*333d2b36SAndroid Build Coastguard Worker		}
1131*333d2b36SAndroid Build Coastguard Worker
1132*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1133*333d2b36SAndroid Build Coastguard Worker			name: "sdklib_group_foo",
1134*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
1135*333d2b36SAndroid Build Coastguard Worker			dist_group: "foo",
1136*333d2b36SAndroid Build Coastguard Worker		}
1137*333d2b36SAndroid Build Coastguard Worker
1138*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1139*333d2b36SAndroid Build Coastguard Worker			name: "sdklib_owner_foo",
1140*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
1141*333d2b36SAndroid Build Coastguard Worker			owner: "foo",
1142*333d2b36SAndroid Build Coastguard Worker		}
1143*333d2b36SAndroid Build Coastguard Worker
1144*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1145*333d2b36SAndroid Build Coastguard Worker			name: "sdklib_stem_foo",
1146*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
1147*333d2b36SAndroid Build Coastguard Worker			dist_stem: "foo",
1148*333d2b36SAndroid Build Coastguard Worker		}
1149*333d2b36SAndroid Build Coastguard Worker	`)
1150*333d2b36SAndroid Build Coastguard Worker
1151*333d2b36SAndroid Build Coastguard Worker	type testCase struct {
1152*333d2b36SAndroid Build Coastguard Worker		module   string
1153*333d2b36SAndroid Build Coastguard Worker		distDir  string
1154*333d2b36SAndroid Build Coastguard Worker		distStem string
1155*333d2b36SAndroid Build Coastguard Worker	}
1156*333d2b36SAndroid Build Coastguard Worker	testCases := []testCase{
1157*333d2b36SAndroid Build Coastguard Worker		{
1158*333d2b36SAndroid Build Coastguard Worker			module:   "sdklib_no_group",
1159*333d2b36SAndroid Build Coastguard Worker			distDir:  "apistubs/unknown/public",
1160*333d2b36SAndroid Build Coastguard Worker			distStem: "sdklib_no_group.jar",
1161*333d2b36SAndroid Build Coastguard Worker		},
1162*333d2b36SAndroid Build Coastguard Worker		{
1163*333d2b36SAndroid Build Coastguard Worker			module:   "sdklib_group_foo",
1164*333d2b36SAndroid Build Coastguard Worker			distDir:  "apistubs/foo/public",
1165*333d2b36SAndroid Build Coastguard Worker			distStem: "sdklib_group_foo.jar",
1166*333d2b36SAndroid Build Coastguard Worker		},
1167*333d2b36SAndroid Build Coastguard Worker		{
1168*333d2b36SAndroid Build Coastguard Worker			// Owner doesn't affect distDir after b/186723288.
1169*333d2b36SAndroid Build Coastguard Worker			module:   "sdklib_owner_foo",
1170*333d2b36SAndroid Build Coastguard Worker			distDir:  "apistubs/unknown/public",
1171*333d2b36SAndroid Build Coastguard Worker			distStem: "sdklib_owner_foo.jar",
1172*333d2b36SAndroid Build Coastguard Worker		},
1173*333d2b36SAndroid Build Coastguard Worker		{
1174*333d2b36SAndroid Build Coastguard Worker			module:   "sdklib_stem_foo",
1175*333d2b36SAndroid Build Coastguard Worker			distDir:  "apistubs/unknown/public",
1176*333d2b36SAndroid Build Coastguard Worker			distStem: "foo.jar",
1177*333d2b36SAndroid Build Coastguard Worker		},
1178*333d2b36SAndroid Build Coastguard Worker	}
1179*333d2b36SAndroid Build Coastguard Worker
1180*333d2b36SAndroid Build Coastguard Worker	for _, tt := range testCases {
1181*333d2b36SAndroid Build Coastguard Worker		t.Run(tt.module, func(t *testing.T) {
1182*333d2b36SAndroid Build Coastguard Worker			m := result.ModuleForTests(apiScopePublic.exportableStubsLibraryModuleName(tt.module), "android_common").Module().(*Library)
1183*333d2b36SAndroid Build Coastguard Worker			dists := m.Dists()
1184*333d2b36SAndroid Build Coastguard Worker			if len(dists) != 1 {
1185*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1186*333d2b36SAndroid Build Coastguard Worker			}
1187*333d2b36SAndroid Build Coastguard Worker			if g, w := String(dists[0].Dir), tt.distDir; g != w {
1188*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected dist dir %q, got %q", w, g)
1189*333d2b36SAndroid Build Coastguard Worker			}
1190*333d2b36SAndroid Build Coastguard Worker			if g, w := String(dists[0].Dest), tt.distStem; g != w {
1191*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected dist stem %q, got %q", w, g)
1192*333d2b36SAndroid Build Coastguard Worker			}
1193*333d2b36SAndroid Build Coastguard Worker		})
1194*333d2b36SAndroid Build Coastguard Worker	}
1195*333d2b36SAndroid Build Coastguard Worker}
1196*333d2b36SAndroid Build Coastguard Worker
1197*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1198*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
1199*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaBuildComponents,
1200*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
1201*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1202*333d2b36SAndroid Build Coastguard Worker	)
1203*333d2b36SAndroid Build Coastguard Worker
1204*333d2b36SAndroid Build Coastguard Worker	preparer.RunTestWithBp(t, `
1205*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1206*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
1207*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1208*333d2b36SAndroid Build Coastguard Worker			static_libs: ["util"],
1209*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
1210*333d2b36SAndroid Build Coastguard Worker			unsafe_ignore_missing_latest_api: true,
1211*333d2b36SAndroid Build Coastguard Worker		}
1212*333d2b36SAndroid Build Coastguard Worker
1213*333d2b36SAndroid Build Coastguard Worker		java_library {
1214*333d2b36SAndroid Build Coastguard Worker			name: "util",
1215*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1216*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "30",
1217*333d2b36SAndroid Build Coastguard Worker		}
1218*333d2b36SAndroid Build Coastguard Worker	`)
1219*333d2b36SAndroid Build Coastguard Worker
1220*333d2b36SAndroid Build Coastguard Worker	preparer.
1221*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
1222*333d2b36SAndroid Build Coastguard Worker			java_sdk_library {
1223*333d2b36SAndroid Build Coastguard Worker				name: "sdklib",
1224*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1225*333d2b36SAndroid Build Coastguard Worker				libs: ["util"],
1226*333d2b36SAndroid Build Coastguard Worker				impl_only_libs: ["util"],
1227*333d2b36SAndroid Build Coastguard Worker				stub_only_libs: ["util"],
1228*333d2b36SAndroid Build Coastguard Worker				stub_only_static_libs: ["util"],
1229*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "30",
1230*333d2b36SAndroid Build Coastguard Worker				unsafe_ignore_missing_latest_api: true,
1231*333d2b36SAndroid Build Coastguard Worker			}
1232*333d2b36SAndroid Build Coastguard Worker
1233*333d2b36SAndroid Build Coastguard Worker			java_library {
1234*333d2b36SAndroid Build Coastguard Worker				name: "util",
1235*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1236*333d2b36SAndroid Build Coastguard Worker			}
1237*333d2b36SAndroid Build Coastguard Worker		`)
1238*333d2b36SAndroid Build Coastguard Worker
1239*333d2b36SAndroid Build Coastguard Worker	preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1240*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
1241*333d2b36SAndroid Build Coastguard Worker			java_sdk_library {
1242*333d2b36SAndroid Build Coastguard Worker				name: "sdklib",
1243*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1244*333d2b36SAndroid Build Coastguard Worker				static_libs: ["util"],
1245*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "30",
1246*333d2b36SAndroid Build Coastguard Worker				unsafe_ignore_missing_latest_api: true,
1247*333d2b36SAndroid Build Coastguard Worker			}
1248*333d2b36SAndroid Build Coastguard Worker
1249*333d2b36SAndroid Build Coastguard Worker			java_library {
1250*333d2b36SAndroid Build Coastguard Worker				name: "util",
1251*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1252*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "31",
1253*333d2b36SAndroid Build Coastguard Worker			}
1254*333d2b36SAndroid Build Coastguard Worker		`)
1255*333d2b36SAndroid Build Coastguard Worker
1256*333d2b36SAndroid Build Coastguard Worker	preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1257*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
1258*333d2b36SAndroid Build Coastguard Worker			java_sdk_library {
1259*333d2b36SAndroid Build Coastguard Worker				name: "sdklib",
1260*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1261*333d2b36SAndroid Build Coastguard Worker				static_libs: ["util"],
1262*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "30",
1263*333d2b36SAndroid Build Coastguard Worker				unsafe_ignore_missing_latest_api: true,
1264*333d2b36SAndroid Build Coastguard Worker			}
1265*333d2b36SAndroid Build Coastguard Worker
1266*333d2b36SAndroid Build Coastguard Worker			java_library {
1267*333d2b36SAndroid Build Coastguard Worker				name: "util",
1268*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1269*333d2b36SAndroid Build Coastguard Worker				static_libs: ["another_util"],
1270*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "30",
1271*333d2b36SAndroid Build Coastguard Worker			}
1272*333d2b36SAndroid Build Coastguard Worker
1273*333d2b36SAndroid Build Coastguard Worker			java_library {
1274*333d2b36SAndroid Build Coastguard Worker				name: "another_util",
1275*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1276*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "31",
1277*333d2b36SAndroid Build Coastguard Worker			}
1278*333d2b36SAndroid Build Coastguard Worker		`)
1279*333d2b36SAndroid Build Coastguard Worker}
1280*333d2b36SAndroid Build Coastguard Worker
1281*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
1282*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1283*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1284*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1285*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
1286*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1287*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1288*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1289*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1290*333d2b36SAndroid Build Coastguard Worker			public: {
1291*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1292*333d2b36SAndroid Build Coastguard Worker			},
1293*333d2b36SAndroid Build Coastguard Worker			stub_only_libs: ["bar-lib"],
1294*333d2b36SAndroid Build Coastguard Worker		}
1295*333d2b36SAndroid Build Coastguard Worker
1296*333d2b36SAndroid Build Coastguard Worker		java_library {
1297*333d2b36SAndroid Build Coastguard Worker			name: "bar-lib",
1298*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
1299*333d2b36SAndroid Build Coastguard Worker		}
1300*333d2b36SAndroid Build Coastguard Worker		`)
1301*333d2b36SAndroid Build Coastguard Worker
1302*333d2b36SAndroid Build Coastguard Worker	// The foo.stubs.source should depend on bar-lib
1303*333d2b36SAndroid Build Coastguard Worker	fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1304*333d2b36SAndroid Build Coastguard Worker	eval := fooStubsSources.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
1305*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs.GetOrDefault(eval, nil), "bar-lib")
1306*333d2b36SAndroid Build Coastguard Worker}
1307*333d2b36SAndroid Build Coastguard Worker
1308*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_Scope_Libs_PassedToDroidstubs(t *testing.T) {
1309*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1310*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1311*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1312*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
1313*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1314*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1315*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1316*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1317*333d2b36SAndroid Build Coastguard Worker			public: {
1318*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1319*333d2b36SAndroid Build Coastguard Worker				libs: ["bar-lib"],
1320*333d2b36SAndroid Build Coastguard Worker			},
1321*333d2b36SAndroid Build Coastguard Worker		}
1322*333d2b36SAndroid Build Coastguard Worker
1323*333d2b36SAndroid Build Coastguard Worker		java_library {
1324*333d2b36SAndroid Build Coastguard Worker			name: "bar-lib",
1325*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
1326*333d2b36SAndroid Build Coastguard Worker		}
1327*333d2b36SAndroid Build Coastguard Worker		`)
1328*333d2b36SAndroid Build Coastguard Worker
1329*333d2b36SAndroid Build Coastguard Worker	// The foo.stubs.source should depend on bar-lib
1330*333d2b36SAndroid Build Coastguard Worker	fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1331*333d2b36SAndroid Build Coastguard Worker	eval := fooStubsSources.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
1332*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs.GetOrDefault(eval, nil), "bar-lib")
1333*333d2b36SAndroid Build Coastguard Worker}
1334*333d2b36SAndroid Build Coastguard Worker
1335*333d2b36SAndroid Build Coastguard Workerfunc TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
1336*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1337*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1338*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1339*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
1340*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1341*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1342*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1343*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
1344*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
1345*333d2b36SAndroid Build Coastguard Worker			system: {
1346*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1347*333d2b36SAndroid Build Coastguard Worker			},
1348*333d2b36SAndroid Build Coastguard Worker			module_lib: {
1349*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1350*333d2b36SAndroid Build Coastguard Worker			},
1351*333d2b36SAndroid Build Coastguard Worker			test: {
1352*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1353*333d2b36SAndroid Build Coastguard Worker			},
1354*333d2b36SAndroid Build Coastguard Worker		}
1355*333d2b36SAndroid Build Coastguard Worker	`)
1356*333d2b36SAndroid Build Coastguard Worker
1357*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1358*333d2b36SAndroid Build Coastguard Worker		scope            *apiScope
1359*333d2b36SAndroid Build Coastguard Worker		apiContributions []string
1360*333d2b36SAndroid Build Coastguard Worker	}{
1361*333d2b36SAndroid Build Coastguard Worker		{
1362*333d2b36SAndroid Build Coastguard Worker			scope:            apiScopePublic,
1363*333d2b36SAndroid Build Coastguard Worker			apiContributions: []string{"foo.stubs.source.api.contribution"},
1364*333d2b36SAndroid Build Coastguard Worker		},
1365*333d2b36SAndroid Build Coastguard Worker		{
1366*333d2b36SAndroid Build Coastguard Worker			scope:            apiScopeSystem,
1367*333d2b36SAndroid Build Coastguard Worker			apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
1368*333d2b36SAndroid Build Coastguard Worker		},
1369*333d2b36SAndroid Build Coastguard Worker		{
1370*333d2b36SAndroid Build Coastguard Worker			scope:            apiScopeTest,
1371*333d2b36SAndroid Build Coastguard Worker			apiContributions: []string{"foo.stubs.source.test.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
1372*333d2b36SAndroid Build Coastguard Worker		},
1373*333d2b36SAndroid Build Coastguard Worker		{
1374*333d2b36SAndroid Build Coastguard Worker			scope:            apiScopeModuleLib,
1375*333d2b36SAndroid Build Coastguard Worker			apiContributions: []string{"foo.stubs.source.module_lib.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
1376*333d2b36SAndroid Build Coastguard Worker		},
1377*333d2b36SAndroid Build Coastguard Worker	}
1378*333d2b36SAndroid Build Coastguard Worker
1379*333d2b36SAndroid Build Coastguard Worker	for _, c := range testCases {
1380*333d2b36SAndroid Build Coastguard Worker		m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
1381*333d2b36SAndroid Build Coastguard Worker		android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
1382*333d2b36SAndroid Build Coastguard Worker	}
1383*333d2b36SAndroid Build Coastguard Worker}
1384*333d2b36SAndroid Build Coastguard Worker
1385*333d2b36SAndroid Build Coastguard Workerfunc TestStaticDepStubLibrariesVisibility(t *testing.T) {
1386*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
1387*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1388*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1389*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
1390*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
1391*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
1392*333d2b36SAndroid Build Coastguard Worker				"A.java": nil,
1393*333d2b36SAndroid Build Coastguard Worker				"dir/Android.bp": []byte(
1394*333d2b36SAndroid Build Coastguard Worker					`
1395*333d2b36SAndroid Build Coastguard Worker					java_library {
1396*333d2b36SAndroid Build Coastguard Worker						name: "bar",
1397*333d2b36SAndroid Build Coastguard Worker						srcs: ["A.java"],
1398*333d2b36SAndroid Build Coastguard Worker						libs: ["foo.stubs.from-source"],
1399*333d2b36SAndroid Build Coastguard Worker					}
1400*333d2b36SAndroid Build Coastguard Worker					`),
1401*333d2b36SAndroid Build Coastguard Worker				"dir/A.java": nil,
1402*333d2b36SAndroid Build Coastguard Worker			},
1403*333d2b36SAndroid Build Coastguard Worker		).ExtendWithErrorHandler(
1404*333d2b36SAndroid Build Coastguard Worker			android.FixtureExpectsAtLeastOneErrorMatchingPattern(
1405*333d2b36SAndroid Build Coastguard Worker				`module "bar" variant "android_common": depends on //.:foo.stubs.from-source which is not visible to this module`)),
1406*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1407*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1408*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1409*333d2b36SAndroid Build Coastguard Worker			srcs: ["A.java"],
1410*333d2b36SAndroid Build Coastguard Worker		}
1411*333d2b36SAndroid Build Coastguard Worker	`)
1412*333d2b36SAndroid Build Coastguard Worker}
1413*333d2b36SAndroid Build Coastguard Worker
1414*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryDependency(t *testing.T) {
1415*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1416*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1417*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1418*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
1419*333d2b36SAndroid Build Coastguard Worker			"30": {"bar", "foo"},
1420*333d2b36SAndroid Build Coastguard Worker		}),
1421*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t,
1422*333d2b36SAndroid Build Coastguard Worker		`
1423*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1424*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1425*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
1426*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
1427*333d2b36SAndroid Build Coastguard Worker		}
1428*333d2b36SAndroid Build Coastguard Worker
1429*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1430*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1431*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java", "b.java"],
1432*333d2b36SAndroid Build Coastguard Worker			libs: [
1433*333d2b36SAndroid Build Coastguard Worker				"foo.stubs",
1434*333d2b36SAndroid Build Coastguard Worker			],
1435*333d2b36SAndroid Build Coastguard Worker			uses_libs: [
1436*333d2b36SAndroid Build Coastguard Worker				"foo",
1437*333d2b36SAndroid Build Coastguard Worker			],
1438*333d2b36SAndroid Build Coastguard Worker		}
1439*333d2b36SAndroid Build Coastguard Worker`)
1440*333d2b36SAndroid Build Coastguard Worker
1441*333d2b36SAndroid Build Coastguard Worker	barPermissions := result.ModuleForTests("bar.xml", "android_common").Output("bar.xml")
1442*333d2b36SAndroid Build Coastguard Worker	barContents := android.ContentFromFileRuleForTests(t, result.TestContext, barPermissions)
1443*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barContents, `dependency="foo"`)
1444*333d2b36SAndroid Build Coastguard Worker}
1445*333d2b36SAndroid Build Coastguard Worker
1446*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryExportableStubsLibrary(t *testing.T) {
1447*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1448*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1449*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1450*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
1451*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1452*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
1453*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1454*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package",
1455*333d2b36SAndroid Build Coastguard Worker			container: "com.android.foo",
1456*333d2b36SAndroid Build Coastguard Worker			srcs: [
1457*333d2b36SAndroid Build Coastguard Worker				"bar.aconfig",
1458*333d2b36SAndroid Build Coastguard Worker			],
1459*333d2b36SAndroid Build Coastguard Worker		}
1460*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1461*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1462*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.java"],
1463*333d2b36SAndroid Build Coastguard Worker			api_packages: ["foo"],
1464*333d2b36SAndroid Build Coastguard Worker			system: {
1465*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1466*333d2b36SAndroid Build Coastguard Worker			},
1467*333d2b36SAndroid Build Coastguard Worker			module_lib: {
1468*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1469*333d2b36SAndroid Build Coastguard Worker			},
1470*333d2b36SAndroid Build Coastguard Worker			test: {
1471*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1472*333d2b36SAndroid Build Coastguard Worker			},
1473*333d2b36SAndroid Build Coastguard Worker			aconfig_declarations: [
1474*333d2b36SAndroid Build Coastguard Worker				"bar",
1475*333d2b36SAndroid Build Coastguard Worker			],
1476*333d2b36SAndroid Build Coastguard Worker		}
1477*333d2b36SAndroid Build Coastguard Worker	`)
1478*333d2b36SAndroid Build Coastguard Worker
1479*333d2b36SAndroid Build Coastguard Worker	exportableStubsLibraryModuleName := apiScopePublic.exportableStubsLibraryModuleName("foo")
1480*333d2b36SAndroid Build Coastguard Worker	exportableSourceStubsLibraryModuleName := apiScopePublic.exportableSourceStubsLibraryModuleName("foo")
1481*333d2b36SAndroid Build Coastguard Worker
1482*333d2b36SAndroid Build Coastguard Worker	// Check modules generation
1483*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(exportableStubsLibraryModuleName, "android_common")
1484*333d2b36SAndroid Build Coastguard Worker	result.ModuleForTests(exportableSourceStubsLibraryModuleName, "android_common")
1485*333d2b36SAndroid Build Coastguard Worker
1486*333d2b36SAndroid Build Coastguard Worker	// Check static lib dependency
1487*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "exportable top level stubs library module depends on the"+
1488*333d2b36SAndroid Build Coastguard Worker		"exportable source stubs library module", true,
1489*333d2b36SAndroid Build Coastguard Worker		CheckModuleHasDependencyWithTag(t, result.TestContext, exportableStubsLibraryModuleName,
1490*333d2b36SAndroid Build Coastguard Worker			"android_common", staticLibTag, exportableSourceStubsLibraryModuleName),
1491*333d2b36SAndroid Build Coastguard Worker	)
1492*333d2b36SAndroid Build Coastguard Worker}
1493*333d2b36SAndroid Build Coastguard Worker
1494*333d2b36SAndroid Build Coastguard Worker// For java libraries depending on java_sdk_library(_import) via libs, assert that
1495*333d2b36SAndroid Build Coastguard Worker// rdep gets stubs of source if source is listed in apex_contributions and prebuilt has prefer (legacy mechanism)
1496*333d2b36SAndroid Build Coastguard Workerfunc TestStubResolutionOfJavaSdkLibraryInLibs(t *testing.T) {
1497*333d2b36SAndroid Build Coastguard Worker	bp := `
1498*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
1499*333d2b36SAndroid Build Coastguard Worker			name: "my_mainline_module_contributions",
1500*333d2b36SAndroid Build Coastguard Worker			api_domain: "my_mainline_module",
1501*333d2b36SAndroid Build Coastguard Worker			contents: ["sdklib"], // source is selected using apex_contributions, but prebuilt is selected using prefer
1502*333d2b36SAndroid Build Coastguard Worker		}
1503*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1504*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
1505*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1506*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
1507*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
1508*333d2b36SAndroid Build Coastguard Worker			public: {
1509*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1510*333d2b36SAndroid Build Coastguard Worker			},
1511*333d2b36SAndroid Build Coastguard Worker		}
1512*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
1513*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
1514*333d2b36SAndroid Build Coastguard Worker			public: {
1515*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1516*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1517*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1518*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1519*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1520*333d2b36SAndroid Build Coastguard Worker			},
1521*333d2b36SAndroid Build Coastguard Worker			prefer: true, // Set prefer explicitly on the prebuilt. We will assert that rdep gets source in a test case.
1522*333d2b36SAndroid Build Coastguard Worker		}
1523*333d2b36SAndroid Build Coastguard Worker		// rdeps
1524*333d2b36SAndroid Build Coastguard Worker		java_library {
1525*333d2b36SAndroid Build Coastguard Worker			name: "mymodule",
1526*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1527*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
1528*333d2b36SAndroid Build Coastguard Worker			libs: ["sdklib.stubs",], // this should be dynamically resolved to sdklib.stubs (source) or prebuilt_sdklib.stubs (prebuilt)
1529*333d2b36SAndroid Build Coastguard Worker		}
1530*333d2b36SAndroid Build Coastguard Worker	`
1531*333d2b36SAndroid Build Coastguard Worker
1532*333d2b36SAndroid Build Coastguard Worker	fixture := android.GroupFixturePreparers(
1533*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1534*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1535*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("sdklib"),
1536*333d2b36SAndroid Build Coastguard Worker		// We can use any of the apex contribution build flags from build/soong/android/config.go#mainlineApexContributionBuildFlags here
1537*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
1538*333d2b36SAndroid Build Coastguard Worker	)
1539*333d2b36SAndroid Build Coastguard Worker
1540*333d2b36SAndroid Build Coastguard Worker	result := fixture.RunTestWithBp(t, bp)
1541*333d2b36SAndroid Build Coastguard Worker	// Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1542*333d2b36SAndroid Build Coastguard Worker	public := result.ModuleForTests("mymodule", "android_common")
1543*333d2b36SAndroid Build Coastguard Worker	rule := public.Output("javac/mymodule.jar")
1544*333d2b36SAndroid Build Coastguard Worker	inputs := rule.Implicits.Strings()
1545*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar")
1546*333d2b36SAndroid Build Coastguard Worker}
1547*333d2b36SAndroid Build Coastguard Worker
1548*333d2b36SAndroid Build Coastguard Worker// test that rdep gets resolved to the correct version of a java_sdk_library (source or a specific prebuilt)
1549*333d2b36SAndroid Build Coastguard Workerfunc TestMultipleSdkLibraryPrebuilts(t *testing.T) {
1550*333d2b36SAndroid Build Coastguard Worker	bp := `
1551*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
1552*333d2b36SAndroid Build Coastguard Worker			name: "my_mainline_module_contributions",
1553*333d2b36SAndroid Build Coastguard Worker			api_domain: "my_mainline_module",
1554*333d2b36SAndroid Build Coastguard Worker			contents: ["%s"],
1555*333d2b36SAndroid Build Coastguard Worker		}
1556*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1557*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
1558*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1559*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
1560*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
1561*333d2b36SAndroid Build Coastguard Worker			public: {
1562*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1563*333d2b36SAndroid Build Coastguard Worker			},
1564*333d2b36SAndroid Build Coastguard Worker		}
1565*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
1566*333d2b36SAndroid Build Coastguard Worker			name: "sdklib.v1", //prebuilt
1567*333d2b36SAndroid Build Coastguard Worker			source_module_name: "sdklib",
1568*333d2b36SAndroid Build Coastguard Worker			public: {
1569*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1570*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1571*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1572*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1573*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1574*333d2b36SAndroid Build Coastguard Worker			},
1575*333d2b36SAndroid Build Coastguard Worker		}
1576*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
1577*333d2b36SAndroid Build Coastguard Worker			name: "sdklib.v2", //prebuilt
1578*333d2b36SAndroid Build Coastguard Worker			source_module_name: "sdklib",
1579*333d2b36SAndroid Build Coastguard Worker			public: {
1580*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1581*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1582*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1583*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1584*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1585*333d2b36SAndroid Build Coastguard Worker			},
1586*333d2b36SAndroid Build Coastguard Worker		}
1587*333d2b36SAndroid Build Coastguard Worker		// rdeps
1588*333d2b36SAndroid Build Coastguard Worker		java_library {
1589*333d2b36SAndroid Build Coastguard Worker			name: "mymodule",
1590*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1591*333d2b36SAndroid Build Coastguard Worker			libs: ["sdklib.stubs",],
1592*333d2b36SAndroid Build Coastguard Worker		}
1593*333d2b36SAndroid Build Coastguard Worker	`
1594*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1595*333d2b36SAndroid Build Coastguard Worker		desc                   string
1596*333d2b36SAndroid Build Coastguard Worker		selectedDependencyName string
1597*333d2b36SAndroid Build Coastguard Worker		expectedStubPath       string
1598*333d2b36SAndroid Build Coastguard Worker	}{
1599*333d2b36SAndroid Build Coastguard Worker		{
1600*333d2b36SAndroid Build Coastguard Worker			desc:                   "Source library is selected using apex_contributions",
1601*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName: "sdklib",
1602*333d2b36SAndroid Build Coastguard Worker			expectedStubPath:       "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar",
1603*333d2b36SAndroid Build Coastguard Worker		},
1604*333d2b36SAndroid Build Coastguard Worker		{
1605*333d2b36SAndroid Build Coastguard Worker			desc:                   "Prebuilt library v1 is selected using apex_contributions",
1606*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName: "prebuilt_sdklib.v1",
1607*333d2b36SAndroid Build Coastguard Worker			expectedStubPath:       "out/soong/.intermediates/prebuilt_sdklib.v1.stubs/android_common/combined/sdklib.stubs.jar",
1608*333d2b36SAndroid Build Coastguard Worker		},
1609*333d2b36SAndroid Build Coastguard Worker		{
1610*333d2b36SAndroid Build Coastguard Worker			desc:                   "Prebuilt library v2 is selected using apex_contributions",
1611*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName: "prebuilt_sdklib.v2",
1612*333d2b36SAndroid Build Coastguard Worker			expectedStubPath:       "out/soong/.intermediates/prebuilt_sdklib.v2.stubs/android_common/combined/sdklib.stubs.jar",
1613*333d2b36SAndroid Build Coastguard Worker		},
1614*333d2b36SAndroid Build Coastguard Worker	}
1615*333d2b36SAndroid Build Coastguard Worker
1616*333d2b36SAndroid Build Coastguard Worker	fixture := android.GroupFixturePreparers(
1617*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1618*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1619*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("sdklib", "sdklib.v1", "sdklib.v2"),
1620*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
1621*333d2b36SAndroid Build Coastguard Worker	)
1622*333d2b36SAndroid Build Coastguard Worker
1623*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
1624*333d2b36SAndroid Build Coastguard Worker		result := fixture.RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName))
1625*333d2b36SAndroid Build Coastguard Worker
1626*333d2b36SAndroid Build Coastguard Worker		// Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1627*333d2b36SAndroid Build Coastguard Worker		public := result.ModuleForTests("mymodule", "android_common")
1628*333d2b36SAndroid Build Coastguard Worker		rule := public.Output("javac/mymodule.jar")
1629*333d2b36SAndroid Build Coastguard Worker		inputs := rule.Implicits.Strings()
1630*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, tc.expectedStubPath)
1631*333d2b36SAndroid Build Coastguard Worker	}
1632*333d2b36SAndroid Build Coastguard Worker}
1633*333d2b36SAndroid Build Coastguard Worker
1634*333d2b36SAndroid Build Coastguard Workerfunc TestStubLinkType(t *testing.T) {
1635*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
1636*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1637*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1638*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
1639*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
1640*333d2b36SAndroid Build Coastguard Worker		`module "baz" variant "android_common": compiles against system API, but dependency `+
1641*333d2b36SAndroid Build Coastguard Worker			`"bar.stubs.system" is compiling against module API. In order to fix this, `+
1642*333d2b36SAndroid Build Coastguard Worker			`consider adjusting sdk_version: OR platform_apis: property of the source or `+
1643*333d2b36SAndroid Build Coastguard Worker			`target module so that target module is built with the same or smaller API set `+
1644*333d2b36SAndroid Build Coastguard Worker			`when compared to the source.`),
1645*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1646*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1647*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1648*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1649*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
1650*333d2b36SAndroid Build Coastguard Worker		}
1651*333d2b36SAndroid Build Coastguard Worker		java_library {
1652*333d2b36SAndroid Build Coastguard Worker			name: "bar.stubs.system",
1653*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1654*333d2b36SAndroid Build Coastguard Worker			sdk_version: "module_current",
1655*333d2b36SAndroid Build Coastguard Worker			is_stubs_module: false,
1656*333d2b36SAndroid Build Coastguard Worker		}
1657*333d2b36SAndroid Build Coastguard Worker
1658*333d2b36SAndroid Build Coastguard Worker		java_library {
1659*333d2b36SAndroid Build Coastguard Worker			name: "baz",
1660*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
1661*333d2b36SAndroid Build Coastguard Worker			libs: [
1662*333d2b36SAndroid Build Coastguard Worker				"foo.stubs.system",
1663*333d2b36SAndroid Build Coastguard Worker				"bar.stubs.system",
1664*333d2b36SAndroid Build Coastguard Worker			],
1665*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
1666*333d2b36SAndroid Build Coastguard Worker		}
1667*333d2b36SAndroid Build Coastguard Worker		`)
1668*333d2b36SAndroid Build Coastguard Worker}
1669*333d2b36SAndroid Build Coastguard Worker
1670*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibDirectDependency(t *testing.T) {
1671*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
1672*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1673*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1674*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo", "bar"),
1675*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern([]string{
1676*333d2b36SAndroid Build Coastguard Worker		`module "baz" variant "android_common": cannot depend directly on java_sdk_library ` +
1677*333d2b36SAndroid Build Coastguard Worker			`"foo"; try depending on "foo.stubs", or "foo.impl" instead`,
1678*333d2b36SAndroid Build Coastguard Worker		`module "baz" variant "android_common": cannot depend directly on java_sdk_library ` +
1679*333d2b36SAndroid Build Coastguard Worker			`"prebuilt_bar"; try depending on "bar.stubs", or "bar.impl" instead`,
1680*333d2b36SAndroid Build Coastguard Worker	}),
1681*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1682*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1683*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1684*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1685*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
1686*333d2b36SAndroid Build Coastguard Worker			public: {
1687*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1688*333d2b36SAndroid Build Coastguard Worker			},
1689*333d2b36SAndroid Build Coastguard Worker		}
1690*333d2b36SAndroid Build Coastguard Worker
1691*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
1692*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1693*333d2b36SAndroid Build Coastguard Worker			public: {
1694*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1695*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1696*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1697*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1698*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1699*333d2b36SAndroid Build Coastguard Worker			},
1700*333d2b36SAndroid Build Coastguard Worker		}
1701*333d2b36SAndroid Build Coastguard Worker
1702*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1703*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1704*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1705*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
1706*333d2b36SAndroid Build Coastguard Worker			public: {
1707*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1708*333d2b36SAndroid Build Coastguard Worker			},
1709*333d2b36SAndroid Build Coastguard Worker		}
1710*333d2b36SAndroid Build Coastguard Worker
1711*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
1712*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1713*333d2b36SAndroid Build Coastguard Worker			prefer: true,
1714*333d2b36SAndroid Build Coastguard Worker			public: {
1715*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1716*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["a.java"],
1717*333d2b36SAndroid Build Coastguard Worker				current_api: "current.txt",
1718*333d2b36SAndroid Build Coastguard Worker				removed_api: "removed.txt",
1719*333d2b36SAndroid Build Coastguard Worker				annotations: "annotations.zip",
1720*333d2b36SAndroid Build Coastguard Worker			},
1721*333d2b36SAndroid Build Coastguard Worker		}
1722*333d2b36SAndroid Build Coastguard Worker
1723*333d2b36SAndroid Build Coastguard Worker		java_library {
1724*333d2b36SAndroid Build Coastguard Worker			name: "baz",
1725*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
1726*333d2b36SAndroid Build Coastguard Worker			libs: [
1727*333d2b36SAndroid Build Coastguard Worker				"foo",
1728*333d2b36SAndroid Build Coastguard Worker				"bar",
1729*333d2b36SAndroid Build Coastguard Worker			],
1730*333d2b36SAndroid Build Coastguard Worker		}
1731*333d2b36SAndroid Build Coastguard Worker	`)
1732*333d2b36SAndroid Build Coastguard Worker}
1733*333d2b36SAndroid Build Coastguard Worker
1734*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibDirectDependencyWithPrebuiltSdk(t *testing.T) {
1735*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
1736*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1737*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
1738*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1739*333d2b36SAndroid Build Coastguard Worker			variables.Platform_sdk_version = intPtr(34)
1740*333d2b36SAndroid Build Coastguard Worker			variables.Platform_sdk_codename = stringPtr("VanillaIceCream")
1741*333d2b36SAndroid Build Coastguard Worker			variables.Platform_version_active_codenames = []string{"VanillaIceCream"}
1742*333d2b36SAndroid Build Coastguard Worker			variables.Platform_systemsdk_versions = []string{"33", "34", "VanillaIceCream"}
1743*333d2b36SAndroid Build Coastguard Worker			variables.DeviceSystemSdkVersions = []string{"VanillaIceCream"}
1744*333d2b36SAndroid Build Coastguard Worker		}),
1745*333d2b36SAndroid Build Coastguard Worker		FixtureWithPrebuiltApis(map[string][]string{
1746*333d2b36SAndroid Build Coastguard Worker			"33": {"foo"},
1747*333d2b36SAndroid Build Coastguard Worker			"34": {"foo"},
1748*333d2b36SAndroid Build Coastguard Worker			"35": {"foo"},
1749*333d2b36SAndroid Build Coastguard Worker		}),
1750*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
1751*333d2b36SAndroid Build Coastguard Worker		`module "baz" variant "android_common": cannot depend directly on java_sdk_library "foo"; `+
1752*333d2b36SAndroid Build Coastguard Worker			`try depending on "sdk_public_33_foo", "sdk_system_33_foo", "sdk_test_33_foo", `+
1753*333d2b36SAndroid Build Coastguard Worker			`"sdk_module-lib_33_foo", or "sdk_system-server_33_foo" instead`),
1754*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1755*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
1756*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1757*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1758*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
1759*333d2b36SAndroid Build Coastguard Worker			public: {
1760*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1761*333d2b36SAndroid Build Coastguard Worker			},
1762*333d2b36SAndroid Build Coastguard Worker			system: {
1763*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1764*333d2b36SAndroid Build Coastguard Worker			},
1765*333d2b36SAndroid Build Coastguard Worker		}
1766*333d2b36SAndroid Build Coastguard Worker
1767*333d2b36SAndroid Build Coastguard Worker		java_library {
1768*333d2b36SAndroid Build Coastguard Worker			name: "baz",
1769*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
1770*333d2b36SAndroid Build Coastguard Worker			libs: [
1771*333d2b36SAndroid Build Coastguard Worker				"foo",
1772*333d2b36SAndroid Build Coastguard Worker			],
1773*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_33",
1774*333d2b36SAndroid Build Coastguard Worker		}
1775*333d2b36SAndroid Build Coastguard Worker	`)
1776*333d2b36SAndroid Build Coastguard Worker}
1777