xref: /aosp_15_r20/build/soong/java/java_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 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	"os"
20*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
21*333d2b36SAndroid Build Coastguard Worker	"reflect"
22*333d2b36SAndroid Build Coastguard Worker	"runtime"
23*333d2b36SAndroid Build Coastguard Worker	"slices"
24*333d2b36SAndroid Build Coastguard Worker	"strconv"
25*333d2b36SAndroid Build Coastguard Worker	"strings"
26*333d2b36SAndroid Build Coastguard Worker	"testing"
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
29*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Worker	"android/soong/aconfig"
32*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
33*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
34*333d2b36SAndroid Build Coastguard Worker	"android/soong/dexpreopt"
35*333d2b36SAndroid Build Coastguard Worker	"android/soong/genrule"
36*333d2b36SAndroid Build Coastguard Worker)
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker// Legacy preparer used for running tests within the java package.
39*333d2b36SAndroid Build Coastguard Worker//
40*333d2b36SAndroid Build Coastguard Worker// This includes everything that was needed to run any test in the java package prior to the
41*333d2b36SAndroid Build Coastguard Worker// introduction of the test fixtures. Tests that are being converted to use fixtures directly
42*333d2b36SAndroid Build Coastguard Worker// rather than through the testJava...() methods should avoid using this and instead use the
43*333d2b36SAndroid Build Coastguard Worker// various preparers directly, using android.GroupFixturePreparers(...) to group them when
44*333d2b36SAndroid Build Coastguard Worker// necessary.
45*333d2b36SAndroid Build Coastguard Worker//
46*333d2b36SAndroid Build Coastguard Worker// deprecated
47*333d2b36SAndroid Build Coastguard Workervar prepareForJavaTest = android.GroupFixturePreparers(
48*333d2b36SAndroid Build Coastguard Worker	genrule.PrepareForTestWithGenRuleBuildComponents,
49*333d2b36SAndroid Build Coastguard Worker	// Get the CC build components but not default modules.
50*333d2b36SAndroid Build Coastguard Worker	cc.PrepareForTestWithCcBuildComponents,
51*333d2b36SAndroid Build Coastguard Worker	// Include all the default java modules.
52*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithDexpreopt,
53*333d2b36SAndroid Build Coastguard Worker	// Include aconfig modules.
54*333d2b36SAndroid Build Coastguard Worker	aconfig.PrepareForTestWithAconfigBuildComponents,
55*333d2b36SAndroid Build Coastguard Worker)
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) {
58*333d2b36SAndroid Build Coastguard Worker	os.Exit(m.Run())
59*333d2b36SAndroid Build Coastguard Worker}
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Worker// testJavaError is a legacy way of running tests of java modules that expect errors.
62*333d2b36SAndroid Build Coastguard Worker//
63*333d2b36SAndroid Build Coastguard Worker// See testJava for an explanation as to how to stop using this deprecated method.
64*333d2b36SAndroid Build Coastguard Worker//
65*333d2b36SAndroid Build Coastguard Worker// deprecated
66*333d2b36SAndroid Build Coastguard Workerfunc testJavaError(t *testing.T, pattern string, bp string) (*android.TestContext, android.Config) {
67*333d2b36SAndroid Build Coastguard Worker	t.Helper()
68*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
69*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest, dexpreopt.PrepareForTestByEnablingDexpreopt).
70*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
71*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
72*333d2b36SAndroid Build Coastguard Worker	return result.TestContext, result.Config
73*333d2b36SAndroid Build Coastguard Worker}
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker// testJavaWithFS runs tests using the prepareForJavaTest
76*333d2b36SAndroid Build Coastguard Worker//
77*333d2b36SAndroid Build Coastguard Worker// See testJava for an explanation as to how to stop using this deprecated method.
78*333d2b36SAndroid Build Coastguard Worker//
79*333d2b36SAndroid Build Coastguard Worker// deprecated
80*333d2b36SAndroid Build Coastguard Workerfunc testJavaWithFS(t *testing.T, bp string, fs android.MockFS) (*android.TestContext, android.Config) {
81*333d2b36SAndroid Build Coastguard Worker	t.Helper()
82*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
83*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest, fs.AddToFixture()).RunTestWithBp(t, bp)
84*333d2b36SAndroid Build Coastguard Worker	return result.TestContext, result.Config
85*333d2b36SAndroid Build Coastguard Worker}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker// testJava runs tests using the prepareForJavaTest
88*333d2b36SAndroid Build Coastguard Worker//
89*333d2b36SAndroid Build Coastguard Worker// Do not add any new usages of this, instead use the prepareForJavaTest directly as it makes it
90*333d2b36SAndroid Build Coastguard Worker// much easier to customize the test behavior.
91*333d2b36SAndroid Build Coastguard Worker//
92*333d2b36SAndroid Build Coastguard Worker// If it is necessary to customize the behavior of an existing test that uses this then please first
93*333d2b36SAndroid Build Coastguard Worker// convert the test to using prepareForJavaTest first and then in a following change add the
94*333d2b36SAndroid Build Coastguard Worker// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify
95*333d2b36SAndroid Build Coastguard Worker// that it did not change the test behavior unexpectedly.
96*333d2b36SAndroid Build Coastguard Worker//
97*333d2b36SAndroid Build Coastguard Worker// deprecated
98*333d2b36SAndroid Build Coastguard Workerfunc testJava(t *testing.T, bp string) (*android.TestContext, android.Config) {
99*333d2b36SAndroid Build Coastguard Worker	t.Helper()
100*333d2b36SAndroid Build Coastguard Worker	result := prepareForJavaTest.RunTestWithBp(t, bp)
101*333d2b36SAndroid Build Coastguard Worker	return result.TestContext, result.Config
102*333d2b36SAndroid Build Coastguard Worker}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker// defaultModuleToPath constructs a path to the turbine generate jar for a default test module that
105*333d2b36SAndroid Build Coastguard Worker// is defined in PrepareForIntegrationTestWithJava
106*333d2b36SAndroid Build Coastguard Workerfunc defaultModuleToPath(name string) string {
107*333d2b36SAndroid Build Coastguard Worker	switch {
108*333d2b36SAndroid Build Coastguard Worker	case name == `""`:
109*333d2b36SAndroid Build Coastguard Worker		return name
110*333d2b36SAndroid Build Coastguard Worker	case strings.HasSuffix(name, ".jar"):
111*333d2b36SAndroid Build Coastguard Worker		return name
112*333d2b36SAndroid Build Coastguard Worker	default:
113*333d2b36SAndroid Build Coastguard Worker		return filepath.Join("out", "soong", ".intermediates", defaultJavaDir, name, "android_common", "turbine-combined", name+".jar")
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker}
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker// Test that the PrepareForTestWithJavaDefaultModules provides all the files that it uses by
118*333d2b36SAndroid Build Coastguard Worker// running it in a fixture that requires all source files to exist.
119*333d2b36SAndroid Build Coastguard Workerfunc TestPrepareForTestWithJavaDefaultModules(t *testing.T) {
120*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
121*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
122*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestDisallowNonExistentPaths,
123*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLinkType(t *testing.T) {
127*333d2b36SAndroid Build Coastguard Worker	testJava(t, `
128*333d2b36SAndroid Build Coastguard Worker		java_library {
129*333d2b36SAndroid Build Coastguard Worker			name: "foo",
130*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
131*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
132*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
133*333d2b36SAndroid Build Coastguard Worker		}
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker		java_library {
136*333d2b36SAndroid Build Coastguard Worker			name: "bar",
137*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
138*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
139*333d2b36SAndroid Build Coastguard Worker		}
140*333d2b36SAndroid Build Coastguard Worker
141*333d2b36SAndroid Build Coastguard Worker		java_library {
142*333d2b36SAndroid Build Coastguard Worker			name: "baz",
143*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
144*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
145*333d2b36SAndroid Build Coastguard Worker		}
146*333d2b36SAndroid Build Coastguard Worker	`)
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
149*333d2b36SAndroid Build Coastguard Worker		java_library {
150*333d2b36SAndroid Build Coastguard Worker			name: "foo",
151*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
152*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
153*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
154*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
155*333d2b36SAndroid Build Coastguard Worker		}
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Worker		java_library {
158*333d2b36SAndroid Build Coastguard Worker			name: "bar",
159*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
160*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
161*333d2b36SAndroid Build Coastguard Worker		}
162*333d2b36SAndroid Build Coastguard Worker
163*333d2b36SAndroid Build Coastguard Worker		java_library {
164*333d2b36SAndroid Build Coastguard Worker			name: "baz",
165*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
166*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
167*333d2b36SAndroid Build Coastguard Worker		}
168*333d2b36SAndroid Build Coastguard Worker	`)
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker	testJava(t, `
171*333d2b36SAndroid Build Coastguard Worker		java_library {
172*333d2b36SAndroid Build Coastguard Worker			name: "foo",
173*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
174*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
175*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
176*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
177*333d2b36SAndroid Build Coastguard Worker		}
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Worker		java_library {
180*333d2b36SAndroid Build Coastguard Worker			name: "bar",
181*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
182*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
183*333d2b36SAndroid Build Coastguard Worker		}
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Worker		java_library {
186*333d2b36SAndroid Build Coastguard Worker			name: "baz",
187*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
188*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
189*333d2b36SAndroid Build Coastguard Worker		}
190*333d2b36SAndroid Build Coastguard Worker	`)
191*333d2b36SAndroid Build Coastguard Worker
192*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "consider adjusting sdk_version: OR platform_apis:", `
193*333d2b36SAndroid Build Coastguard Worker		java_library {
194*333d2b36SAndroid Build Coastguard Worker			name: "foo",
195*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
196*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
197*333d2b36SAndroid Build Coastguard Worker			sdk_version: "system_current",
198*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
199*333d2b36SAndroid Build Coastguard Worker		}
200*333d2b36SAndroid Build Coastguard Worker
201*333d2b36SAndroid Build Coastguard Worker		java_library {
202*333d2b36SAndroid Build Coastguard Worker			name: "bar",
203*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
204*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
205*333d2b36SAndroid Build Coastguard Worker		}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker		java_library {
208*333d2b36SAndroid Build Coastguard Worker			name: "baz",
209*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
210*333d2b36SAndroid Build Coastguard Worker		}
211*333d2b36SAndroid Build Coastguard Worker	`)
212*333d2b36SAndroid Build Coastguard Worker}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Workerfunc TestSimple(t *testing.T) {
215*333d2b36SAndroid Build Coastguard Worker	bp := `
216*333d2b36SAndroid Build Coastguard Worker		java_library {
217*333d2b36SAndroid Build Coastguard Worker			name: "foo",
218*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
219*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
220*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
221*333d2b36SAndroid Build Coastguard Worker		}
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Worker		java_library {
224*333d2b36SAndroid Build Coastguard Worker			name: "bar",
225*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
226*333d2b36SAndroid Build Coastguard Worker			static_libs: ["quz"],
227*333d2b36SAndroid Build Coastguard Worker		}
228*333d2b36SAndroid Build Coastguard Worker
229*333d2b36SAndroid Build Coastguard Worker		java_library {
230*333d2b36SAndroid Build Coastguard Worker			name: "baz",
231*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
232*333d2b36SAndroid Build Coastguard Worker			static_libs: ["quz"],
233*333d2b36SAndroid Build Coastguard Worker		}
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Worker		java_library {
236*333d2b36SAndroid Build Coastguard Worker			name: "quz",
237*333d2b36SAndroid Build Coastguard Worker			srcs: ["d.java"],
238*333d2b36SAndroid Build Coastguard Worker		}`
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Worker	frameworkTurbineCombinedJars := []string{
241*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/ext/android_common/turbine-combined/ext.jar",
242*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/framework/android_common/turbine-combined/framework.jar",
243*333d2b36SAndroid Build Coastguard Worker	}
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Worker	frameworkTurbineJars := []string{
246*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/ext/android_common/turbine/ext.jar",
247*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/framework/android_common/turbine/framework.jar",
248*333d2b36SAndroid Build Coastguard Worker	}
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
251*333d2b36SAndroid Build Coastguard Worker		name string
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker		preparer android.FixturePreparer
254*333d2b36SAndroid Build Coastguard Worker
255*333d2b36SAndroid Build Coastguard Worker		fooJavacInputs          []string
256*333d2b36SAndroid Build Coastguard Worker		fooJavacClasspath       []string
257*333d2b36SAndroid Build Coastguard Worker		fooCombinedInputs       []string
258*333d2b36SAndroid Build Coastguard Worker		fooHeaderCombinedInputs []string
259*333d2b36SAndroid Build Coastguard Worker
260*333d2b36SAndroid Build Coastguard Worker		barJavacInputs          []string
261*333d2b36SAndroid Build Coastguard Worker		barJavacClasspath       []string
262*333d2b36SAndroid Build Coastguard Worker		barCombinedInputs       []string
263*333d2b36SAndroid Build Coastguard Worker		barHeaderCombinedInputs []string
264*333d2b36SAndroid Build Coastguard Worker	}{
265*333d2b36SAndroid Build Coastguard Worker		{
266*333d2b36SAndroid Build Coastguard Worker			name:           "normal",
267*333d2b36SAndroid Build Coastguard Worker			preparer:       android.NullFixturePreparer,
268*333d2b36SAndroid Build Coastguard Worker			fooJavacInputs: []string{"a.java"},
269*333d2b36SAndroid Build Coastguard Worker			fooJavacClasspath: slices.Concat(
270*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineCombinedJars,
271*333d2b36SAndroid Build Coastguard Worker				[]string{
272*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/bar/android_common/turbine-combined/bar.jar",
273*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/baz/android_common/turbine-combined/baz.jar",
274*333d2b36SAndroid Build Coastguard Worker				},
275*333d2b36SAndroid Build Coastguard Worker			),
276*333d2b36SAndroid Build Coastguard Worker			fooCombinedInputs: []string{
277*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo/android_common/javac/foo.jar",
278*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/baz/android_common/combined/baz.jar",
279*333d2b36SAndroid Build Coastguard Worker			},
280*333d2b36SAndroid Build Coastguard Worker
281*333d2b36SAndroid Build Coastguard Worker			fooHeaderCombinedInputs: []string{
282*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo/android_common/turbine/foo.jar",
283*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/baz/android_common/turbine-combined/baz.jar",
284*333d2b36SAndroid Build Coastguard Worker			},
285*333d2b36SAndroid Build Coastguard Worker
286*333d2b36SAndroid Build Coastguard Worker			barJavacInputs: []string{"b.java"},
287*333d2b36SAndroid Build Coastguard Worker			barJavacClasspath: slices.Concat(
288*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineCombinedJars,
289*333d2b36SAndroid Build Coastguard Worker				[]string{
290*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/turbine-combined/quz.jar",
291*333d2b36SAndroid Build Coastguard Worker				},
292*333d2b36SAndroid Build Coastguard Worker			),
293*333d2b36SAndroid Build Coastguard Worker			barCombinedInputs: []string{
294*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/bar/android_common/javac/bar.jar",
295*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/quz/android_common/javac/quz.jar",
296*333d2b36SAndroid Build Coastguard Worker			},
297*333d2b36SAndroid Build Coastguard Worker			barHeaderCombinedInputs: []string{
298*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/bar/android_common/turbine/bar.jar",
299*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/quz/android_common/turbine-combined/quz.jar",
300*333d2b36SAndroid Build Coastguard Worker			},
301*333d2b36SAndroid Build Coastguard Worker		},
302*333d2b36SAndroid Build Coastguard Worker		{
303*333d2b36SAndroid Build Coastguard Worker			name:           "transitive classpath",
304*333d2b36SAndroid Build Coastguard Worker			preparer:       PrepareForTestWithTransitiveClasspathEnabled,
305*333d2b36SAndroid Build Coastguard Worker			fooJavacInputs: []string{"a.java"},
306*333d2b36SAndroid Build Coastguard Worker			fooJavacClasspath: slices.Concat(
307*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineJars,
308*333d2b36SAndroid Build Coastguard Worker				[]string{
309*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/bar/android_common/turbine/bar.jar",
310*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/turbine/quz.jar",
311*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/baz/android_common/turbine/baz.jar",
312*333d2b36SAndroid Build Coastguard Worker				},
313*333d2b36SAndroid Build Coastguard Worker			),
314*333d2b36SAndroid Build Coastguard Worker			fooCombinedInputs: []string{
315*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo/android_common/javac/foo.jar",
316*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/baz/android_common/javac/baz.jar",
317*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/quz/android_common/javac/quz.jar",
318*333d2b36SAndroid Build Coastguard Worker			},
319*333d2b36SAndroid Build Coastguard Worker
320*333d2b36SAndroid Build Coastguard Worker			fooHeaderCombinedInputs: []string{
321*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/foo/android_common/turbine/foo.jar",
322*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/baz/android_common/turbine/baz.jar",
323*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/quz/android_common/turbine/quz.jar",
324*333d2b36SAndroid Build Coastguard Worker			},
325*333d2b36SAndroid Build Coastguard Worker
326*333d2b36SAndroid Build Coastguard Worker			barJavacInputs: []string{"b.java"},
327*333d2b36SAndroid Build Coastguard Worker			barJavacClasspath: slices.Concat(
328*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineJars,
329*333d2b36SAndroid Build Coastguard Worker				[]string{"out/soong/.intermediates/quz/android_common/turbine/quz.jar"},
330*333d2b36SAndroid Build Coastguard Worker			),
331*333d2b36SAndroid Build Coastguard Worker			barCombinedInputs: []string{
332*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/bar/android_common/javac/bar.jar",
333*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/quz/android_common/javac/quz.jar",
334*333d2b36SAndroid Build Coastguard Worker			},
335*333d2b36SAndroid Build Coastguard Worker			barHeaderCombinedInputs: []string{
336*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/bar/android_common/turbine/bar.jar",
337*333d2b36SAndroid Build Coastguard Worker				"out/soong/.intermediates/quz/android_common/turbine/quz.jar",
338*333d2b36SAndroid Build Coastguard Worker			},
339*333d2b36SAndroid Build Coastguard Worker		},
340*333d2b36SAndroid Build Coastguard Worker	}
341*333d2b36SAndroid Build Coastguard Worker
342*333d2b36SAndroid Build Coastguard Worker	for _, tt := range testCases {
343*333d2b36SAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
344*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
345*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
346*333d2b36SAndroid Build Coastguard Worker				tt.preparer,
347*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, bp)
348*333d2b36SAndroid Build Coastguard Worker			foo := result.ModuleForTests("foo", "android_common")
349*333d2b36SAndroid Build Coastguard Worker
350*333d2b36SAndroid Build Coastguard Worker			fooJavac := foo.Rule("javac")
351*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "foo javac inputs", tt.fooJavacInputs, fooJavac.Inputs)
352*333d2b36SAndroid Build Coastguard Worker
353*333d2b36SAndroid Build Coastguard Worker			fooJavacClasspath := fooJavac.Args["classpath"]
354*333d2b36SAndroid Build Coastguard Worker			android.AssertStringPathsRelativeToTopEquals(t, "foo javac classpath", result.Config, tt.fooJavacClasspath,
355*333d2b36SAndroid Build Coastguard Worker				strings.Split(strings.TrimPrefix(fooJavacClasspath, "-classpath "), ":"))
356*333d2b36SAndroid Build Coastguard Worker
357*333d2b36SAndroid Build Coastguard Worker			fooCombinedJar := foo.Output("combined/foo.jar")
358*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "foo combined inputs", tt.fooCombinedInputs, fooCombinedJar.Inputs)
359*333d2b36SAndroid Build Coastguard Worker
360*333d2b36SAndroid Build Coastguard Worker			fooCombinedHeaderJar := foo.Output("turbine-combined/foo.jar")
361*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "foo header combined inputs", tt.fooHeaderCombinedInputs, fooCombinedHeaderJar.Inputs)
362*333d2b36SAndroid Build Coastguard Worker
363*333d2b36SAndroid Build Coastguard Worker			bar := result.ModuleForTests("bar", "android_common")
364*333d2b36SAndroid Build Coastguard Worker			barJavac := bar.Rule("javac")
365*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "bar javac inputs", tt.barJavacInputs, barJavac.Inputs)
366*333d2b36SAndroid Build Coastguard Worker
367*333d2b36SAndroid Build Coastguard Worker			barJavacClasspath := barJavac.Args["classpath"]
368*333d2b36SAndroid Build Coastguard Worker			android.AssertStringPathsRelativeToTopEquals(t, "bar javac classpath", result.Config, tt.barJavacClasspath,
369*333d2b36SAndroid Build Coastguard Worker				strings.Split(strings.TrimPrefix(barJavacClasspath, "-classpath "), ":"))
370*333d2b36SAndroid Build Coastguard Worker
371*333d2b36SAndroid Build Coastguard Worker			barCombinedJar := bar.Output("combined/bar.jar")
372*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "bar combined inputs", tt.barCombinedInputs, barCombinedJar.Inputs)
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Worker			barCombinedHeaderJar := bar.Output("turbine-combined/bar.jar")
375*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "bar header combined inputs", tt.barHeaderCombinedInputs, barCombinedHeaderJar.Inputs)
376*333d2b36SAndroid Build Coastguard Worker		})
377*333d2b36SAndroid Build Coastguard Worker	}
378*333d2b36SAndroid Build Coastguard Worker}
379*333d2b36SAndroid Build Coastguard Worker
380*333d2b36SAndroid Build Coastguard Workerfunc TestExportedPlugins(t *testing.T) {
381*333d2b36SAndroid Build Coastguard Worker	type Result struct {
382*333d2b36SAndroid Build Coastguard Worker		library        string
383*333d2b36SAndroid Build Coastguard Worker		processors     string
384*333d2b36SAndroid Build Coastguard Worker		disableTurbine bool
385*333d2b36SAndroid Build Coastguard Worker	}
386*333d2b36SAndroid Build Coastguard Worker	var tests = []struct {
387*333d2b36SAndroid Build Coastguard Worker		name    string
388*333d2b36SAndroid Build Coastguard Worker		extra   string
389*333d2b36SAndroid Build Coastguard Worker		results []Result
390*333d2b36SAndroid Build Coastguard Worker	}{
391*333d2b36SAndroid Build Coastguard Worker		{
392*333d2b36SAndroid Build Coastguard Worker			name:    "Exported plugin is not a direct plugin",
393*333d2b36SAndroid Build Coastguard Worker			extra:   `java_library { name: "exports", srcs: ["a.java"], exported_plugins: ["plugin"] }`,
394*333d2b36SAndroid Build Coastguard Worker			results: []Result{{library: "exports", processors: "-proc:none"}},
395*333d2b36SAndroid Build Coastguard Worker		},
396*333d2b36SAndroid Build Coastguard Worker		{
397*333d2b36SAndroid Build Coastguard Worker			name: "Exports plugin to dependee",
398*333d2b36SAndroid Build Coastguard Worker			extra: `
399*333d2b36SAndroid Build Coastguard Worker				java_library{name: "exports", exported_plugins: ["plugin"]}
400*333d2b36SAndroid Build Coastguard Worker				java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
401*333d2b36SAndroid Build Coastguard Worker				java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
402*333d2b36SAndroid Build Coastguard Worker			`,
403*333d2b36SAndroid Build Coastguard Worker			results: []Result{
404*333d2b36SAndroid Build Coastguard Worker				{library: "foo", processors: "-processor com.android.TestPlugin"},
405*333d2b36SAndroid Build Coastguard Worker				{library: "bar", processors: "-processor com.android.TestPlugin"},
406*333d2b36SAndroid Build Coastguard Worker			},
407*333d2b36SAndroid Build Coastguard Worker		},
408*333d2b36SAndroid Build Coastguard Worker		{
409*333d2b36SAndroid Build Coastguard Worker			name: "Exports plugin to android_library",
410*333d2b36SAndroid Build Coastguard Worker			extra: `
411*333d2b36SAndroid Build Coastguard Worker				java_library{name: "exports", exported_plugins: ["plugin"]}
412*333d2b36SAndroid Build Coastguard Worker				android_library{name: "foo", srcs: ["a.java"],  libs: ["exports"]}
413*333d2b36SAndroid Build Coastguard Worker				android_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
414*333d2b36SAndroid Build Coastguard Worker			`,
415*333d2b36SAndroid Build Coastguard Worker			results: []Result{
416*333d2b36SAndroid Build Coastguard Worker				{library: "foo", processors: "-processor com.android.TestPlugin"},
417*333d2b36SAndroid Build Coastguard Worker				{library: "bar", processors: "-processor com.android.TestPlugin"},
418*333d2b36SAndroid Build Coastguard Worker			},
419*333d2b36SAndroid Build Coastguard Worker		},
420*333d2b36SAndroid Build Coastguard Worker		{
421*333d2b36SAndroid Build Coastguard Worker			name: "Exports plugin is not propagated via transitive deps",
422*333d2b36SAndroid Build Coastguard Worker			extra: `
423*333d2b36SAndroid Build Coastguard Worker				java_library{name: "exports", exported_plugins: ["plugin"]}
424*333d2b36SAndroid Build Coastguard Worker				java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
425*333d2b36SAndroid Build Coastguard Worker				java_library{name: "bar", srcs: ["a.java"], static_libs: ["foo"]}
426*333d2b36SAndroid Build Coastguard Worker			`,
427*333d2b36SAndroid Build Coastguard Worker			results: []Result{
428*333d2b36SAndroid Build Coastguard Worker				{library: "foo", processors: "-processor com.android.TestPlugin"},
429*333d2b36SAndroid Build Coastguard Worker				{library: "bar", processors: "-proc:none"},
430*333d2b36SAndroid Build Coastguard Worker			},
431*333d2b36SAndroid Build Coastguard Worker		},
432*333d2b36SAndroid Build Coastguard Worker		{
433*333d2b36SAndroid Build Coastguard Worker			name: "Exports plugin appends to plugins",
434*333d2b36SAndroid Build Coastguard Worker			extra: `
435*333d2b36SAndroid Build Coastguard Worker                java_plugin{name: "plugin2", processor_class: "com.android.TestPlugin2"}
436*333d2b36SAndroid Build Coastguard Worker				java_library{name: "exports", exported_plugins: ["plugin"]}
437*333d2b36SAndroid Build Coastguard Worker				java_library{name: "foo", srcs: ["a.java"], libs: ["exports"], plugins: ["plugin2"]}
438*333d2b36SAndroid Build Coastguard Worker			`,
439*333d2b36SAndroid Build Coastguard Worker			results: []Result{
440*333d2b36SAndroid Build Coastguard Worker				{library: "foo", processors: "-processor com.android.TestPlugin,com.android.TestPlugin2"},
441*333d2b36SAndroid Build Coastguard Worker			},
442*333d2b36SAndroid Build Coastguard Worker		},
443*333d2b36SAndroid Build Coastguard Worker		{
444*333d2b36SAndroid Build Coastguard Worker			name: "Exports plugin to with generates_api to dependee",
445*333d2b36SAndroid Build Coastguard Worker			extra: `
446*333d2b36SAndroid Build Coastguard Worker				java_library{name: "exports", exported_plugins: ["plugin_generates_api"]}
447*333d2b36SAndroid Build Coastguard Worker				java_library{name: "foo", srcs: ["a.java"], libs: ["exports"]}
448*333d2b36SAndroid Build Coastguard Worker				java_library{name: "bar", srcs: ["a.java"], static_libs: ["exports"]}
449*333d2b36SAndroid Build Coastguard Worker			`,
450*333d2b36SAndroid Build Coastguard Worker			results: []Result{
451*333d2b36SAndroid Build Coastguard Worker				{library: "foo", processors: "-processor com.android.TestPlugin", disableTurbine: true},
452*333d2b36SAndroid Build Coastguard Worker				{library: "bar", processors: "-processor com.android.TestPlugin", disableTurbine: true},
453*333d2b36SAndroid Build Coastguard Worker			},
454*333d2b36SAndroid Build Coastguard Worker		},
455*333d2b36SAndroid Build Coastguard Worker	}
456*333d2b36SAndroid Build Coastguard Worker
457*333d2b36SAndroid Build Coastguard Worker	for _, test := range tests {
458*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
459*333d2b36SAndroid Build Coastguard Worker			ctx, _ := testJava(t, `
460*333d2b36SAndroid Build Coastguard Worker				java_plugin {
461*333d2b36SAndroid Build Coastguard Worker					name: "plugin",
462*333d2b36SAndroid Build Coastguard Worker					processor_class: "com.android.TestPlugin",
463*333d2b36SAndroid Build Coastguard Worker				}
464*333d2b36SAndroid Build Coastguard Worker				java_plugin {
465*333d2b36SAndroid Build Coastguard Worker					name: "plugin_generates_api",
466*333d2b36SAndroid Build Coastguard Worker					generates_api: true,
467*333d2b36SAndroid Build Coastguard Worker					processor_class: "com.android.TestPlugin",
468*333d2b36SAndroid Build Coastguard Worker				}
469*333d2b36SAndroid Build Coastguard Worker			`+test.extra)
470*333d2b36SAndroid Build Coastguard Worker
471*333d2b36SAndroid Build Coastguard Worker			for _, want := range test.results {
472*333d2b36SAndroid Build Coastguard Worker				javac := ctx.ModuleForTests(want.library, "android_common").Rule("javac")
473*333d2b36SAndroid Build Coastguard Worker				if javac.Args["processor"] != want.processors {
474*333d2b36SAndroid Build Coastguard Worker					t.Errorf("For library %v, expected %v, found %v", want.library, want.processors, javac.Args["processor"])
475*333d2b36SAndroid Build Coastguard Worker				}
476*333d2b36SAndroid Build Coastguard Worker				turbine := ctx.ModuleForTests(want.library, "android_common").MaybeRule("turbine")
477*333d2b36SAndroid Build Coastguard Worker				disableTurbine := turbine.BuildParams.Rule == nil
478*333d2b36SAndroid Build Coastguard Worker				if disableTurbine != want.disableTurbine {
479*333d2b36SAndroid Build Coastguard Worker					t.Errorf("For library %v, expected disableTurbine %v, found %v", want.library, want.disableTurbine, disableTurbine)
480*333d2b36SAndroid Build Coastguard Worker				}
481*333d2b36SAndroid Build Coastguard Worker			}
482*333d2b36SAndroid Build Coastguard Worker		})
483*333d2b36SAndroid Build Coastguard Worker	}
484*333d2b36SAndroid Build Coastguard Worker}
485*333d2b36SAndroid Build Coastguard Worker
486*333d2b36SAndroid Build Coastguard Workerfunc TestSdkVersionByPartition(t *testing.T) {
487*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
488*333d2b36SAndroid Build Coastguard Worker		java_library {
489*333d2b36SAndroid Build Coastguard Worker			name: "foo",
490*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
491*333d2b36SAndroid Build Coastguard Worker			vendor: true,
492*333d2b36SAndroid Build Coastguard Worker		}
493*333d2b36SAndroid Build Coastguard Worker	`)
494*333d2b36SAndroid Build Coastguard Worker
495*333d2b36SAndroid Build Coastguard Worker	testJava(t, `
496*333d2b36SAndroid Build Coastguard Worker		java_library {
497*333d2b36SAndroid Build Coastguard Worker			name: "bar",
498*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
499*333d2b36SAndroid Build Coastguard Worker		}
500*333d2b36SAndroid Build Coastguard Worker	`)
501*333d2b36SAndroid Build Coastguard Worker
502*333d2b36SAndroid Build Coastguard Worker	for _, enforce := range []bool{true, false} {
503*333d2b36SAndroid Build Coastguard Worker		bp := `
504*333d2b36SAndroid Build Coastguard Worker			java_library {
505*333d2b36SAndroid Build Coastguard Worker				name: "foo",
506*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
507*333d2b36SAndroid Build Coastguard Worker				product_specific: true,
508*333d2b36SAndroid Build Coastguard Worker			}
509*333d2b36SAndroid Build Coastguard Worker		`
510*333d2b36SAndroid Build Coastguard Worker
511*333d2b36SAndroid Build Coastguard Worker		errorHandler := android.FixtureExpectsNoErrors
512*333d2b36SAndroid Build Coastguard Worker		if enforce {
513*333d2b36SAndroid Build Coastguard Worker			errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern("sdk_version must have a value when the module is located at vendor or product")
514*333d2b36SAndroid Build Coastguard Worker		}
515*333d2b36SAndroid Build Coastguard Worker
516*333d2b36SAndroid Build Coastguard Worker		android.GroupFixturePreparers(
517*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
518*333d2b36SAndroid Build Coastguard Worker			android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
519*333d2b36SAndroid Build Coastguard Worker				variables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
520*333d2b36SAndroid Build Coastguard Worker			}),
521*333d2b36SAndroid Build Coastguard Worker		).
522*333d2b36SAndroid Build Coastguard Worker			ExtendWithErrorHandler(errorHandler).
523*333d2b36SAndroid Build Coastguard Worker			RunTestWithBp(t, bp)
524*333d2b36SAndroid Build Coastguard Worker	}
525*333d2b36SAndroid Build Coastguard Worker}
526*333d2b36SAndroid Build Coastguard Worker
527*333d2b36SAndroid Build Coastguard Workerfunc TestArchSpecific(t *testing.T) {
528*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
529*333d2b36SAndroid Build Coastguard Worker		java_library {
530*333d2b36SAndroid Build Coastguard Worker			name: "foo",
531*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
532*333d2b36SAndroid Build Coastguard Worker			target: {
533*333d2b36SAndroid Build Coastguard Worker				android: {
534*333d2b36SAndroid Build Coastguard Worker					srcs: ["b.java"],
535*333d2b36SAndroid Build Coastguard Worker				},
536*333d2b36SAndroid Build Coastguard Worker			},
537*333d2b36SAndroid Build Coastguard Worker		}
538*333d2b36SAndroid Build Coastguard Worker	`)
539*333d2b36SAndroid Build Coastguard Worker
540*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
541*333d2b36SAndroid Build Coastguard Worker	if len(javac.Inputs) != 2 || javac.Inputs[0].String() != "a.java" || javac.Inputs[1].String() != "b.java" {
542*333d2b36SAndroid Build Coastguard Worker		t.Errorf(`foo inputs %v != ["a.java", "b.java"]`, javac.Inputs)
543*333d2b36SAndroid Build Coastguard Worker	}
544*333d2b36SAndroid Build Coastguard Worker}
545*333d2b36SAndroid Build Coastguard Worker
546*333d2b36SAndroid Build Coastguard Workerfunc TestBinary(t *testing.T) {
547*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
548*333d2b36SAndroid Build Coastguard Worker		java_library_host {
549*333d2b36SAndroid Build Coastguard Worker			name: "foo",
550*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
551*333d2b36SAndroid Build Coastguard Worker		}
552*333d2b36SAndroid Build Coastguard Worker
553*333d2b36SAndroid Build Coastguard Worker		java_binary_host {
554*333d2b36SAndroid Build Coastguard Worker			name: "bar",
555*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
556*333d2b36SAndroid Build Coastguard Worker			static_libs: ["foo"],
557*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
558*333d2b36SAndroid Build Coastguard Worker		}
559*333d2b36SAndroid Build Coastguard Worker
560*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
561*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
562*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
563*333d2b36SAndroid Build Coastguard Worker			device_supported: false,
564*333d2b36SAndroid Build Coastguard Worker			stl: "none",
565*333d2b36SAndroid Build Coastguard Worker		}
566*333d2b36SAndroid Build Coastguard Worker	`)
567*333d2b36SAndroid Build Coastguard Worker
568*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
569*333d2b36SAndroid Build Coastguard Worker
570*333d2b36SAndroid Build Coastguard Worker	bar := ctx.ModuleForTests("bar", buildOS+"_common")
571*333d2b36SAndroid Build Coastguard Worker	barJar := bar.Output("bar.jar").Output.String()
572*333d2b36SAndroid Build Coastguard Worker	barWrapperDeps := bar.Output("bar").Implicits.Strings()
573*333d2b36SAndroid Build Coastguard Worker
574*333d2b36SAndroid Build Coastguard Worker	libjni := ctx.ModuleForTests("libjni", buildOS+"_x86_64_shared")
575*333d2b36SAndroid Build Coastguard Worker	libjniSO := libjni.Rule("Cp").Output.String()
576*333d2b36SAndroid Build Coastguard Worker
577*333d2b36SAndroid Build Coastguard Worker	// Test that the install binary wrapper depends on the installed jar file
578*333d2b36SAndroid Build Coastguard Worker	if g, w := barWrapperDeps, barJar; !android.InList(w, g) {
579*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
580*333d2b36SAndroid Build Coastguard Worker	}
581*333d2b36SAndroid Build Coastguard Worker
582*333d2b36SAndroid Build Coastguard Worker	// Test that the install binary wrapper depends on the installed JNI libraries
583*333d2b36SAndroid Build Coastguard Worker	if g, w := barWrapperDeps, libjniSO; !android.InList(w, g) {
584*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g)
585*333d2b36SAndroid Build Coastguard Worker	}
586*333d2b36SAndroid Build Coastguard Worker}
587*333d2b36SAndroid Build Coastguard Worker
588*333d2b36SAndroid Build Coastguard Workerfunc TestTest(t *testing.T) {
589*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
590*333d2b36SAndroid Build Coastguard Worker		java_test_host {
591*333d2b36SAndroid Build Coastguard Worker			name: "foo",
592*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
593*333d2b36SAndroid Build Coastguard Worker			jni_libs: ["libjni"],
594*333d2b36SAndroid Build Coastguard Worker		}
595*333d2b36SAndroid Build Coastguard Worker
596*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
597*333d2b36SAndroid Build Coastguard Worker			name: "libjni",
598*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
599*333d2b36SAndroid Build Coastguard Worker			device_supported: false,
600*333d2b36SAndroid Build Coastguard Worker			stl: "none",
601*333d2b36SAndroid Build Coastguard Worker		}
602*333d2b36SAndroid Build Coastguard Worker	`)
603*333d2b36SAndroid Build Coastguard Worker
604*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
605*333d2b36SAndroid Build Coastguard Worker
606*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
607*333d2b36SAndroid Build Coastguard Worker
608*333d2b36SAndroid Build Coastguard Worker	expected := "lib64/libjni.so"
609*333d2b36SAndroid Build Coastguard Worker	if runtime.GOOS == "darwin" {
610*333d2b36SAndroid Build Coastguard Worker		expected = "lib64/libjni.dylib"
611*333d2b36SAndroid Build Coastguard Worker	}
612*333d2b36SAndroid Build Coastguard Worker
613*333d2b36SAndroid Build Coastguard Worker	fooTestData := foo.data
614*333d2b36SAndroid Build Coastguard Worker	if len(fooTestData) != 1 || fooTestData[0].Rel() != expected {
615*333d2b36SAndroid Build Coastguard Worker		t.Errorf(`expected foo test data relative path [%q], got %q`,
616*333d2b36SAndroid Build Coastguard Worker			expected, fooTestData.Strings())
617*333d2b36SAndroid Build Coastguard Worker	}
618*333d2b36SAndroid Build Coastguard Worker}
619*333d2b36SAndroid Build Coastguard Worker
620*333d2b36SAndroid Build Coastguard Workerfunc TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) {
621*333d2b36SAndroid Build Coastguard Worker	bp := `
622*333d2b36SAndroid Build Coastguard Worker		java_library {
623*333d2b36SAndroid Build Coastguard Worker			name: "target_library",
624*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
625*333d2b36SAndroid Build Coastguard Worker		}
626*333d2b36SAndroid Build Coastguard Worker
627*333d2b36SAndroid Build Coastguard Worker		java_binary_host {
628*333d2b36SAndroid Build Coastguard Worker			name: "host_binary",
629*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
630*333d2b36SAndroid Build Coastguard Worker		}
631*333d2b36SAndroid Build Coastguard Worker	`
632*333d2b36SAndroid Build Coastguard Worker
633*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
634*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
635*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
636*333d2b36SAndroid Build Coastguard Worker			variables.MinimizeJavaDebugInfo = proptools.BoolPtr(true)
637*333d2b36SAndroid Build Coastguard Worker		}),
638*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
639*333d2b36SAndroid Build Coastguard Worker
640*333d2b36SAndroid Build Coastguard Worker	// first, check that the -g flag is added to target modules
641*333d2b36SAndroid Build Coastguard Worker	targetLibrary := result.ModuleForTests("target_library", "android_common")
642*333d2b36SAndroid Build Coastguard Worker	targetJavaFlags := targetLibrary.Module().VariablesForTests()["javacFlags"]
643*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(targetJavaFlags, "-g:source,lines") {
644*333d2b36SAndroid Build Coastguard Worker		t.Errorf("target library javac flags %v should contain "+
645*333d2b36SAndroid Build Coastguard Worker			"-g:source,lines override with MinimizeJavaDebugInfo", targetJavaFlags)
646*333d2b36SAndroid Build Coastguard Worker	}
647*333d2b36SAndroid Build Coastguard Worker
648*333d2b36SAndroid Build Coastguard Worker	// check that -g is not overridden for host modules
649*333d2b36SAndroid Build Coastguard Worker	buildOS := result.Config.BuildOS.String()
650*333d2b36SAndroid Build Coastguard Worker	hostBinary := result.ModuleForTests("host_binary", buildOS+"_common")
651*333d2b36SAndroid Build Coastguard Worker	hostJavaFlags := hostBinary.Module().VariablesForTests()["javacFlags"]
652*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(hostJavaFlags, "-g:source,lines") {
653*333d2b36SAndroid Build Coastguard Worker		t.Errorf("java_binary_host javac flags %v should not have "+
654*333d2b36SAndroid Build Coastguard Worker			"-g:source,lines override with MinimizeJavaDebugInfo", hostJavaFlags)
655*333d2b36SAndroid Build Coastguard Worker	}
656*333d2b36SAndroid Build Coastguard Worker}
657*333d2b36SAndroid Build Coastguard Worker
658*333d2b36SAndroid Build Coastguard Worker// A minimal context object for use with DexJarBuildPath
659*333d2b36SAndroid Build Coastguard Workertype moduleErrorfTestCtx struct {
660*333d2b36SAndroid Build Coastguard Worker}
661*333d2b36SAndroid Build Coastguard Worker
662*333d2b36SAndroid Build Coastguard Workerfunc (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
663*333d2b36SAndroid Build Coastguard Worker}
664*333d2b36SAndroid Build Coastguard Worker
665*333d2b36SAndroid Build Coastguard Workervar _ android.ModuleErrorfContext = (*moduleErrorfTestCtx)(nil)
666*333d2b36SAndroid Build Coastguard Worker
667*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuilts(t *testing.T) {
668*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
669*333d2b36SAndroid Build Coastguard Worker		java_library {
670*333d2b36SAndroid Build Coastguard Worker			name: "foo",
671*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", ":stubs-source"],
672*333d2b36SAndroid Build Coastguard Worker			libs: ["bar", "sdklib.stubs"],
673*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
674*333d2b36SAndroid Build Coastguard Worker		}
675*333d2b36SAndroid Build Coastguard Worker
676*333d2b36SAndroid Build Coastguard Worker		java_import {
677*333d2b36SAndroid Build Coastguard Worker			name: "bar",
678*333d2b36SAndroid Build Coastguard Worker			jars: ["a.jar"],
679*333d2b36SAndroid Build Coastguard Worker		}
680*333d2b36SAndroid Build Coastguard Worker
681*333d2b36SAndroid Build Coastguard Worker		java_import {
682*333d2b36SAndroid Build Coastguard Worker			name: "baz",
683*333d2b36SAndroid Build Coastguard Worker			jars: ["b.jar"],
684*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
685*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
686*333d2b36SAndroid Build Coastguard Worker		}
687*333d2b36SAndroid Build Coastguard Worker
688*333d2b36SAndroid Build Coastguard Worker		dex_import {
689*333d2b36SAndroid Build Coastguard Worker			name: "qux",
690*333d2b36SAndroid Build Coastguard Worker			jars: ["b.jar"],
691*333d2b36SAndroid Build Coastguard Worker		}
692*333d2b36SAndroid Build Coastguard Worker
693*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
694*333d2b36SAndroid Build Coastguard Worker			name: "sdklib",
695*333d2b36SAndroid Build Coastguard Worker			public: {
696*333d2b36SAndroid Build Coastguard Worker				jars: ["c.jar"],
697*333d2b36SAndroid Build Coastguard Worker			},
698*333d2b36SAndroid Build Coastguard Worker		}
699*333d2b36SAndroid Build Coastguard Worker
700*333d2b36SAndroid Build Coastguard Worker		prebuilt_stubs_sources {
701*333d2b36SAndroid Build Coastguard Worker			name: "stubs-source",
702*333d2b36SAndroid Build Coastguard Worker			srcs: ["stubs/sources"],
703*333d2b36SAndroid Build Coastguard Worker		}
704*333d2b36SAndroid Build Coastguard Worker
705*333d2b36SAndroid Build Coastguard Worker		java_test_import {
706*333d2b36SAndroid Build Coastguard Worker			name: "test",
707*333d2b36SAndroid Build Coastguard Worker			jars: ["a.jar"],
708*333d2b36SAndroid Build Coastguard Worker			test_suites: ["cts"],
709*333d2b36SAndroid Build Coastguard Worker			test_config: "AndroidTest.xml",
710*333d2b36SAndroid Build Coastguard Worker		}
711*333d2b36SAndroid Build Coastguard Worker		`)
712*333d2b36SAndroid Build Coastguard Worker
713*333d2b36SAndroid Build Coastguard Worker	fooModule := ctx.ModuleForTests("foo", "android_common")
714*333d2b36SAndroid Build Coastguard Worker	javac := fooModule.Rule("javac")
715*333d2b36SAndroid Build Coastguard Worker	combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
716*333d2b36SAndroid Build Coastguard Worker	barModule := ctx.ModuleForTests("bar", "android_common")
717*333d2b36SAndroid Build Coastguard Worker	barJar := barModule.Output("combined/bar.jar").Output
718*333d2b36SAndroid Build Coastguard Worker	bazModule := ctx.ModuleForTests("baz", "android_common")
719*333d2b36SAndroid Build Coastguard Worker	bazJar := bazModule.Output("combined/baz.jar").Output
720*333d2b36SAndroid Build Coastguard Worker	sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").
721*333d2b36SAndroid Build Coastguard Worker		Output("combined/sdklib.stubs.jar").Output
722*333d2b36SAndroid Build Coastguard Worker
723*333d2b36SAndroid Build Coastguard Worker	fooLibrary := fooModule.Module().(*Library)
724*333d2b36SAndroid Build Coastguard Worker	assertDeepEquals(t, "foo unique sources incorrect",
725*333d2b36SAndroid Build Coastguard Worker		[]string{"a.java"}, fooLibrary.uniqueSrcFiles.Strings())
726*333d2b36SAndroid Build Coastguard Worker
727*333d2b36SAndroid Build Coastguard Worker	assertDeepEquals(t, "foo java source jars incorrect",
728*333d2b36SAndroid Build Coastguard Worker		[]string{".intermediates/stubs-source/android_common/stubs-source-stubs.srcjar"},
729*333d2b36SAndroid Build Coastguard Worker		android.NormalizePathsForTesting(fooLibrary.compiledSrcJars))
730*333d2b36SAndroid Build Coastguard Worker
731*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(javac.Args["classpath"], barJar.String()) {
732*333d2b36SAndroid Build Coastguard Worker		t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barJar.String())
733*333d2b36SAndroid Build Coastguard Worker	}
734*333d2b36SAndroid Build Coastguard Worker
735*333d2b36SAndroid Build Coastguard Worker	errCtx := moduleErrorfTestCtx{}
736*333d2b36SAndroid Build Coastguard Worker	barDexJar := barModule.Module().(*Import).DexJarBuildPath(errCtx)
737*333d2b36SAndroid Build Coastguard Worker	if barDexJar.IsSet() {
738*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bar dex jar build path expected to be set, got %s", barDexJar)
739*333d2b36SAndroid Build Coastguard Worker	}
740*333d2b36SAndroid Build Coastguard Worker
741*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) {
742*333d2b36SAndroid Build Coastguard Worker		t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String())
743*333d2b36SAndroid Build Coastguard Worker	}
744*333d2b36SAndroid Build Coastguard Worker
745*333d2b36SAndroid Build Coastguard Worker	if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != bazJar.String() {
746*333d2b36SAndroid Build Coastguard Worker		t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, bazJar.String())
747*333d2b36SAndroid Build Coastguard Worker	}
748*333d2b36SAndroid Build Coastguard Worker
749*333d2b36SAndroid Build Coastguard Worker	bazDexJar := bazModule.Module().(*Import).DexJarBuildPath(errCtx).Path()
750*333d2b36SAndroid Build Coastguard Worker	expectedDexJar := "out/soong/.intermediates/baz/android_common/dex/baz.jar"
751*333d2b36SAndroid Build Coastguard Worker	android.AssertPathRelativeToTopEquals(t, "baz dex jar build path", expectedDexJar, bazDexJar)
752*333d2b36SAndroid Build Coastguard Worker
753*333d2b36SAndroid Build Coastguard Worker	ctx.ModuleForTests("qux", "android_common").Rule("Cp")
754*333d2b36SAndroid Build Coastguard Worker
755*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, fooModule.Module())[0]
756*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_library", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
757*333d2b36SAndroid Build Coastguard Worker	entries = android.AndroidMkEntriesForTest(t, ctx, barModule.Module())[0]
758*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_import", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
759*333d2b36SAndroid Build Coastguard Worker}
760*333d2b36SAndroid Build Coastguard Worker
761*333d2b36SAndroid Build Coastguard Workerfunc assertDeepEquals(t *testing.T, message string, expected interface{}, actual interface{}) {
762*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expected, actual) {
763*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%s: expected %q, found %q", message, expected, actual)
764*333d2b36SAndroid Build Coastguard Worker	}
765*333d2b36SAndroid Build Coastguard Worker}
766*333d2b36SAndroid Build Coastguard Worker
767*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltStubsSources(t *testing.T) {
768*333d2b36SAndroid Build Coastguard Worker	test := func(t *testing.T, sourcesPath string, expectedInputs []string) {
769*333d2b36SAndroid Build Coastguard Worker		ctx, _ := testJavaWithFS(t, fmt.Sprintf(`
770*333d2b36SAndroid Build Coastguard Workerprebuilt_stubs_sources {
771*333d2b36SAndroid Build Coastguard Worker  name: "stubs-source",
772*333d2b36SAndroid Build Coastguard Worker	srcs: ["%s"],
773*333d2b36SAndroid Build Coastguard Worker}`, sourcesPath), map[string][]byte{
774*333d2b36SAndroid Build Coastguard Worker			"stubs/sources/pkg/A.java": nil,
775*333d2b36SAndroid Build Coastguard Worker			"stubs/sources/pkg/B.java": nil,
776*333d2b36SAndroid Build Coastguard Worker		})
777*333d2b36SAndroid Build Coastguard Worker
778*333d2b36SAndroid Build Coastguard Worker		zipSrc := ctx.ModuleForTests("stubs-source", "android_common").Rule("zip_src")
779*333d2b36SAndroid Build Coastguard Worker		if expected, actual := expectedInputs, zipSrc.Inputs.Strings(); !reflect.DeepEqual(expected, actual) {
780*333d2b36SAndroid Build Coastguard Worker			t.Errorf("mismatch of inputs to soong_zip: expected %q, actual %q", expected, actual)
781*333d2b36SAndroid Build Coastguard Worker		}
782*333d2b36SAndroid Build Coastguard Worker	}
783*333d2b36SAndroid Build Coastguard Worker
784*333d2b36SAndroid Build Coastguard Worker	t.Run("empty/missing directory", func(t *testing.T) {
785*333d2b36SAndroid Build Coastguard Worker		test(t, "empty-directory", nil)
786*333d2b36SAndroid Build Coastguard Worker	})
787*333d2b36SAndroid Build Coastguard Worker
788*333d2b36SAndroid Build Coastguard Worker	t.Run("non-empty set of sources", func(t *testing.T) {
789*333d2b36SAndroid Build Coastguard Worker		test(t, "stubs/sources", []string{
790*333d2b36SAndroid Build Coastguard Worker			"stubs/sources/pkg/A.java",
791*333d2b36SAndroid Build Coastguard Worker			"stubs/sources/pkg/B.java",
792*333d2b36SAndroid Build Coastguard Worker		})
793*333d2b36SAndroid Build Coastguard Worker	})
794*333d2b36SAndroid Build Coastguard Worker}
795*333d2b36SAndroid Build Coastguard Worker
796*333d2b36SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) {
797*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
798*333d2b36SAndroid Build Coastguard Worker		java_defaults {
799*333d2b36SAndroid Build Coastguard Worker			name: "defaults",
800*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
801*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
802*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
803*333d2b36SAndroid Build Coastguard Worker			optimize: {enabled: false},
804*333d2b36SAndroid Build Coastguard Worker		}
805*333d2b36SAndroid Build Coastguard Worker
806*333d2b36SAndroid Build Coastguard Worker		java_library {
807*333d2b36SAndroid Build Coastguard Worker			name: "foo",
808*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
809*333d2b36SAndroid Build Coastguard Worker		}
810*333d2b36SAndroid Build Coastguard Worker
811*333d2b36SAndroid Build Coastguard Worker		java_library {
812*333d2b36SAndroid Build Coastguard Worker			name: "bar",
813*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
814*333d2b36SAndroid Build Coastguard Worker		}
815*333d2b36SAndroid Build Coastguard Worker
816*333d2b36SAndroid Build Coastguard Worker		java_library {
817*333d2b36SAndroid Build Coastguard Worker			name: "baz",
818*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
819*333d2b36SAndroid Build Coastguard Worker		}
820*333d2b36SAndroid Build Coastguard Worker
821*333d2b36SAndroid Build Coastguard Worker		android_test {
822*333d2b36SAndroid Build Coastguard Worker			name: "atestOptimize",
823*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
824*333d2b36SAndroid Build Coastguard Worker			optimize: {enabled: true},
825*333d2b36SAndroid Build Coastguard Worker		}
826*333d2b36SAndroid Build Coastguard Worker
827*333d2b36SAndroid Build Coastguard Worker		android_test {
828*333d2b36SAndroid Build Coastguard Worker			name: "atestNoOptimize",
829*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
830*333d2b36SAndroid Build Coastguard Worker		}
831*333d2b36SAndroid Build Coastguard Worker
832*333d2b36SAndroid Build Coastguard Worker		android_test {
833*333d2b36SAndroid Build Coastguard Worker			name: "atestDefault",
834*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
835*333d2b36SAndroid Build Coastguard Worker		}
836*333d2b36SAndroid Build Coastguard Worker		`)
837*333d2b36SAndroid Build Coastguard Worker
838*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
839*333d2b36SAndroid Build Coastguard Worker	combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
840*333d2b36SAndroid Build Coastguard Worker
841*333d2b36SAndroid Build Coastguard Worker	if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
842*333d2b36SAndroid Build Coastguard Worker		t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
843*333d2b36SAndroid Build Coastguard Worker	}
844*333d2b36SAndroid Build Coastguard Worker
845*333d2b36SAndroid Build Coastguard Worker	barTurbine := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine-combined", "bar.jar")
846*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(javac.Args["classpath"], barTurbine) {
847*333d2b36SAndroid Build Coastguard Worker		t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
848*333d2b36SAndroid Build Coastguard Worker	}
849*333d2b36SAndroid Build Coastguard Worker
850*333d2b36SAndroid Build Coastguard Worker	baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String()
851*333d2b36SAndroid Build Coastguard Worker	if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
852*333d2b36SAndroid Build Coastguard Worker		t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
853*333d2b36SAndroid Build Coastguard Worker	}
854*333d2b36SAndroid Build Coastguard Worker
855*333d2b36SAndroid Build Coastguard Worker	atestOptimize := ctx.ModuleForTests("atestOptimize", "android_common").MaybeRule("r8")
856*333d2b36SAndroid Build Coastguard Worker	if atestOptimize.Output == nil {
857*333d2b36SAndroid Build Coastguard Worker		t.Errorf("atestOptimize should optimize APK")
858*333d2b36SAndroid Build Coastguard Worker	}
859*333d2b36SAndroid Build Coastguard Worker
860*333d2b36SAndroid Build Coastguard Worker	atestNoOptimize := ctx.ModuleForTests("atestNoOptimize", "android_common").MaybeRule("d8")
861*333d2b36SAndroid Build Coastguard Worker	if atestNoOptimize.Output == nil {
862*333d2b36SAndroid Build Coastguard Worker		t.Errorf("atestNoOptimize should not optimize APK")
863*333d2b36SAndroid Build Coastguard Worker	}
864*333d2b36SAndroid Build Coastguard Worker
865*333d2b36SAndroid Build Coastguard Worker	atestDefault := ctx.ModuleForTests("atestDefault", "android_common").MaybeRule("d8")
866*333d2b36SAndroid Build Coastguard Worker	if atestDefault.Output == nil {
867*333d2b36SAndroid Build Coastguard Worker		t.Errorf("atestDefault should not optimize APK")
868*333d2b36SAndroid Build Coastguard Worker	}
869*333d2b36SAndroid Build Coastguard Worker}
870*333d2b36SAndroid Build Coastguard Worker
871*333d2b36SAndroid Build Coastguard Workerfunc TestResources(t *testing.T) {
872*333d2b36SAndroid Build Coastguard Worker	var table = []struct {
873*333d2b36SAndroid Build Coastguard Worker		name  string
874*333d2b36SAndroid Build Coastguard Worker		prop  string
875*333d2b36SAndroid Build Coastguard Worker		extra string
876*333d2b36SAndroid Build Coastguard Worker		args  string
877*333d2b36SAndroid Build Coastguard Worker	}{
878*333d2b36SAndroid Build Coastguard Worker		{
879*333d2b36SAndroid Build Coastguard Worker			// Test that a module with java_resource_dirs includes the files
880*333d2b36SAndroid Build Coastguard Worker			name: "resource dirs",
881*333d2b36SAndroid Build Coastguard Worker			prop: `java_resource_dirs: ["java-res"]`,
882*333d2b36SAndroid Build Coastguard Worker			args: "-C java-res -f java-res/a/a -f java-res/b/b",
883*333d2b36SAndroid Build Coastguard Worker		},
884*333d2b36SAndroid Build Coastguard Worker		{
885*333d2b36SAndroid Build Coastguard Worker			// Test that a module with java_resources includes the files
886*333d2b36SAndroid Build Coastguard Worker			name: "resource files",
887*333d2b36SAndroid Build Coastguard Worker			prop: `java_resources: ["java-res/a/a", "java-res/b/b"]`,
888*333d2b36SAndroid Build Coastguard Worker			args: "-C . -f java-res/a/a -f java-res/b/b",
889*333d2b36SAndroid Build Coastguard Worker		},
890*333d2b36SAndroid Build Coastguard Worker		{
891*333d2b36SAndroid Build Coastguard Worker			// Test that a module with a filegroup in java_resources includes the files with the
892*333d2b36SAndroid Build Coastguard Worker			// path prefix
893*333d2b36SAndroid Build Coastguard Worker			name: "resource filegroup",
894*333d2b36SAndroid Build Coastguard Worker			prop: `java_resources: [":foo-res"]`,
895*333d2b36SAndroid Build Coastguard Worker			extra: `
896*333d2b36SAndroid Build Coastguard Worker				filegroup {
897*333d2b36SAndroid Build Coastguard Worker					name: "foo-res",
898*333d2b36SAndroid Build Coastguard Worker					path: "java-res",
899*333d2b36SAndroid Build Coastguard Worker					srcs: ["java-res/a/a", "java-res/b/b"],
900*333d2b36SAndroid Build Coastguard Worker				}`,
901*333d2b36SAndroid Build Coastguard Worker			args: "-C java-res -f java-res/a/a -f java-res/b/b",
902*333d2b36SAndroid Build Coastguard Worker		},
903*333d2b36SAndroid Build Coastguard Worker		{
904*333d2b36SAndroid Build Coastguard Worker			// Test that a module with wildcards in java_resource_dirs has the correct path prefixes
905*333d2b36SAndroid Build Coastguard Worker			name: "wildcard dirs",
906*333d2b36SAndroid Build Coastguard Worker			prop: `java_resource_dirs: ["java-res/*"]`,
907*333d2b36SAndroid Build Coastguard Worker			args: "-C java-res/a -f java-res/a/a -C java-res/b -f java-res/b/b",
908*333d2b36SAndroid Build Coastguard Worker		},
909*333d2b36SAndroid Build Coastguard Worker		{
910*333d2b36SAndroid Build Coastguard Worker			// Test that a module exclude_java_resource_dirs excludes the files
911*333d2b36SAndroid Build Coastguard Worker			name: "wildcard dirs",
912*333d2b36SAndroid Build Coastguard Worker			prop: `java_resource_dirs: ["java-res/*"], exclude_java_resource_dirs: ["java-res/b"]`,
913*333d2b36SAndroid Build Coastguard Worker			args: "-C java-res/a -f java-res/a/a",
914*333d2b36SAndroid Build Coastguard Worker		},
915*333d2b36SAndroid Build Coastguard Worker		{
916*333d2b36SAndroid Build Coastguard Worker			// Test wildcards in java_resources
917*333d2b36SAndroid Build Coastguard Worker			name: "wildcard files",
918*333d2b36SAndroid Build Coastguard Worker			prop: `java_resources: ["java-res/**/*"]`,
919*333d2b36SAndroid Build Coastguard Worker			args: "-C . -f java-res/a/a -f java-res/b/b",
920*333d2b36SAndroid Build Coastguard Worker		},
921*333d2b36SAndroid Build Coastguard Worker		{
922*333d2b36SAndroid Build Coastguard Worker			// Test exclude_java_resources with java_resources
923*333d2b36SAndroid Build Coastguard Worker			name: "wildcard files with exclude",
924*333d2b36SAndroid Build Coastguard Worker			prop: `java_resources: ["java-res/**/*"], exclude_java_resources: ["java-res/b/*"]`,
925*333d2b36SAndroid Build Coastguard Worker			args: "-C . -f java-res/a/a",
926*333d2b36SAndroid Build Coastguard Worker		},
927*333d2b36SAndroid Build Coastguard Worker		{
928*333d2b36SAndroid Build Coastguard Worker			// Test exclude_java_resources with java_resource_dirs
929*333d2b36SAndroid Build Coastguard Worker			name: "resource dirs with exclude files",
930*333d2b36SAndroid Build Coastguard Worker			prop: `java_resource_dirs: ["java-res"], exclude_java_resources: ["java-res/b/b"]`,
931*333d2b36SAndroid Build Coastguard Worker			args: "-C java-res -f java-res/a/a",
932*333d2b36SAndroid Build Coastguard Worker		},
933*333d2b36SAndroid Build Coastguard Worker		{
934*333d2b36SAndroid Build Coastguard Worker			// Test exclude_java_resource_dirs with java_resource_dirs
935*333d2b36SAndroid Build Coastguard Worker			name: "resource dirs with exclude files",
936*333d2b36SAndroid Build Coastguard Worker			prop: `java_resource_dirs: ["java-res", "java-res2"], exclude_java_resource_dirs: ["java-res2"]`,
937*333d2b36SAndroid Build Coastguard Worker			args: "-C java-res -f java-res/a/a -f java-res/b/b",
938*333d2b36SAndroid Build Coastguard Worker		},
939*333d2b36SAndroid Build Coastguard Worker	}
940*333d2b36SAndroid Build Coastguard Worker
941*333d2b36SAndroid Build Coastguard Worker	for _, test := range table {
942*333d2b36SAndroid Build Coastguard Worker		t.Run(test.name, func(t *testing.T) {
943*333d2b36SAndroid Build Coastguard Worker			ctx, _ := testJavaWithFS(t, `
944*333d2b36SAndroid Build Coastguard Worker				java_library {
945*333d2b36SAndroid Build Coastguard Worker					name: "foo",
946*333d2b36SAndroid Build Coastguard Worker					srcs: [
947*333d2b36SAndroid Build Coastguard Worker						"a.java",
948*333d2b36SAndroid Build Coastguard Worker						"b.java",
949*333d2b36SAndroid Build Coastguard Worker						"c.java",
950*333d2b36SAndroid Build Coastguard Worker					],
951*333d2b36SAndroid Build Coastguard Worker					`+test.prop+`,
952*333d2b36SAndroid Build Coastguard Worker				}
953*333d2b36SAndroid Build Coastguard Worker			`+test.extra,
954*333d2b36SAndroid Build Coastguard Worker				map[string][]byte{
955*333d2b36SAndroid Build Coastguard Worker					"java-res/a/a": nil,
956*333d2b36SAndroid Build Coastguard Worker					"java-res/b/b": nil,
957*333d2b36SAndroid Build Coastguard Worker					"java-res2/a":  nil,
958*333d2b36SAndroid Build Coastguard Worker				},
959*333d2b36SAndroid Build Coastguard Worker			)
960*333d2b36SAndroid Build Coastguard Worker
961*333d2b36SAndroid Build Coastguard Worker			foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
962*333d2b36SAndroid Build Coastguard Worker			fooRes := ctx.ModuleForTests("foo", "android_common").Output("res/foo.jar")
963*333d2b36SAndroid Build Coastguard Worker
964*333d2b36SAndroid Build Coastguard Worker			if !inList(fooRes.Output.String(), foo.Inputs.Strings()) {
965*333d2b36SAndroid Build Coastguard Worker				t.Errorf("foo combined jars %v does not contain %q",
966*333d2b36SAndroid Build Coastguard Worker					foo.Inputs.Strings(), fooRes.Output.String())
967*333d2b36SAndroid Build Coastguard Worker			}
968*333d2b36SAndroid Build Coastguard Worker
969*333d2b36SAndroid Build Coastguard Worker			if fooRes.Args["jarArgs"] != test.args {
970*333d2b36SAndroid Build Coastguard Worker				t.Errorf("foo resource jar args %q is not %q",
971*333d2b36SAndroid Build Coastguard Worker					fooRes.Args["jarArgs"], test.args)
972*333d2b36SAndroid Build Coastguard Worker			}
973*333d2b36SAndroid Build Coastguard Worker		})
974*333d2b36SAndroid Build Coastguard Worker	}
975*333d2b36SAndroid Build Coastguard Worker}
976*333d2b36SAndroid Build Coastguard Worker
977*333d2b36SAndroid Build Coastguard Workerfunc TestIncludeSrcs(t *testing.T) {
978*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJavaWithFS(t, `
979*333d2b36SAndroid Build Coastguard Worker		java_library {
980*333d2b36SAndroid Build Coastguard Worker			name: "foo",
981*333d2b36SAndroid Build Coastguard Worker			srcs: [
982*333d2b36SAndroid Build Coastguard Worker				"a.java",
983*333d2b36SAndroid Build Coastguard Worker				"b.java",
984*333d2b36SAndroid Build Coastguard Worker				"c.java",
985*333d2b36SAndroid Build Coastguard Worker			],
986*333d2b36SAndroid Build Coastguard Worker			include_srcs: true,
987*333d2b36SAndroid Build Coastguard Worker		}
988*333d2b36SAndroid Build Coastguard Worker
989*333d2b36SAndroid Build Coastguard Worker		java_library {
990*333d2b36SAndroid Build Coastguard Worker			name: "bar",
991*333d2b36SAndroid Build Coastguard Worker			srcs: [
992*333d2b36SAndroid Build Coastguard Worker				"a.java",
993*333d2b36SAndroid Build Coastguard Worker				"b.java",
994*333d2b36SAndroid Build Coastguard Worker				"c.java",
995*333d2b36SAndroid Build Coastguard Worker			],
996*333d2b36SAndroid Build Coastguard Worker			java_resource_dirs: ["java-res"],
997*333d2b36SAndroid Build Coastguard Worker			include_srcs: true,
998*333d2b36SAndroid Build Coastguard Worker		}
999*333d2b36SAndroid Build Coastguard Worker	`, map[string][]byte{
1000*333d2b36SAndroid Build Coastguard Worker		"java-res/a/a": nil,
1001*333d2b36SAndroid Build Coastguard Worker		"java-res/b/b": nil,
1002*333d2b36SAndroid Build Coastguard Worker		"java-res2/a":  nil,
1003*333d2b36SAndroid Build Coastguard Worker	})
1004*333d2b36SAndroid Build Coastguard Worker
1005*333d2b36SAndroid Build Coastguard Worker	// Test a library with include_srcs: true
1006*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
1007*333d2b36SAndroid Build Coastguard Worker	fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar")
1008*333d2b36SAndroid Build Coastguard Worker
1009*333d2b36SAndroid Build Coastguard Worker	if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) {
1010*333d2b36SAndroid Build Coastguard Worker		t.Errorf("foo combined jars %v does not contain %q", w, g)
1011*333d2b36SAndroid Build Coastguard Worker	}
1012*333d2b36SAndroid Build Coastguard Worker
1013*333d2b36SAndroid Build Coastguard Worker	if g, w := fooSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
1014*333d2b36SAndroid Build Coastguard Worker		t.Errorf("foo source jar args %q is not %q", w, g)
1015*333d2b36SAndroid Build Coastguard Worker	}
1016*333d2b36SAndroid Build Coastguard Worker
1017*333d2b36SAndroid Build Coastguard Worker	// Test a library with include_srcs: true and resources
1018*333d2b36SAndroid Build Coastguard Worker	bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar")
1019*333d2b36SAndroid Build Coastguard Worker	barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar")
1020*333d2b36SAndroid Build Coastguard Worker	barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar")
1021*333d2b36SAndroid Build Coastguard Worker	barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar")
1022*333d2b36SAndroid Build Coastguard Worker
1023*333d2b36SAndroid Build Coastguard Worker	if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
1024*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bar combined resource jars %v does not contain %q", w, g)
1025*333d2b36SAndroid Build Coastguard Worker	}
1026*333d2b36SAndroid Build Coastguard Worker
1027*333d2b36SAndroid Build Coastguard Worker	if g, w := barRes.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
1028*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bar combined resource jars %v does not contain %q", w, g)
1029*333d2b36SAndroid Build Coastguard Worker	}
1030*333d2b36SAndroid Build Coastguard Worker
1031*333d2b36SAndroid Build Coastguard Worker	if g, w := barResCombined.Output.String(), bar.Inputs.Strings(); !inList(g, w) {
1032*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bar combined jars %v does not contain %q", w, g)
1033*333d2b36SAndroid Build Coastguard Worker	}
1034*333d2b36SAndroid Build Coastguard Worker
1035*333d2b36SAndroid Build Coastguard Worker	if g, w := barSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
1036*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bar source jar args %q is not %q", w, g)
1037*333d2b36SAndroid Build Coastguard Worker	}
1038*333d2b36SAndroid Build Coastguard Worker
1039*333d2b36SAndroid Build Coastguard Worker	if g, w := barRes.Args["jarArgs"], "-C java-res -f java-res/a/a -f java-res/b/b"; g != w {
1040*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bar resource jar args %q is not %q", w, g)
1041*333d2b36SAndroid Build Coastguard Worker	}
1042*333d2b36SAndroid Build Coastguard Worker}
1043*333d2b36SAndroid Build Coastguard Worker
1044*333d2b36SAndroid Build Coastguard Workerfunc TestGeneratedSources(t *testing.T) {
1045*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJavaWithFS(t, `
1046*333d2b36SAndroid Build Coastguard Worker		java_library {
1047*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1048*333d2b36SAndroid Build Coastguard Worker			srcs: [
1049*333d2b36SAndroid Build Coastguard Worker				"a*.java",
1050*333d2b36SAndroid Build Coastguard Worker				":gen",
1051*333d2b36SAndroid Build Coastguard Worker				"b*.java",
1052*333d2b36SAndroid Build Coastguard Worker			],
1053*333d2b36SAndroid Build Coastguard Worker		}
1054*333d2b36SAndroid Build Coastguard Worker
1055*333d2b36SAndroid Build Coastguard Worker		genrule {
1056*333d2b36SAndroid Build Coastguard Worker			name: "gen",
1057*333d2b36SAndroid Build Coastguard Worker			tool_files: ["java-res/a"],
1058*333d2b36SAndroid Build Coastguard Worker			out: ["gen.java"],
1059*333d2b36SAndroid Build Coastguard Worker		}
1060*333d2b36SAndroid Build Coastguard Worker	`, map[string][]byte{
1061*333d2b36SAndroid Build Coastguard Worker		"a.java": nil,
1062*333d2b36SAndroid Build Coastguard Worker		"b.java": nil,
1063*333d2b36SAndroid Build Coastguard Worker	})
1064*333d2b36SAndroid Build Coastguard Worker
1065*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1066*333d2b36SAndroid Build Coastguard Worker	genrule := ctx.ModuleForTests("gen", "").Rule("generator")
1067*333d2b36SAndroid Build Coastguard Worker
1068*333d2b36SAndroid Build Coastguard Worker	if filepath.Base(genrule.Output.String()) != "gen.java" {
1069*333d2b36SAndroid Build Coastguard Worker		t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String())
1070*333d2b36SAndroid Build Coastguard Worker	}
1071*333d2b36SAndroid Build Coastguard Worker
1072*333d2b36SAndroid Build Coastguard Worker	if len(javac.Inputs) != 3 ||
1073*333d2b36SAndroid Build Coastguard Worker		javac.Inputs[0].String() != "a.java" ||
1074*333d2b36SAndroid Build Coastguard Worker		javac.Inputs[1].String() != genrule.Output.String() ||
1075*333d2b36SAndroid Build Coastguard Worker		javac.Inputs[2].String() != "b.java" {
1076*333d2b36SAndroid Build Coastguard Worker		t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs)
1077*333d2b36SAndroid Build Coastguard Worker	}
1078*333d2b36SAndroid Build Coastguard Worker}
1079*333d2b36SAndroid Build Coastguard Worker
1080*333d2b36SAndroid Build Coastguard Workerfunc TestTurbine(t *testing.T) {
1081*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1082*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}})).
1083*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
1084*333d2b36SAndroid Build Coastguard Worker		java_library {
1085*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1086*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1087*333d2b36SAndroid Build Coastguard Worker			sdk_version: "14",
1088*333d2b36SAndroid Build Coastguard Worker		}
1089*333d2b36SAndroid Build Coastguard Worker
1090*333d2b36SAndroid Build Coastguard Worker		java_library {
1091*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1092*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
1093*333d2b36SAndroid Build Coastguard Worker			static_libs: ["foo"],
1094*333d2b36SAndroid Build Coastguard Worker			sdk_version: "14",
1095*333d2b36SAndroid Build Coastguard Worker		}
1096*333d2b36SAndroid Build Coastguard Worker
1097*333d2b36SAndroid Build Coastguard Worker		java_library {
1098*333d2b36SAndroid Build Coastguard Worker			name: "baz",
1099*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
1100*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
1101*333d2b36SAndroid Build Coastguard Worker			sdk_version: "14",
1102*333d2b36SAndroid Build Coastguard Worker		}
1103*333d2b36SAndroid Build Coastguard Worker		`)
1104*333d2b36SAndroid Build Coastguard Worker
1105*333d2b36SAndroid Build Coastguard Worker	fooTurbine := result.ModuleForTests("foo", "android_common").Rule("turbine")
1106*333d2b36SAndroid Build Coastguard Worker	barTurbine := result.ModuleForTests("bar", "android_common").Rule("turbine")
1107*333d2b36SAndroid Build Coastguard Worker	barJavac := result.ModuleForTests("bar", "android_common").Rule("javac")
1108*333d2b36SAndroid Build Coastguard Worker	barTurbineCombined := result.ModuleForTests("bar", "android_common").Description("for turbine")
1109*333d2b36SAndroid Build Coastguard Worker	bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
1110*333d2b36SAndroid Build Coastguard Worker
1111*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "foo inputs", []string{"a.java"}, fooTurbine.Inputs)
1112*333d2b36SAndroid Build Coastguard Worker
1113*333d2b36SAndroid Build Coastguard Worker	fooHeaderJar := filepath.Join("out", "soong", ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
1114*333d2b36SAndroid Build Coastguard Worker	barTurbineJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
1115*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "bar turbine classpath", barTurbine.Args["turbineFlags"], fooHeaderJar)
1116*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "bar javac classpath", barJavac.Args["classpath"], fooHeaderJar)
1117*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "bar turbine combineJar", []string{barTurbineJar, fooHeaderJar}, barTurbineCombined.Inputs)
1118*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "prebuilts/sdk/14/public/android.jar")
1119*333d2b36SAndroid Build Coastguard Worker}
1120*333d2b36SAndroid Build Coastguard Worker
1121*333d2b36SAndroid Build Coastguard Workerfunc TestSharding(t *testing.T) {
1122*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1123*333d2b36SAndroid Build Coastguard Worker		java_library {
1124*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1125*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java","b.java","c.java"],
1126*333d2b36SAndroid Build Coastguard Worker			javac_shard_size: 1
1127*333d2b36SAndroid Build Coastguard Worker		}
1128*333d2b36SAndroid Build Coastguard Worker		`)
1129*333d2b36SAndroid Build Coastguard Worker
1130*333d2b36SAndroid Build Coastguard Worker	barHeaderJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar")
1131*333d2b36SAndroid Build Coastguard Worker	for i := 0; i < 3; i++ {
1132*333d2b36SAndroid Build Coastguard Worker		barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i))
1133*333d2b36SAndroid Build Coastguard Worker		if !strings.HasPrefix(barJavac.Args["classpath"], "-classpath "+barHeaderJar+":") {
1134*333d2b36SAndroid Build Coastguard Worker			t.Errorf("bar javac classpath %v does start with %q", barJavac.Args["classpath"], barHeaderJar)
1135*333d2b36SAndroid Build Coastguard Worker		}
1136*333d2b36SAndroid Build Coastguard Worker	}
1137*333d2b36SAndroid Build Coastguard Worker}
1138*333d2b36SAndroid Build Coastguard Worker
1139*333d2b36SAndroid Build Coastguard Workerfunc TestExcludeFileGroupInSrcs(t *testing.T) {
1140*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1141*333d2b36SAndroid Build Coastguard Worker		java_library {
1142*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1143*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", ":foo-srcs"],
1144*333d2b36SAndroid Build Coastguard Worker			exclude_srcs: ["a.java", ":foo-excludes"],
1145*333d2b36SAndroid Build Coastguard Worker		}
1146*333d2b36SAndroid Build Coastguard Worker
1147*333d2b36SAndroid Build Coastguard Worker		filegroup {
1148*333d2b36SAndroid Build Coastguard Worker			name: "foo-srcs",
1149*333d2b36SAndroid Build Coastguard Worker			srcs: ["java-fg/a.java", "java-fg/b.java", "java-fg/c.java"],
1150*333d2b36SAndroid Build Coastguard Worker		}
1151*333d2b36SAndroid Build Coastguard Worker
1152*333d2b36SAndroid Build Coastguard Worker		filegroup {
1153*333d2b36SAndroid Build Coastguard Worker			name: "foo-excludes",
1154*333d2b36SAndroid Build Coastguard Worker			srcs: ["java-fg/a.java", "java-fg/b.java"],
1155*333d2b36SAndroid Build Coastguard Worker		}
1156*333d2b36SAndroid Build Coastguard Worker	`)
1157*333d2b36SAndroid Build Coastguard Worker
1158*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
1159*333d2b36SAndroid Build Coastguard Worker
1160*333d2b36SAndroid Build Coastguard Worker	if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "java-fg/c.java" {
1161*333d2b36SAndroid Build Coastguard Worker		t.Errorf(`foo inputs %v != ["java-fg/c.java"]`, javac.Inputs)
1162*333d2b36SAndroid Build Coastguard Worker	}
1163*333d2b36SAndroid Build Coastguard Worker}
1164*333d2b36SAndroid Build Coastguard Worker
1165*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibraryOutputFiles(t *testing.T) {
1166*333d2b36SAndroid Build Coastguard Worker	testJavaWithFS(t, "", map[string][]byte{
1167*333d2b36SAndroid Build Coastguard Worker		"libcore/Android.bp": []byte(`
1168*333d2b36SAndroid Build Coastguard Worker				java_library {
1169*333d2b36SAndroid Build Coastguard Worker						name: "core",
1170*333d2b36SAndroid Build Coastguard Worker						sdk_version: "none",
1171*333d2b36SAndroid Build Coastguard Worker						system_modules: "none",
1172*333d2b36SAndroid Build Coastguard Worker				}
1173*333d2b36SAndroid Build Coastguard Worker
1174*333d2b36SAndroid Build Coastguard Worker				filegroup {
1175*333d2b36SAndroid Build Coastguard Worker					name: "core-jar",
1176*333d2b36SAndroid Build Coastguard Worker					device_common_srcs: [":core{.jar}"],
1177*333d2b36SAndroid Build Coastguard Worker				}
1178*333d2b36SAndroid Build Coastguard Worker		`),
1179*333d2b36SAndroid Build Coastguard Worker	})
1180*333d2b36SAndroid Build Coastguard Worker}
1181*333d2b36SAndroid Build Coastguard Worker
1182*333d2b36SAndroid Build Coastguard Workerfunc TestJavaImportOutputFiles(t *testing.T) {
1183*333d2b36SAndroid Build Coastguard Worker	testJavaWithFS(t, "", map[string][]byte{
1184*333d2b36SAndroid Build Coastguard Worker		"libcore/Android.bp": []byte(`
1185*333d2b36SAndroid Build Coastguard Worker				java_import {
1186*333d2b36SAndroid Build Coastguard Worker						name: "core",
1187*333d2b36SAndroid Build Coastguard Worker						sdk_version: "none",
1188*333d2b36SAndroid Build Coastguard Worker				}
1189*333d2b36SAndroid Build Coastguard Worker
1190*333d2b36SAndroid Build Coastguard Worker				filegroup {
1191*333d2b36SAndroid Build Coastguard Worker					name: "core-jar",
1192*333d2b36SAndroid Build Coastguard Worker					device_common_srcs: [":core{.jar}"],
1193*333d2b36SAndroid Build Coastguard Worker				}
1194*333d2b36SAndroid Build Coastguard Worker		`),
1195*333d2b36SAndroid Build Coastguard Worker	})
1196*333d2b36SAndroid Build Coastguard Worker}
1197*333d2b36SAndroid Build Coastguard Worker
1198*333d2b36SAndroid Build Coastguard Workerfunc TestJavaImport(t *testing.T) {
1199*333d2b36SAndroid Build Coastguard Worker	bp := `
1200*333d2b36SAndroid Build Coastguard Worker		java_library {
1201*333d2b36SAndroid Build Coastguard Worker			name: "source_library",
1202*333d2b36SAndroid Build Coastguard Worker			srcs: ["source.java"],
1203*333d2b36SAndroid Build Coastguard Worker		}
1204*333d2b36SAndroid Build Coastguard Worker
1205*333d2b36SAndroid Build Coastguard Worker		java_import {
1206*333d2b36SAndroid Build Coastguard Worker			name: "import_with_no_deps",
1207*333d2b36SAndroid Build Coastguard Worker			jars: ["no_deps.jar"],
1208*333d2b36SAndroid Build Coastguard Worker		}
1209*333d2b36SAndroid Build Coastguard Worker
1210*333d2b36SAndroid Build Coastguard Worker		java_import {
1211*333d2b36SAndroid Build Coastguard Worker			name: "import_with_source_deps",
1212*333d2b36SAndroid Build Coastguard Worker			jars: ["source_deps.jar"],
1213*333d2b36SAndroid Build Coastguard Worker			static_libs: ["source_library"],
1214*333d2b36SAndroid Build Coastguard Worker		}
1215*333d2b36SAndroid Build Coastguard Worker
1216*333d2b36SAndroid Build Coastguard Worker		java_import {
1217*333d2b36SAndroid Build Coastguard Worker			name: "import_with_import_deps",
1218*333d2b36SAndroid Build Coastguard Worker			jars: ["import_deps.jar"],
1219*333d2b36SAndroid Build Coastguard Worker			static_libs: ["import_with_no_deps"],
1220*333d2b36SAndroid Build Coastguard Worker		}
1221*333d2b36SAndroid Build Coastguard Worker	`
1222*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
1223*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
1224*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
1225*333d2b36SAndroid Build Coastguard Worker
1226*333d2b36SAndroid Build Coastguard Worker	source := ctx.ModuleForTests("source_library", "android_common")
1227*333d2b36SAndroid Build Coastguard Worker	sourceJar := source.Output("javac/source_library.jar")
1228*333d2b36SAndroid Build Coastguard Worker	sourceHeaderJar := source.Output("turbine-combined/source_library.jar")
1229*333d2b36SAndroid Build Coastguard Worker	sourceJavaInfo, _ := android.OtherModuleProvider(ctx, source.Module(), JavaInfoProvider)
1230*333d2b36SAndroid Build Coastguard Worker
1231*333d2b36SAndroid Build Coastguard Worker	// The source library produces separate implementation and header jars
1232*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "source library implementation jar",
1233*333d2b36SAndroid Build Coastguard Worker		[]string{sourceJar.Output.String()}, sourceJavaInfo.ImplementationAndResourcesJars)
1234*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "source library header jar",
1235*333d2b36SAndroid Build Coastguard Worker		[]string{sourceHeaderJar.Output.String()}, sourceJavaInfo.HeaderJars)
1236*333d2b36SAndroid Build Coastguard Worker
1237*333d2b36SAndroid Build Coastguard Worker	importWithNoDeps := ctx.ModuleForTests("import_with_no_deps", "android_common")
1238*333d2b36SAndroid Build Coastguard Worker	importWithNoDepsJar := importWithNoDeps.Output("combined/import_with_no_deps.jar")
1239*333d2b36SAndroid Build Coastguard Worker	importWithNoDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithNoDeps.Module(), JavaInfoProvider)
1240*333d2b36SAndroid Build Coastguard Worker
1241*333d2b36SAndroid Build Coastguard Worker	// An import with no deps produces a single jar used as both the header and implementation jar.
1242*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with no deps implementation jar",
1243*333d2b36SAndroid Build Coastguard Worker		[]string{importWithNoDepsJar.Output.String()}, importWithNoDepsJavaInfo.ImplementationAndResourcesJars)
1244*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with no deps header jar",
1245*333d2b36SAndroid Build Coastguard Worker		[]string{importWithNoDepsJar.Output.String()}, importWithNoDepsJavaInfo.HeaderJars)
1246*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with no deps combined inputs",
1247*333d2b36SAndroid Build Coastguard Worker		[]string{"no_deps.jar"}, importWithNoDepsJar.Inputs)
1248*333d2b36SAndroid Build Coastguard Worker
1249*333d2b36SAndroid Build Coastguard Worker	importWithSourceDeps := ctx.ModuleForTests("import_with_source_deps", "android_common")
1250*333d2b36SAndroid Build Coastguard Worker	importWithSourceDepsJar := importWithSourceDeps.Output("combined/import_with_source_deps.jar")
1251*333d2b36SAndroid Build Coastguard Worker	importWithSourceDepsHeaderJar := importWithSourceDeps.Output("turbine-combined/import_with_source_deps.jar")
1252*333d2b36SAndroid Build Coastguard Worker	importWithSourceDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithSourceDeps.Module(), JavaInfoProvider)
1253*333d2b36SAndroid Build Coastguard Worker
1254*333d2b36SAndroid Build Coastguard Worker	// An import with source deps produces separate header and implementation jars.
1255*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with source deps implementation jar",
1256*333d2b36SAndroid Build Coastguard Worker		[]string{importWithSourceDepsJar.Output.String()}, importWithSourceDepsJavaInfo.ImplementationAndResourcesJars)
1257*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with source deps header jar",
1258*333d2b36SAndroid Build Coastguard Worker		[]string{importWithSourceDepsHeaderJar.Output.String()}, importWithSourceDepsJavaInfo.HeaderJars)
1259*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with source deps combined implementation jar inputs",
1260*333d2b36SAndroid Build Coastguard Worker		[]string{"source_deps.jar", sourceJar.Output.String()}, importWithSourceDepsJar.Inputs)
1261*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with source deps combined header jar inputs",
1262*333d2b36SAndroid Build Coastguard Worker		[]string{"source_deps.jar", sourceHeaderJar.Output.String()}, importWithSourceDepsHeaderJar.Inputs)
1263*333d2b36SAndroid Build Coastguard Worker
1264*333d2b36SAndroid Build Coastguard Worker	importWithImportDeps := ctx.ModuleForTests("import_with_import_deps", "android_common")
1265*333d2b36SAndroid Build Coastguard Worker	importWithImportDepsJar := importWithImportDeps.Output("combined/import_with_import_deps.jar")
1266*333d2b36SAndroid Build Coastguard Worker	importWithImportDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithImportDeps.Module(), JavaInfoProvider)
1267*333d2b36SAndroid Build Coastguard Worker
1268*333d2b36SAndroid Build Coastguard Worker	// An import with only import deps produces a single jar used as both the header and implementation jar.
1269*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with import deps implementation jar",
1270*333d2b36SAndroid Build Coastguard Worker		[]string{importWithImportDepsJar.Output.String()}, importWithImportDepsJavaInfo.ImplementationAndResourcesJars)
1271*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with import deps header jar",
1272*333d2b36SAndroid Build Coastguard Worker		[]string{importWithImportDepsJar.Output.String()}, importWithImportDepsJavaInfo.HeaderJars)
1273*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "import with import deps combined implementation jar inputs",
1274*333d2b36SAndroid Build Coastguard Worker		[]string{"import_deps.jar", importWithNoDepsJar.Output.String()}, importWithImportDepsJar.Inputs)
1275*333d2b36SAndroid Build Coastguard Worker}
1276*333d2b36SAndroid Build Coastguard Worker
1277*333d2b36SAndroid Build Coastguard Workervar compilerFlagsTestCases = []struct {
1278*333d2b36SAndroid Build Coastguard Worker	in  string
1279*333d2b36SAndroid Build Coastguard Worker	out bool
1280*333d2b36SAndroid Build Coastguard Worker}{
1281*333d2b36SAndroid Build Coastguard Worker	{
1282*333d2b36SAndroid Build Coastguard Worker		in:  "a",
1283*333d2b36SAndroid Build Coastguard Worker		out: false,
1284*333d2b36SAndroid Build Coastguard Worker	},
1285*333d2b36SAndroid Build Coastguard Worker	{
1286*333d2b36SAndroid Build Coastguard Worker		in:  "-a",
1287*333d2b36SAndroid Build Coastguard Worker		out: true,
1288*333d2b36SAndroid Build Coastguard Worker	},
1289*333d2b36SAndroid Build Coastguard Worker	{
1290*333d2b36SAndroid Build Coastguard Worker		in:  "-no-jdk",
1291*333d2b36SAndroid Build Coastguard Worker		out: false,
1292*333d2b36SAndroid Build Coastguard Worker	},
1293*333d2b36SAndroid Build Coastguard Worker	{
1294*333d2b36SAndroid Build Coastguard Worker		in:  "-no-stdlib",
1295*333d2b36SAndroid Build Coastguard Worker		out: false,
1296*333d2b36SAndroid Build Coastguard Worker	},
1297*333d2b36SAndroid Build Coastguard Worker	{
1298*333d2b36SAndroid Build Coastguard Worker		in:  "-kotlin-home",
1299*333d2b36SAndroid Build Coastguard Worker		out: false,
1300*333d2b36SAndroid Build Coastguard Worker	},
1301*333d2b36SAndroid Build Coastguard Worker	{
1302*333d2b36SAndroid Build Coastguard Worker		in:  "-kotlin-home /some/path",
1303*333d2b36SAndroid Build Coastguard Worker		out: false,
1304*333d2b36SAndroid Build Coastguard Worker	},
1305*333d2b36SAndroid Build Coastguard Worker	{
1306*333d2b36SAndroid Build Coastguard Worker		in:  "-include-runtime",
1307*333d2b36SAndroid Build Coastguard Worker		out: false,
1308*333d2b36SAndroid Build Coastguard Worker	},
1309*333d2b36SAndroid Build Coastguard Worker	{
1310*333d2b36SAndroid Build Coastguard Worker		in:  "-Xintellij-plugin-root",
1311*333d2b36SAndroid Build Coastguard Worker		out: false,
1312*333d2b36SAndroid Build Coastguard Worker	},
1313*333d2b36SAndroid Build Coastguard Worker}
1314*333d2b36SAndroid Build Coastguard Worker
1315*333d2b36SAndroid Build Coastguard Workertype mockContext struct {
1316*333d2b36SAndroid Build Coastguard Worker	android.ModuleContext
1317*333d2b36SAndroid Build Coastguard Worker	result bool
1318*333d2b36SAndroid Build Coastguard Worker}
1319*333d2b36SAndroid Build Coastguard Worker
1320*333d2b36SAndroid Build Coastguard Workerfunc (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) {
1321*333d2b36SAndroid Build Coastguard Worker	// CheckBadCompilerFlags calls this function when the flag should be rejected
1322*333d2b36SAndroid Build Coastguard Worker	ctx.result = false
1323*333d2b36SAndroid Build Coastguard Worker}
1324*333d2b36SAndroid Build Coastguard Worker
1325*333d2b36SAndroid Build Coastguard Workerfunc TestCompilerFlags(t *testing.T) {
1326*333d2b36SAndroid Build Coastguard Worker	for _, testCase := range compilerFlagsTestCases {
1327*333d2b36SAndroid Build Coastguard Worker		ctx := &mockContext{result: true}
1328*333d2b36SAndroid Build Coastguard Worker		CheckKotlincFlags(ctx, []string{testCase.in})
1329*333d2b36SAndroid Build Coastguard Worker		if ctx.result != testCase.out {
1330*333d2b36SAndroid Build Coastguard Worker			t.Errorf("incorrect output:")
1331*333d2b36SAndroid Build Coastguard Worker			t.Errorf("     input: %#v", testCase.in)
1332*333d2b36SAndroid Build Coastguard Worker			t.Errorf("  expected: %#v", testCase.out)
1333*333d2b36SAndroid Build Coastguard Worker			t.Errorf("       got: %#v", ctx.result)
1334*333d2b36SAndroid Build Coastguard Worker		}
1335*333d2b36SAndroid Build Coastguard Worker	}
1336*333d2b36SAndroid Build Coastguard Worker}
1337*333d2b36SAndroid Build Coastguard Worker
1338*333d2b36SAndroid Build Coastguard Worker// TODO(jungjw): Consider making this more robust by ignoring path order.
1339*333d2b36SAndroid Build Coastguard Workerfunc checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) {
1340*333d2b36SAndroid Build Coastguard Worker	variables := ctx.ModuleForTests(moduleName, "android_common").VariablesForTestsRelativeToTop()
1341*333d2b36SAndroid Build Coastguard Worker	flags := strings.Split(variables["javacFlags"], " ")
1342*333d2b36SAndroid Build Coastguard Worker	got := ""
1343*333d2b36SAndroid Build Coastguard Worker	for _, flag := range flags {
1344*333d2b36SAndroid Build Coastguard Worker		keyEnd := strings.Index(flag, "=")
1345*333d2b36SAndroid Build Coastguard Worker		if keyEnd > -1 && flag[:keyEnd] == "--patch-module" {
1346*333d2b36SAndroid Build Coastguard Worker			got = flag[keyEnd+1:]
1347*333d2b36SAndroid Build Coastguard Worker			break
1348*333d2b36SAndroid Build Coastguard Worker		}
1349*333d2b36SAndroid Build Coastguard Worker	}
1350*333d2b36SAndroid Build Coastguard Worker	if expected != android.StringPathRelativeToTop(ctx.Config().SoongOutDir(), got) {
1351*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Unexpected patch-module flag for module %q - expected %q, but got %q", moduleName, expected, got)
1352*333d2b36SAndroid Build Coastguard Worker	}
1353*333d2b36SAndroid Build Coastguard Worker}
1354*333d2b36SAndroid Build Coastguard Worker
1355*333d2b36SAndroid Build Coastguard Workerfunc TestPatchModule(t *testing.T) {
1356*333d2b36SAndroid Build Coastguard Worker	t.Run("Java language level 8", func(t *testing.T) {
1357*333d2b36SAndroid Build Coastguard Worker		// Test with legacy javac -source 1.8 -target 1.8
1358*333d2b36SAndroid Build Coastguard Worker		bp := `
1359*333d2b36SAndroid Build Coastguard Worker			java_library {
1360*333d2b36SAndroid Build Coastguard Worker				name: "foo",
1361*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1362*333d2b36SAndroid Build Coastguard Worker				java_version: "1.8",
1363*333d2b36SAndroid Build Coastguard Worker			}
1364*333d2b36SAndroid Build Coastguard Worker
1365*333d2b36SAndroid Build Coastguard Worker			java_library {
1366*333d2b36SAndroid Build Coastguard Worker				name: "bar",
1367*333d2b36SAndroid Build Coastguard Worker				srcs: ["b.java"],
1368*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
1369*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
1370*333d2b36SAndroid Build Coastguard Worker				patch_module: "java.base",
1371*333d2b36SAndroid Build Coastguard Worker				java_version: "1.8",
1372*333d2b36SAndroid Build Coastguard Worker			}
1373*333d2b36SAndroid Build Coastguard Worker
1374*333d2b36SAndroid Build Coastguard Worker			java_library {
1375*333d2b36SAndroid Build Coastguard Worker				name: "baz",
1376*333d2b36SAndroid Build Coastguard Worker				srcs: ["c.java"],
1377*333d2b36SAndroid Build Coastguard Worker				patch_module: "java.base",
1378*333d2b36SAndroid Build Coastguard Worker				java_version: "1.8",
1379*333d2b36SAndroid Build Coastguard Worker			}
1380*333d2b36SAndroid Build Coastguard Worker		`
1381*333d2b36SAndroid Build Coastguard Worker		ctx, _ := testJava(t, bp)
1382*333d2b36SAndroid Build Coastguard Worker
1383*333d2b36SAndroid Build Coastguard Worker		checkPatchModuleFlag(t, ctx, "foo", "")
1384*333d2b36SAndroid Build Coastguard Worker		checkPatchModuleFlag(t, ctx, "bar", "")
1385*333d2b36SAndroid Build Coastguard Worker		checkPatchModuleFlag(t, ctx, "baz", "")
1386*333d2b36SAndroid Build Coastguard Worker	})
1387*333d2b36SAndroid Build Coastguard Worker
1388*333d2b36SAndroid Build Coastguard Worker	t.Run("Java language level 9", func(t *testing.T) {
1389*333d2b36SAndroid Build Coastguard Worker		// Test with default javac -source 9 -target 9
1390*333d2b36SAndroid Build Coastguard Worker		bp := `
1391*333d2b36SAndroid Build Coastguard Worker			java_library {
1392*333d2b36SAndroid Build Coastguard Worker				name: "foo",
1393*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
1394*333d2b36SAndroid Build Coastguard Worker			}
1395*333d2b36SAndroid Build Coastguard Worker
1396*333d2b36SAndroid Build Coastguard Worker			java_library {
1397*333d2b36SAndroid Build Coastguard Worker				name: "bar",
1398*333d2b36SAndroid Build Coastguard Worker				srcs: ["b.java"],
1399*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
1400*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
1401*333d2b36SAndroid Build Coastguard Worker				patch_module: "java.base",
1402*333d2b36SAndroid Build Coastguard Worker			}
1403*333d2b36SAndroid Build Coastguard Worker
1404*333d2b36SAndroid Build Coastguard Worker			java_library {
1405*333d2b36SAndroid Build Coastguard Worker				name: "baz",
1406*333d2b36SAndroid Build Coastguard Worker				srcs: [
1407*333d2b36SAndroid Build Coastguard Worker					"c.java",
1408*333d2b36SAndroid Build Coastguard Worker					// Tests for b/150878007
1409*333d2b36SAndroid Build Coastguard Worker					"dir/d.java",
1410*333d2b36SAndroid Build Coastguard Worker					"dir2/e.java",
1411*333d2b36SAndroid Build Coastguard Worker					"dir2/f.java",
1412*333d2b36SAndroid Build Coastguard Worker					"nested/dir/g.java"
1413*333d2b36SAndroid Build Coastguard Worker				],
1414*333d2b36SAndroid Build Coastguard Worker				patch_module: "java.base",
1415*333d2b36SAndroid Build Coastguard Worker			}
1416*333d2b36SAndroid Build Coastguard Worker		`
1417*333d2b36SAndroid Build Coastguard Worker		ctx, _ := testJava(t, bp)
1418*333d2b36SAndroid Build Coastguard Worker
1419*333d2b36SAndroid Build Coastguard Worker		checkPatchModuleFlag(t, ctx, "foo", "")
1420*333d2b36SAndroid Build Coastguard Worker		expected := "java.base=.:out/soong"
1421*333d2b36SAndroid Build Coastguard Worker		checkPatchModuleFlag(t, ctx, "bar", expected)
1422*333d2b36SAndroid Build Coastguard Worker		expected = "java.base=" + strings.Join([]string{
1423*333d2b36SAndroid Build Coastguard Worker			".", "out/soong", defaultModuleToPath("ext"), defaultModuleToPath("framework")}, ":")
1424*333d2b36SAndroid Build Coastguard Worker		checkPatchModuleFlag(t, ctx, "baz", expected)
1425*333d2b36SAndroid Build Coastguard Worker	})
1426*333d2b36SAndroid Build Coastguard Worker}
1427*333d2b36SAndroid Build Coastguard Worker
1428*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibraryWithSystemModules(t *testing.T) {
1429*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1430*333d2b36SAndroid Build Coastguard Worker		java_library {
1431*333d2b36SAndroid Build Coastguard Worker		    name: "lib-with-source-system-modules",
1432*333d2b36SAndroid Build Coastguard Worker		    srcs: [
1433*333d2b36SAndroid Build Coastguard Worker		        "a.java",
1434*333d2b36SAndroid Build Coastguard Worker		    ],
1435*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
1436*333d2b36SAndroid Build Coastguard Worker				system_modules: "source-system-modules",
1437*333d2b36SAndroid Build Coastguard Worker		}
1438*333d2b36SAndroid Build Coastguard Worker
1439*333d2b36SAndroid Build Coastguard Worker		java_library {
1440*333d2b36SAndroid Build Coastguard Worker				name: "source-jar",
1441*333d2b36SAndroid Build Coastguard Worker		    srcs: [
1442*333d2b36SAndroid Build Coastguard Worker		        "a.java",
1443*333d2b36SAndroid Build Coastguard Worker		    ],
1444*333d2b36SAndroid Build Coastguard Worker		}
1445*333d2b36SAndroid Build Coastguard Worker
1446*333d2b36SAndroid Build Coastguard Worker		java_system_modules {
1447*333d2b36SAndroid Build Coastguard Worker				name: "source-system-modules",
1448*333d2b36SAndroid Build Coastguard Worker				libs: ["source-jar"],
1449*333d2b36SAndroid Build Coastguard Worker		}
1450*333d2b36SAndroid Build Coastguard Worker
1451*333d2b36SAndroid Build Coastguard Worker		java_library {
1452*333d2b36SAndroid Build Coastguard Worker		    name: "lib-with-prebuilt-system-modules",
1453*333d2b36SAndroid Build Coastguard Worker		    srcs: [
1454*333d2b36SAndroid Build Coastguard Worker		        "a.java",
1455*333d2b36SAndroid Build Coastguard Worker		    ],
1456*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
1457*333d2b36SAndroid Build Coastguard Worker				system_modules: "prebuilt-system-modules",
1458*333d2b36SAndroid Build Coastguard Worker		}
1459*333d2b36SAndroid Build Coastguard Worker
1460*333d2b36SAndroid Build Coastguard Worker		java_import {
1461*333d2b36SAndroid Build Coastguard Worker				name: "prebuilt-jar",
1462*333d2b36SAndroid Build Coastguard Worker				jars: ["a.jar"],
1463*333d2b36SAndroid Build Coastguard Worker		}
1464*333d2b36SAndroid Build Coastguard Worker
1465*333d2b36SAndroid Build Coastguard Worker		java_system_modules_import {
1466*333d2b36SAndroid Build Coastguard Worker				name: "prebuilt-system-modules",
1467*333d2b36SAndroid Build Coastguard Worker				libs: ["prebuilt-jar"],
1468*333d2b36SAndroid Build Coastguard Worker		}
1469*333d2b36SAndroid Build Coastguard Worker		`)
1470*333d2b36SAndroid Build Coastguard Worker
1471*333d2b36SAndroid Build Coastguard Worker	checkBootClasspathForLibWithSystemModule(t, ctx, "lib-with-source-system-modules", "/source-jar.jar")
1472*333d2b36SAndroid Build Coastguard Worker
1473*333d2b36SAndroid Build Coastguard Worker	checkBootClasspathForLibWithSystemModule(t, ctx, "lib-with-prebuilt-system-modules", "/prebuilt-jar.jar")
1474*333d2b36SAndroid Build Coastguard Worker}
1475*333d2b36SAndroid Build Coastguard Worker
1476*333d2b36SAndroid Build Coastguard Workerfunc checkBootClasspathForLibWithSystemModule(t *testing.T, ctx *android.TestContext, moduleName string, expectedSuffix string) {
1477*333d2b36SAndroid Build Coastguard Worker	javacRule := ctx.ModuleForTests(moduleName, "android_common").Rule("javac")
1478*333d2b36SAndroid Build Coastguard Worker	bootClasspath := javacRule.Args["bootClasspath"]
1479*333d2b36SAndroid Build Coastguard Worker	if strings.HasPrefix(bootClasspath, "--system ") && strings.HasSuffix(bootClasspath, expectedSuffix) {
1480*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bootclasspath of %q must start with --system and end with %q, but was %#v.", moduleName, expectedSuffix, bootClasspath)
1481*333d2b36SAndroid Build Coastguard Worker	}
1482*333d2b36SAndroid Build Coastguard Worker}
1483*333d2b36SAndroid Build Coastguard Worker
1484*333d2b36SAndroid Build Coastguard Workerfunc TestAidlExportIncludeDirsFromImports(t *testing.T) {
1485*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1486*333d2b36SAndroid Build Coastguard Worker		java_library {
1487*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1488*333d2b36SAndroid Build Coastguard Worker			srcs: ["aidl/foo/IFoo.aidl"],
1489*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
1490*333d2b36SAndroid Build Coastguard Worker		}
1491*333d2b36SAndroid Build Coastguard Worker
1492*333d2b36SAndroid Build Coastguard Worker		java_import {
1493*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1494*333d2b36SAndroid Build Coastguard Worker			jars: ["a.jar"],
1495*333d2b36SAndroid Build Coastguard Worker			aidl: {
1496*333d2b36SAndroid Build Coastguard Worker				export_include_dirs: ["aidl/bar"],
1497*333d2b36SAndroid Build Coastguard Worker			},
1498*333d2b36SAndroid Build Coastguard Worker		}
1499*333d2b36SAndroid Build Coastguard Worker	`)
1500*333d2b36SAndroid Build Coastguard Worker
1501*333d2b36SAndroid Build Coastguard Worker	aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1502*333d2b36SAndroid Build Coastguard Worker	expectedAidlFlag := "-Iaidl/bar"
1503*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(aidlCommand, expectedAidlFlag) {
1504*333d2b36SAndroid Build Coastguard Worker		t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1505*333d2b36SAndroid Build Coastguard Worker	}
1506*333d2b36SAndroid Build Coastguard Worker}
1507*333d2b36SAndroid Build Coastguard Worker
1508*333d2b36SAndroid Build Coastguard Workerfunc TestAidlFlagsArePassedToTheAidlCompiler(t *testing.T) {
1509*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1510*333d2b36SAndroid Build Coastguard Worker		java_library {
1511*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1512*333d2b36SAndroid Build Coastguard Worker			srcs: ["aidl/foo/IFoo.aidl"],
1513*333d2b36SAndroid Build Coastguard Worker			aidl: { flags: ["-Werror"], },
1514*333d2b36SAndroid Build Coastguard Worker		}
1515*333d2b36SAndroid Build Coastguard Worker	`)
1516*333d2b36SAndroid Build Coastguard Worker
1517*333d2b36SAndroid Build Coastguard Worker	aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1518*333d2b36SAndroid Build Coastguard Worker	expectedAidlFlag := "-Werror"
1519*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(aidlCommand, expectedAidlFlag) {
1520*333d2b36SAndroid Build Coastguard Worker		t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1521*333d2b36SAndroid Build Coastguard Worker	}
1522*333d2b36SAndroid Build Coastguard Worker}
1523*333d2b36SAndroid Build Coastguard Worker
1524*333d2b36SAndroid Build Coastguard Workerfunc TestAidlFlagsWithMinSdkVersion(t *testing.T) {
1525*333d2b36SAndroid Build Coastguard Worker	fixture := android.GroupFixturePreparers(
1526*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest, FixtureWithPrebuiltApis(map[string][]string{"14": {"foo"}}))
1527*333d2b36SAndroid Build Coastguard Worker
1528*333d2b36SAndroid Build Coastguard Worker	for _, tc := range []struct {
1529*333d2b36SAndroid Build Coastguard Worker		name       string
1530*333d2b36SAndroid Build Coastguard Worker		sdkVersion string
1531*333d2b36SAndroid Build Coastguard Worker		expected   string
1532*333d2b36SAndroid Build Coastguard Worker	}{
1533*333d2b36SAndroid Build Coastguard Worker		{"default is current", "", "current"},
1534*333d2b36SAndroid Build Coastguard Worker		{"use sdk_version", `sdk_version: "14"`, "14"},
1535*333d2b36SAndroid Build Coastguard Worker		{"system_current", `sdk_version: "system_current"`, "current"},
1536*333d2b36SAndroid Build Coastguard Worker	} {
1537*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
1538*333d2b36SAndroid Build Coastguard Worker			ctx := fixture.RunTestWithBp(t, `
1539*333d2b36SAndroid Build Coastguard Worker				java_library {
1540*333d2b36SAndroid Build Coastguard Worker					name: "foo",
1541*333d2b36SAndroid Build Coastguard Worker					srcs: ["aidl/foo/IFoo.aidl"],
1542*333d2b36SAndroid Build Coastguard Worker					`+tc.sdkVersion+`
1543*333d2b36SAndroid Build Coastguard Worker				}
1544*333d2b36SAndroid Build Coastguard Worker			`)
1545*333d2b36SAndroid Build Coastguard Worker			aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1546*333d2b36SAndroid Build Coastguard Worker			expectedAidlFlag := "--min_sdk_version=" + tc.expected
1547*333d2b36SAndroid Build Coastguard Worker			if !strings.Contains(aidlCommand, expectedAidlFlag) {
1548*333d2b36SAndroid Build Coastguard Worker				t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1549*333d2b36SAndroid Build Coastguard Worker			}
1550*333d2b36SAndroid Build Coastguard Worker		})
1551*333d2b36SAndroid Build Coastguard Worker	}
1552*333d2b36SAndroid Build Coastguard Worker}
1553*333d2b36SAndroid Build Coastguard Worker
1554*333d2b36SAndroid Build Coastguard Workerfunc TestAidlFlagsMinSdkVersionDroidstubs(t *testing.T) {
1555*333d2b36SAndroid Build Coastguard Worker	bpTemplate := `
1556*333d2b36SAndroid Build Coastguard Worker	droidstubs {
1557*333d2b36SAndroid Build Coastguard Worker		name: "foo-stubs",
1558*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo.aidl"],
1559*333d2b36SAndroid Build Coastguard Worker		%s
1560*333d2b36SAndroid Build Coastguard Worker		system_modules: "none",
1561*333d2b36SAndroid Build Coastguard Worker	}
1562*333d2b36SAndroid Build Coastguard Worker	`
1563*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1564*333d2b36SAndroid Build Coastguard Worker		desc                  string
1565*333d2b36SAndroid Build Coastguard Worker		sdkVersionBp          string
1566*333d2b36SAndroid Build Coastguard Worker		minSdkVersionExpected string
1567*333d2b36SAndroid Build Coastguard Worker	}{
1568*333d2b36SAndroid Build Coastguard Worker		{
1569*333d2b36SAndroid Build Coastguard Worker			desc:                  "sdk_version not set, module compiles against private platform APIs",
1570*333d2b36SAndroid Build Coastguard Worker			sdkVersionBp:          ``,
1571*333d2b36SAndroid Build Coastguard Worker			minSdkVersionExpected: "10000",
1572*333d2b36SAndroid Build Coastguard Worker		},
1573*333d2b36SAndroid Build Coastguard Worker		{
1574*333d2b36SAndroid Build Coastguard Worker			desc:                  "sdk_version set to none, module does not build against an SDK",
1575*333d2b36SAndroid Build Coastguard Worker			sdkVersionBp:          `sdk_version: "none",`,
1576*333d2b36SAndroid Build Coastguard Worker			minSdkVersionExpected: "10000",
1577*333d2b36SAndroid Build Coastguard Worker		},
1578*333d2b36SAndroid Build Coastguard Worker	}
1579*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
1580*333d2b36SAndroid Build Coastguard Worker		ctx := prepareForJavaTest.RunTestWithBp(t, fmt.Sprintf(bpTemplate, tc.sdkVersionBp))
1581*333d2b36SAndroid Build Coastguard Worker		aidlCmd := ctx.ModuleForTests("foo-stubs", "android_common").Rule("aidl").RuleParams.Command
1582*333d2b36SAndroid Build Coastguard Worker		expected := "--min_sdk_version=" + tc.minSdkVersionExpected
1583*333d2b36SAndroid Build Coastguard Worker		android.AssertStringDoesContain(t, "aidl command conatins incorrect min_sdk_version for testCse: "+tc.desc, aidlCmd, expected)
1584*333d2b36SAndroid Build Coastguard Worker	}
1585*333d2b36SAndroid Build Coastguard Worker}
1586*333d2b36SAndroid Build Coastguard Worker
1587*333d2b36SAndroid Build Coastguard Workerfunc TestAidlEnforcePermissions(t *testing.T) {
1588*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1589*333d2b36SAndroid Build Coastguard Worker		java_library {
1590*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1591*333d2b36SAndroid Build Coastguard Worker			srcs: ["aidl/foo/IFoo.aidl"],
1592*333d2b36SAndroid Build Coastguard Worker			aidl: { enforce_permissions: true },
1593*333d2b36SAndroid Build Coastguard Worker		}
1594*333d2b36SAndroid Build Coastguard Worker	`)
1595*333d2b36SAndroid Build Coastguard Worker
1596*333d2b36SAndroid Build Coastguard Worker	aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1597*333d2b36SAndroid Build Coastguard Worker	expectedAidlFlag := "-Wmissing-permission-annotation -Werror"
1598*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(aidlCommand, expectedAidlFlag) {
1599*333d2b36SAndroid Build Coastguard Worker		t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1600*333d2b36SAndroid Build Coastguard Worker	}
1601*333d2b36SAndroid Build Coastguard Worker}
1602*333d2b36SAndroid Build Coastguard Worker
1603*333d2b36SAndroid Build Coastguard Workerfunc TestAidlEnforcePermissionsException(t *testing.T) {
1604*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1605*333d2b36SAndroid Build Coastguard Worker		java_library {
1606*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1607*333d2b36SAndroid Build Coastguard Worker			srcs: ["aidl/foo/IFoo.aidl", "aidl/foo/IFoo2.aidl"],
1608*333d2b36SAndroid Build Coastguard Worker			aidl: { enforce_permissions: true, enforce_permissions_exceptions: ["aidl/foo/IFoo2.aidl"] },
1609*333d2b36SAndroid Build Coastguard Worker		}
1610*333d2b36SAndroid Build Coastguard Worker	`)
1611*333d2b36SAndroid Build Coastguard Worker
1612*333d2b36SAndroid Build Coastguard Worker	aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command
1613*333d2b36SAndroid Build Coastguard Worker	expectedAidlFlag := "$$FLAGS -Wmissing-permission-annotation -Werror aidl/foo/IFoo.aidl"
1614*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(aidlCommand, expectedAidlFlag) {
1615*333d2b36SAndroid Build Coastguard Worker		t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1616*333d2b36SAndroid Build Coastguard Worker	}
1617*333d2b36SAndroid Build Coastguard Worker	expectedAidlFlag = "$$FLAGS  aidl/foo/IFoo2.aidl"
1618*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(aidlCommand, expectedAidlFlag) {
1619*333d2b36SAndroid Build Coastguard Worker		t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag)
1620*333d2b36SAndroid Build Coastguard Worker	}
1621*333d2b36SAndroid Build Coastguard Worker}
1622*333d2b36SAndroid Build Coastguard Worker
1623*333d2b36SAndroid Build Coastguard Workerfunc TestDataNativeBinaries(t *testing.T) {
1624*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
1625*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1626*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithAllowMissingDependencies).RunTestWithBp(t, `
1627*333d2b36SAndroid Build Coastguard Worker		java_test_host {
1628*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1629*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1630*333d2b36SAndroid Build Coastguard Worker			data_native_bins: ["bin"]
1631*333d2b36SAndroid Build Coastguard Worker		}
1632*333d2b36SAndroid Build Coastguard Worker
1633*333d2b36SAndroid Build Coastguard Worker		cc_binary_host {
1634*333d2b36SAndroid Build Coastguard Worker			name: "bin",
1635*333d2b36SAndroid Build Coastguard Worker			srcs: ["bin.cpp"],
1636*333d2b36SAndroid Build Coastguard Worker		}
1637*333d2b36SAndroid Build Coastguard Worker	`).TestContext
1638*333d2b36SAndroid Build Coastguard Worker
1639*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
1640*333d2b36SAndroid Build Coastguard Worker
1641*333d2b36SAndroid Build Coastguard Worker	test := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
1642*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, test)[0]
1643*333d2b36SAndroid Build Coastguard Worker	expected := []string{"out/soong/.intermediates/bin/" + buildOS + "_x86_64/bin:bin"}
1644*333d2b36SAndroid Build Coastguard Worker	actual := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
1645*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_COMPATIBILITY_SUPPORT_FILES", ctx.Config(), expected, actual)
1646*333d2b36SAndroid Build Coastguard Worker}
1647*333d2b36SAndroid Build Coastguard Worker
1648*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultInstallable(t *testing.T) {
1649*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1650*333d2b36SAndroid Build Coastguard Worker		java_test_host {
1651*333d2b36SAndroid Build Coastguard Worker			name: "foo"
1652*333d2b36SAndroid Build Coastguard Worker		}
1653*333d2b36SAndroid Build Coastguard Worker	`)
1654*333d2b36SAndroid Build Coastguard Worker
1655*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
1656*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost)
1657*333d2b36SAndroid Build Coastguard Worker	assertDeepEquals(t, "Default installable value should be true.", proptools.BoolPtr(true),
1658*333d2b36SAndroid Build Coastguard Worker		module.properties.Installable)
1659*333d2b36SAndroid Build Coastguard Worker}
1660*333d2b36SAndroid Build Coastguard Worker
1661*333d2b36SAndroid Build Coastguard Workerfunc TestErrorproneEnabled(t *testing.T) {
1662*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1663*333d2b36SAndroid Build Coastguard Worker		java_library {
1664*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1665*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1666*333d2b36SAndroid Build Coastguard Worker			errorprone: {
1667*333d2b36SAndroid Build Coastguard Worker				enabled: true,
1668*333d2b36SAndroid Build Coastguard Worker			},
1669*333d2b36SAndroid Build Coastguard Worker		}
1670*333d2b36SAndroid Build Coastguard Worker	`)
1671*333d2b36SAndroid Build Coastguard Worker
1672*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1673*333d2b36SAndroid Build Coastguard Worker
1674*333d2b36SAndroid Build Coastguard Worker	// Test that the errorprone plugins are passed to javac
1675*333d2b36SAndroid Build Coastguard Worker	expectedSubstring := "-Xplugin:ErrorProne"
1676*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1677*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected javacFlags to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1678*333d2b36SAndroid Build Coastguard Worker	}
1679*333d2b36SAndroid Build Coastguard Worker
1680*333d2b36SAndroid Build Coastguard Worker	// Modules with errorprone { enabled: true } will include errorprone checks
1681*333d2b36SAndroid Build Coastguard Worker	// in the main javac build rule. Only when RUN_ERROR_PRONE is true will
1682*333d2b36SAndroid Build Coastguard Worker	// the explicit errorprone build rule be created.
1683*333d2b36SAndroid Build Coastguard Worker	errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone")
1684*333d2b36SAndroid Build Coastguard Worker	if errorprone.RuleParams.Description != "" {
1685*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected errorprone build rule to not exist, but it did")
1686*333d2b36SAndroid Build Coastguard Worker	}
1687*333d2b36SAndroid Build Coastguard Worker}
1688*333d2b36SAndroid Build Coastguard Worker
1689*333d2b36SAndroid Build Coastguard Workerfunc TestErrorproneDisabled(t *testing.T) {
1690*333d2b36SAndroid Build Coastguard Worker	bp := `
1691*333d2b36SAndroid Build Coastguard Worker		java_library {
1692*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1693*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1694*333d2b36SAndroid Build Coastguard Worker			errorprone: {
1695*333d2b36SAndroid Build Coastguard Worker				enabled: false,
1696*333d2b36SAndroid Build Coastguard Worker			},
1697*333d2b36SAndroid Build Coastguard Worker		}
1698*333d2b36SAndroid Build Coastguard Worker	`
1699*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
1700*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
1701*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(map[string]string{
1702*333d2b36SAndroid Build Coastguard Worker			"RUN_ERROR_PRONE": "true",
1703*333d2b36SAndroid Build Coastguard Worker		}),
1704*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
1705*333d2b36SAndroid Build Coastguard Worker
1706*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1707*333d2b36SAndroid Build Coastguard Worker
1708*333d2b36SAndroid Build Coastguard Worker	// Test that the errorprone plugins are not passed to javac, like they would
1709*333d2b36SAndroid Build Coastguard Worker	// be if enabled was true.
1710*333d2b36SAndroid Build Coastguard Worker	expectedSubstring := "-Xplugin:ErrorProne"
1711*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1712*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1713*333d2b36SAndroid Build Coastguard Worker	}
1714*333d2b36SAndroid Build Coastguard Worker
1715*333d2b36SAndroid Build Coastguard Worker	// Check that no errorprone build rule is created, like there would be
1716*333d2b36SAndroid Build Coastguard Worker	// if enabled was unset and RUN_ERROR_PRONE was true.
1717*333d2b36SAndroid Build Coastguard Worker	errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone")
1718*333d2b36SAndroid Build Coastguard Worker	if errorprone.RuleParams.Description != "" {
1719*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected errorprone build rule to not exist, but it did")
1720*333d2b36SAndroid Build Coastguard Worker	}
1721*333d2b36SAndroid Build Coastguard Worker}
1722*333d2b36SAndroid Build Coastguard Worker
1723*333d2b36SAndroid Build Coastguard Workerfunc TestErrorproneEnabledOnlyByEnvironmentVariable(t *testing.T) {
1724*333d2b36SAndroid Build Coastguard Worker	bp := `
1725*333d2b36SAndroid Build Coastguard Worker		java_library {
1726*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1727*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
1728*333d2b36SAndroid Build Coastguard Worker		}
1729*333d2b36SAndroid Build Coastguard Worker	`
1730*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
1731*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
1732*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(map[string]string{
1733*333d2b36SAndroid Build Coastguard Worker			"RUN_ERROR_PRONE": "true",
1734*333d2b36SAndroid Build Coastguard Worker		}),
1735*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
1736*333d2b36SAndroid Build Coastguard Worker
1737*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("foo", "android_common").Description("javac")
1738*333d2b36SAndroid Build Coastguard Worker	errorprone := ctx.ModuleForTests("foo", "android_common").Description("errorprone")
1739*333d2b36SAndroid Build Coastguard Worker
1740*333d2b36SAndroid Build Coastguard Worker	// Check that the errorprone plugins are not passed to javac, because they
1741*333d2b36SAndroid Build Coastguard Worker	// will instead be passed to the separate errorprone compilation
1742*333d2b36SAndroid Build Coastguard Worker	expectedSubstring := "-Xplugin:ErrorProne"
1743*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(javac.Args["javacFlags"], expectedSubstring) {
1744*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected javacFlags to not contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1745*333d2b36SAndroid Build Coastguard Worker	}
1746*333d2b36SAndroid Build Coastguard Worker
1747*333d2b36SAndroid Build Coastguard Worker	// Check that the errorprone plugin is enabled
1748*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(errorprone.Args["javacFlags"], expectedSubstring) {
1749*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected errorprone to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"])
1750*333d2b36SAndroid Build Coastguard Worker	}
1751*333d2b36SAndroid Build Coastguard Worker}
1752*333d2b36SAndroid Build Coastguard Worker
1753*333d2b36SAndroid Build Coastguard Workerfunc TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) {
1754*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1755*333d2b36SAndroid Build Coastguard Worker		dataDeviceBinType  string
1756*333d2b36SAndroid Build Coastguard Worker		depCompileMultilib string
1757*333d2b36SAndroid Build Coastguard Worker		variants           []string
1758*333d2b36SAndroid Build Coastguard Worker		expectedError      string
1759*333d2b36SAndroid Build Coastguard Worker	}{
1760*333d2b36SAndroid Build Coastguard Worker		{
1761*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "first",
1762*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "first",
1763*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm64_armv8-a"},
1764*333d2b36SAndroid Build Coastguard Worker		},
1765*333d2b36SAndroid Build Coastguard Worker		{
1766*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "first",
1767*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "both",
1768*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm64_armv8-a"},
1769*333d2b36SAndroid Build Coastguard Worker		},
1770*333d2b36SAndroid Build Coastguard Worker		{
1771*333d2b36SAndroid Build Coastguard Worker			// this is true because our testing framework is set up with
1772*333d2b36SAndroid Build Coastguard Worker			// Targets ~ [<64bit target>, <32bit target>], where 64bit is "first"
1773*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "first",
1774*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "32",
1775*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1776*333d2b36SAndroid Build Coastguard Worker		},
1777*333d2b36SAndroid Build Coastguard Worker		{
1778*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "first",
1779*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "64",
1780*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm64_armv8-a"},
1781*333d2b36SAndroid Build Coastguard Worker		},
1782*333d2b36SAndroid Build Coastguard Worker		{
1783*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "both",
1784*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "both",
1785*333d2b36SAndroid Build Coastguard Worker			variants: []string{
1786*333d2b36SAndroid Build Coastguard Worker				"android_arm_armv7-a-neon",
1787*333d2b36SAndroid Build Coastguard Worker				"android_arm64_armv8-a",
1788*333d2b36SAndroid Build Coastguard Worker			},
1789*333d2b36SAndroid Build Coastguard Worker		},
1790*333d2b36SAndroid Build Coastguard Worker		{
1791*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "both",
1792*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "32",
1793*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1794*333d2b36SAndroid Build Coastguard Worker		},
1795*333d2b36SAndroid Build Coastguard Worker		{
1796*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "both",
1797*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "64",
1798*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1799*333d2b36SAndroid Build Coastguard Worker		},
1800*333d2b36SAndroid Build Coastguard Worker		{
1801*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "both",
1802*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "first",
1803*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1804*333d2b36SAndroid Build Coastguard Worker		},
1805*333d2b36SAndroid Build Coastguard Worker		{
1806*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "32",
1807*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "32",
1808*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm_armv7-a-neon"},
1809*333d2b36SAndroid Build Coastguard Worker		},
1810*333d2b36SAndroid Build Coastguard Worker		{
1811*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "32",
1812*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "first",
1813*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1814*333d2b36SAndroid Build Coastguard Worker		},
1815*333d2b36SAndroid Build Coastguard Worker		{
1816*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "32",
1817*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "both",
1818*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm_armv7-a-neon"},
1819*333d2b36SAndroid Build Coastguard Worker		},
1820*333d2b36SAndroid Build Coastguard Worker		{
1821*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "32",
1822*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "64",
1823*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1824*333d2b36SAndroid Build Coastguard Worker		},
1825*333d2b36SAndroid Build Coastguard Worker		{
1826*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "64",
1827*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "64",
1828*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm64_armv8-a"},
1829*333d2b36SAndroid Build Coastguard Worker		},
1830*333d2b36SAndroid Build Coastguard Worker		{
1831*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "64",
1832*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "both",
1833*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm64_armv8-a"},
1834*333d2b36SAndroid Build Coastguard Worker		},
1835*333d2b36SAndroid Build Coastguard Worker		{
1836*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "64",
1837*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "first",
1838*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm64_armv8-a"},
1839*333d2b36SAndroid Build Coastguard Worker		},
1840*333d2b36SAndroid Build Coastguard Worker		{
1841*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "64",
1842*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "32",
1843*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1844*333d2b36SAndroid Build Coastguard Worker		},
1845*333d2b36SAndroid Build Coastguard Worker		{
1846*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "prefer32",
1847*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "32",
1848*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm_armv7-a-neon"},
1849*333d2b36SAndroid Build Coastguard Worker		},
1850*333d2b36SAndroid Build Coastguard Worker		{
1851*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "prefer32",
1852*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "both",
1853*333d2b36SAndroid Build Coastguard Worker			variants:           []string{"android_arm_armv7-a-neon"},
1854*333d2b36SAndroid Build Coastguard Worker		},
1855*333d2b36SAndroid Build Coastguard Worker		{
1856*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "prefer32",
1857*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "first",
1858*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1859*333d2b36SAndroid Build Coastguard Worker		},
1860*333d2b36SAndroid Build Coastguard Worker		{
1861*333d2b36SAndroid Build Coastguard Worker			dataDeviceBinType:  "prefer32",
1862*333d2b36SAndroid Build Coastguard Worker			depCompileMultilib: "64",
1863*333d2b36SAndroid Build Coastguard Worker			expectedError:      `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
1864*333d2b36SAndroid Build Coastguard Worker		},
1865*333d2b36SAndroid Build Coastguard Worker	}
1866*333d2b36SAndroid Build Coastguard Worker
1867*333d2b36SAndroid Build Coastguard Worker	bpTemplate := `
1868*333d2b36SAndroid Build Coastguard Worker		java_test_host {
1869*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1870*333d2b36SAndroid Build Coastguard Worker			srcs: ["test.java"],
1871*333d2b36SAndroid Build Coastguard Worker			data_device_bins_%s: ["bar"],
1872*333d2b36SAndroid Build Coastguard Worker		}
1873*333d2b36SAndroid Build Coastguard Worker
1874*333d2b36SAndroid Build Coastguard Worker		cc_binary {
1875*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1876*333d2b36SAndroid Build Coastguard Worker			compile_multilib: "%s",
1877*333d2b36SAndroid Build Coastguard Worker		}
1878*333d2b36SAndroid Build Coastguard Worker	`
1879*333d2b36SAndroid Build Coastguard Worker
1880*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
1881*333d2b36SAndroid Build Coastguard Worker		bp := fmt.Sprintf(bpTemplate, tc.dataDeviceBinType, tc.depCompileMultilib)
1882*333d2b36SAndroid Build Coastguard Worker
1883*333d2b36SAndroid Build Coastguard Worker		errorHandler := android.FixtureExpectsNoErrors
1884*333d2b36SAndroid Build Coastguard Worker		if tc.expectedError != "" {
1885*333d2b36SAndroid Build Coastguard Worker			errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
1886*333d2b36SAndroid Build Coastguard Worker		}
1887*333d2b36SAndroid Build Coastguard Worker
1888*333d2b36SAndroid Build Coastguard Worker		testName := fmt.Sprintf(`data_device_bins_%s with compile_multilib:"%s"`, tc.dataDeviceBinType, tc.depCompileMultilib)
1889*333d2b36SAndroid Build Coastguard Worker		t.Run(testName, func(t *testing.T) {
1890*333d2b36SAndroid Build Coastguard Worker			ctx := android.GroupFixturePreparers(PrepareForIntegrationTestWithJava).
1891*333d2b36SAndroid Build Coastguard Worker				ExtendWithErrorHandler(errorHandler).
1892*333d2b36SAndroid Build Coastguard Worker				RunTestWithBp(t, bp)
1893*333d2b36SAndroid Build Coastguard Worker			if tc.expectedError != "" {
1894*333d2b36SAndroid Build Coastguard Worker				return
1895*333d2b36SAndroid Build Coastguard Worker			}
1896*333d2b36SAndroid Build Coastguard Worker
1897*333d2b36SAndroid Build Coastguard Worker			buildOS := ctx.Config.BuildOS.String()
1898*333d2b36SAndroid Build Coastguard Worker			fooVariant := ctx.ModuleForTests("foo", buildOS+"_common")
1899*333d2b36SAndroid Build Coastguard Worker			fooMod := fooVariant.Module().(*TestHost)
1900*333d2b36SAndroid Build Coastguard Worker			entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0]
1901*333d2b36SAndroid Build Coastguard Worker
1902*333d2b36SAndroid Build Coastguard Worker			expectedAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />`
1903*333d2b36SAndroid Build Coastguard Worker			autogen := fooVariant.Rule("autogen")
1904*333d2b36SAndroid Build Coastguard Worker			if !strings.Contains(autogen.Args["extraConfigs"], expectedAutogenConfig) {
1905*333d2b36SAndroid Build Coastguard Worker				t.Errorf("foo extraConfigs %v does not contain %q", autogen.Args["extraConfigs"], expectedAutogenConfig)
1906*333d2b36SAndroid Build Coastguard Worker			}
1907*333d2b36SAndroid Build Coastguard Worker
1908*333d2b36SAndroid Build Coastguard Worker			expectedData := []string{}
1909*333d2b36SAndroid Build Coastguard Worker			for _, variant := range tc.variants {
1910*333d2b36SAndroid Build Coastguard Worker				barVariant := ctx.ModuleForTests("bar", variant)
1911*333d2b36SAndroid Build Coastguard Worker				relocated := barVariant.Output("bar")
1912*333d2b36SAndroid Build Coastguard Worker				expectedInput := fmt.Sprintf("out/soong/.intermediates/bar/%s/unstripped/bar", variant)
1913*333d2b36SAndroid Build Coastguard Worker				android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input)
1914*333d2b36SAndroid Build Coastguard Worker
1915*333d2b36SAndroid Build Coastguard Worker				expectedData = append(expectedData, fmt.Sprintf("out/soong/.intermediates/bar/%s/bar:bar", variant))
1916*333d2b36SAndroid Build Coastguard Worker			}
1917*333d2b36SAndroid Build Coastguard Worker
1918*333d2b36SAndroid Build Coastguard Worker			actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
1919*333d2b36SAndroid Build Coastguard Worker			android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData)
1920*333d2b36SAndroid Build Coastguard Worker		})
1921*333d2b36SAndroid Build Coastguard Worker	}
1922*333d2b36SAndroid Build Coastguard Worker}
1923*333d2b36SAndroid Build Coastguard Worker
1924*333d2b36SAndroid Build Coastguard Workerfunc TestDeviceBinaryWrapperGeneration(t *testing.T) {
1925*333d2b36SAndroid Build Coastguard Worker	// Scenario 1: java_binary has main_class property in its bp
1926*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
1927*333d2b36SAndroid Build Coastguard Worker		java_binary {
1928*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1929*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
1930*333d2b36SAndroid Build Coastguard Worker			main_class: "foo.bar.jb",
1931*333d2b36SAndroid Build Coastguard Worker		}
1932*333d2b36SAndroid Build Coastguard Worker	`)
1933*333d2b36SAndroid Build Coastguard Worker	wrapperPath := fmt.Sprint(ctx.ModuleForTests("foo", "android_common").AllOutputs())
1934*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(wrapperPath, "foo.sh") {
1935*333d2b36SAndroid Build Coastguard Worker		t.Errorf("wrapper file foo.sh is not generated")
1936*333d2b36SAndroid Build Coastguard Worker	}
1937*333d2b36SAndroid Build Coastguard Worker
1938*333d2b36SAndroid Build Coastguard Worker	// Scenario 2: java_binary has neither wrapper nor main_class, its build
1939*333d2b36SAndroid Build Coastguard Worker	// is expected to be failed.
1940*333d2b36SAndroid Build Coastguard Worker	testJavaError(t, "main_class property is required for device binary if no default wrapper is assigned", `
1941*333d2b36SAndroid Build Coastguard Worker		java_binary {
1942*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1943*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
1944*333d2b36SAndroid Build Coastguard Worker		}`)
1945*333d2b36SAndroid Build Coastguard Worker}
1946*333d2b36SAndroid Build Coastguard Worker
1947*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiContributionEmptyApiFile(t *testing.T) {
1948*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
1949*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1950*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(
1951*333d2b36SAndroid Build Coastguard Worker			map[string]string{
1952*333d2b36SAndroid Build Coastguard Worker				"DISABLE_STUB_VALIDATION": "true",
1953*333d2b36SAndroid Build Coastguard Worker			},
1954*333d2b36SAndroid Build Coastguard Worker		),
1955*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
1956*333d2b36SAndroid Build Coastguard Worker		"Error: foo has an empty api file.",
1957*333d2b36SAndroid Build Coastguard Worker	)).RunTestWithBp(t, `
1958*333d2b36SAndroid Build Coastguard Worker		java_api_contribution {
1959*333d2b36SAndroid Build Coastguard Worker			name: "foo",
1960*333d2b36SAndroid Build Coastguard Worker		}
1961*333d2b36SAndroid Build Coastguard Worker		java_api_library {
1962*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1963*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
1964*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo"],
1965*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
1966*333d2b36SAndroid Build Coastguard Worker		}
1967*333d2b36SAndroid Build Coastguard Worker	`)
1968*333d2b36SAndroid Build Coastguard Worker}
1969*333d2b36SAndroid Build Coastguard Worker
1970*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryAndProviderLink(t *testing.T) {
1971*333d2b36SAndroid Build Coastguard Worker	provider_bp_a := `
1972*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
1973*333d2b36SAndroid Build Coastguard Worker		name: "foo1",
1974*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
1975*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
1976*333d2b36SAndroid Build Coastguard Worker	}
1977*333d2b36SAndroid Build Coastguard Worker	`
1978*333d2b36SAndroid Build Coastguard Worker	provider_bp_b := `java_api_contribution {
1979*333d2b36SAndroid Build Coastguard Worker		name: "foo2",
1980*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
1981*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
1982*333d2b36SAndroid Build Coastguard Worker	}
1983*333d2b36SAndroid Build Coastguard Worker	`
1984*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
1985*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
1986*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
1987*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
1988*333d2b36SAndroid Build Coastguard Worker				"a/Android.bp": []byte(provider_bp_a),
1989*333d2b36SAndroid Build Coastguard Worker				"b/Android.bp": []byte(provider_bp_b),
1990*333d2b36SAndroid Build Coastguard Worker			},
1991*333d2b36SAndroid Build Coastguard Worker		),
1992*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(
1993*333d2b36SAndroid Build Coastguard Worker			map[string]string{
1994*333d2b36SAndroid Build Coastguard Worker				"DISABLE_STUB_VALIDATION": "true",
1995*333d2b36SAndroid Build Coastguard Worker			},
1996*333d2b36SAndroid Build Coastguard Worker		),
1997*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
1998*333d2b36SAndroid Build Coastguard Worker		java_api_library {
1999*333d2b36SAndroid Build Coastguard Worker			name: "bar1",
2000*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
2001*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1"],
2002*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2003*333d2b36SAndroid Build Coastguard Worker		}
2004*333d2b36SAndroid Build Coastguard Worker
2005*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2006*333d2b36SAndroid Build Coastguard Worker			name: "bar2",
2007*333d2b36SAndroid Build Coastguard Worker			api_surface: "system",
2008*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1", "foo2"],
2009*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2010*333d2b36SAndroid Build Coastguard Worker		}
2011*333d2b36SAndroid Build Coastguard Worker	`)
2012*333d2b36SAndroid Build Coastguard Worker
2013*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
2014*333d2b36SAndroid Build Coastguard Worker		moduleName         string
2015*333d2b36SAndroid Build Coastguard Worker		sourceTextFileDirs []string
2016*333d2b36SAndroid Build Coastguard Worker	}{
2017*333d2b36SAndroid Build Coastguard Worker		{
2018*333d2b36SAndroid Build Coastguard Worker			moduleName:         "bar1",
2019*333d2b36SAndroid Build Coastguard Worker			sourceTextFileDirs: []string{"a/current.txt"},
2020*333d2b36SAndroid Build Coastguard Worker		},
2021*333d2b36SAndroid Build Coastguard Worker		{
2022*333d2b36SAndroid Build Coastguard Worker			moduleName:         "bar2",
2023*333d2b36SAndroid Build Coastguard Worker			sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"},
2024*333d2b36SAndroid Build Coastguard Worker		},
2025*333d2b36SAndroid Build Coastguard Worker	}
2026*333d2b36SAndroid Build Coastguard Worker	for _, c := range testcases {
2027*333d2b36SAndroid Build Coastguard Worker		m := ctx.ModuleForTests(c.moduleName, "android_common")
2028*333d2b36SAndroid Build Coastguard Worker		manifest := m.Output("metalava.sbox.textproto")
2029*333d2b36SAndroid Build Coastguard Worker		sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest)
2030*333d2b36SAndroid Build Coastguard Worker		manifestCommand := sboxProto.Commands[0].GetCommand()
2031*333d2b36SAndroid Build Coastguard Worker		sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ")
2032*333d2b36SAndroid Build Coastguard Worker		android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
2033*333d2b36SAndroid Build Coastguard Worker	}
2034*333d2b36SAndroid Build Coastguard Worker}
2035*333d2b36SAndroid Build Coastguard Worker
2036*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryAndDefaultsLink(t *testing.T) {
2037*333d2b36SAndroid Build Coastguard Worker	provider_bp_a := `
2038*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2039*333d2b36SAndroid Build Coastguard Worker		name: "foo1",
2040*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
2041*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2042*333d2b36SAndroid Build Coastguard Worker	}
2043*333d2b36SAndroid Build Coastguard Worker	`
2044*333d2b36SAndroid Build Coastguard Worker	provider_bp_b := `
2045*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2046*333d2b36SAndroid Build Coastguard Worker		name: "foo2",
2047*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
2048*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2049*333d2b36SAndroid Build Coastguard Worker	}
2050*333d2b36SAndroid Build Coastguard Worker	`
2051*333d2b36SAndroid Build Coastguard Worker	provider_bp_c := `
2052*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2053*333d2b36SAndroid Build Coastguard Worker		name: "foo3",
2054*333d2b36SAndroid Build Coastguard Worker		api_file: "system-current.txt",
2055*333d2b36SAndroid Build Coastguard Worker		api_surface: "system",
2056*333d2b36SAndroid Build Coastguard Worker	}
2057*333d2b36SAndroid Build Coastguard Worker	`
2058*333d2b36SAndroid Build Coastguard Worker	provider_bp_d := `
2059*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2060*333d2b36SAndroid Build Coastguard Worker		name: "foo4",
2061*333d2b36SAndroid Build Coastguard Worker		api_file: "system-current.txt",
2062*333d2b36SAndroid Build Coastguard Worker		api_surface: "system",
2063*333d2b36SAndroid Build Coastguard Worker	}
2064*333d2b36SAndroid Build Coastguard Worker	`
2065*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
2066*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2067*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
2068*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
2069*333d2b36SAndroid Build Coastguard Worker				"a/Android.bp": []byte(provider_bp_a),
2070*333d2b36SAndroid Build Coastguard Worker				"b/Android.bp": []byte(provider_bp_b),
2071*333d2b36SAndroid Build Coastguard Worker				"c/Android.bp": []byte(provider_bp_c),
2072*333d2b36SAndroid Build Coastguard Worker				"d/Android.bp": []byte(provider_bp_d),
2073*333d2b36SAndroid Build Coastguard Worker			},
2074*333d2b36SAndroid Build Coastguard Worker		),
2075*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(
2076*333d2b36SAndroid Build Coastguard Worker			map[string]string{
2077*333d2b36SAndroid Build Coastguard Worker				"DISABLE_STUB_VALIDATION": "true",
2078*333d2b36SAndroid Build Coastguard Worker			},
2079*333d2b36SAndroid Build Coastguard Worker		),
2080*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2081*333d2b36SAndroid Build Coastguard Worker		java_defaults {
2082*333d2b36SAndroid Build Coastguard Worker			name: "baz1",
2083*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
2084*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1", "foo2"],
2085*333d2b36SAndroid Build Coastguard Worker		}
2086*333d2b36SAndroid Build Coastguard Worker
2087*333d2b36SAndroid Build Coastguard Worker		java_defaults {
2088*333d2b36SAndroid Build Coastguard Worker			name: "baz2",
2089*333d2b36SAndroid Build Coastguard Worker			api_surface: "system",
2090*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo3"],
2091*333d2b36SAndroid Build Coastguard Worker		}
2092*333d2b36SAndroid Build Coastguard Worker
2093*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2094*333d2b36SAndroid Build Coastguard Worker			name: "bar1",
2095*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
2096*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1"],
2097*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2098*333d2b36SAndroid Build Coastguard Worker		}
2099*333d2b36SAndroid Build Coastguard Worker
2100*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2101*333d2b36SAndroid Build Coastguard Worker			name: "bar2",
2102*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
2103*333d2b36SAndroid Build Coastguard Worker			defaults:["baz1"],
2104*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2105*333d2b36SAndroid Build Coastguard Worker		}
2106*333d2b36SAndroid Build Coastguard Worker
2107*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2108*333d2b36SAndroid Build Coastguard Worker			name: "bar3",
2109*333d2b36SAndroid Build Coastguard Worker			api_surface: "system",
2110*333d2b36SAndroid Build Coastguard Worker			defaults:["baz1", "baz2"],
2111*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo4"],
2112*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2113*333d2b36SAndroid Build Coastguard Worker		}
2114*333d2b36SAndroid Build Coastguard Worker	`)
2115*333d2b36SAndroid Build Coastguard Worker
2116*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
2117*333d2b36SAndroid Build Coastguard Worker		moduleName         string
2118*333d2b36SAndroid Build Coastguard Worker		sourceTextFileDirs []string
2119*333d2b36SAndroid Build Coastguard Worker	}{
2120*333d2b36SAndroid Build Coastguard Worker		{
2121*333d2b36SAndroid Build Coastguard Worker			moduleName:         "bar1",
2122*333d2b36SAndroid Build Coastguard Worker			sourceTextFileDirs: []string{"a/current.txt"},
2123*333d2b36SAndroid Build Coastguard Worker		},
2124*333d2b36SAndroid Build Coastguard Worker		{
2125*333d2b36SAndroid Build Coastguard Worker			moduleName:         "bar2",
2126*333d2b36SAndroid Build Coastguard Worker			sourceTextFileDirs: []string{"a/current.txt", "b/current.txt"},
2127*333d2b36SAndroid Build Coastguard Worker		},
2128*333d2b36SAndroid Build Coastguard Worker		{
2129*333d2b36SAndroid Build Coastguard Worker			moduleName: "bar3",
2130*333d2b36SAndroid Build Coastguard Worker			// API text files need to be sorted from the narrower api scope to the wider api scope
2131*333d2b36SAndroid Build Coastguard Worker			sourceTextFileDirs: []string{"a/current.txt", "b/current.txt", "c/system-current.txt", "d/system-current.txt"},
2132*333d2b36SAndroid Build Coastguard Worker		},
2133*333d2b36SAndroid Build Coastguard Worker	}
2134*333d2b36SAndroid Build Coastguard Worker	for _, c := range testcases {
2135*333d2b36SAndroid Build Coastguard Worker		m := ctx.ModuleForTests(c.moduleName, "android_common")
2136*333d2b36SAndroid Build Coastguard Worker		manifest := m.Output("metalava.sbox.textproto")
2137*333d2b36SAndroid Build Coastguard Worker		sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest)
2138*333d2b36SAndroid Build Coastguard Worker		manifestCommand := sboxProto.Commands[0].GetCommand()
2139*333d2b36SAndroid Build Coastguard Worker		sourceFilesFlag := "--source-files " + strings.Join(c.sourceTextFileDirs, " ")
2140*333d2b36SAndroid Build Coastguard Worker		android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
2141*333d2b36SAndroid Build Coastguard Worker	}
2142*333d2b36SAndroid Build Coastguard Worker}
2143*333d2b36SAndroid Build Coastguard Worker
2144*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryJarGeneration(t *testing.T) {
2145*333d2b36SAndroid Build Coastguard Worker	provider_bp_a := `
2146*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2147*333d2b36SAndroid Build Coastguard Worker		name: "foo1",
2148*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
2149*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2150*333d2b36SAndroid Build Coastguard Worker	}
2151*333d2b36SAndroid Build Coastguard Worker	`
2152*333d2b36SAndroid Build Coastguard Worker	provider_bp_b := `
2153*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2154*333d2b36SAndroid Build Coastguard Worker		name: "foo2",
2155*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
2156*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2157*333d2b36SAndroid Build Coastguard Worker	}
2158*333d2b36SAndroid Build Coastguard Worker	`
2159*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
2160*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2161*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
2162*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
2163*333d2b36SAndroid Build Coastguard Worker				"a/Android.bp": []byte(provider_bp_a),
2164*333d2b36SAndroid Build Coastguard Worker				"b/Android.bp": []byte(provider_bp_b),
2165*333d2b36SAndroid Build Coastguard Worker			},
2166*333d2b36SAndroid Build Coastguard Worker		),
2167*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(
2168*333d2b36SAndroid Build Coastguard Worker			map[string]string{
2169*333d2b36SAndroid Build Coastguard Worker				"DISABLE_STUB_VALIDATION": "true",
2170*333d2b36SAndroid Build Coastguard Worker			},
2171*333d2b36SAndroid Build Coastguard Worker		),
2172*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2173*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2174*333d2b36SAndroid Build Coastguard Worker			name: "bar1",
2175*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
2176*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1"],
2177*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2178*333d2b36SAndroid Build Coastguard Worker		}
2179*333d2b36SAndroid Build Coastguard Worker
2180*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2181*333d2b36SAndroid Build Coastguard Worker			name: "bar2",
2182*333d2b36SAndroid Build Coastguard Worker			api_surface: "system",
2183*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1", "foo2"],
2184*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2185*333d2b36SAndroid Build Coastguard Worker		}
2186*333d2b36SAndroid Build Coastguard Worker	`)
2187*333d2b36SAndroid Build Coastguard Worker
2188*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
2189*333d2b36SAndroid Build Coastguard Worker		moduleName    string
2190*333d2b36SAndroid Build Coastguard Worker		outputJarName string
2191*333d2b36SAndroid Build Coastguard Worker	}{
2192*333d2b36SAndroid Build Coastguard Worker		{
2193*333d2b36SAndroid Build Coastguard Worker			moduleName:    "bar1",
2194*333d2b36SAndroid Build Coastguard Worker			outputJarName: "bar1/bar1.jar",
2195*333d2b36SAndroid Build Coastguard Worker		},
2196*333d2b36SAndroid Build Coastguard Worker		{
2197*333d2b36SAndroid Build Coastguard Worker			moduleName:    "bar2",
2198*333d2b36SAndroid Build Coastguard Worker			outputJarName: "bar2/bar2.jar",
2199*333d2b36SAndroid Build Coastguard Worker		},
2200*333d2b36SAndroid Build Coastguard Worker	}
2201*333d2b36SAndroid Build Coastguard Worker	for _, c := range testcases {
2202*333d2b36SAndroid Build Coastguard Worker		m := ctx.ModuleForTests(c.moduleName, "android_common")
2203*333d2b36SAndroid Build Coastguard Worker		outputs := fmt.Sprint(m.AllOutputs())
2204*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(outputs, c.outputJarName) {
2205*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Module output does not contain expected jar %s", c.outputJarName)
2206*333d2b36SAndroid Build Coastguard Worker		}
2207*333d2b36SAndroid Build Coastguard Worker	}
2208*333d2b36SAndroid Build Coastguard Worker}
2209*333d2b36SAndroid Build Coastguard Worker
2210*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryLibsLink(t *testing.T) {
2211*333d2b36SAndroid Build Coastguard Worker	provider_bp_a := `
2212*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2213*333d2b36SAndroid Build Coastguard Worker		name: "foo1",
2214*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
2215*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2216*333d2b36SAndroid Build Coastguard Worker	}
2217*333d2b36SAndroid Build Coastguard Worker	`
2218*333d2b36SAndroid Build Coastguard Worker	provider_bp_b := `
2219*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2220*333d2b36SAndroid Build Coastguard Worker		name: "foo2",
2221*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
2222*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2223*333d2b36SAndroid Build Coastguard Worker	}
2224*333d2b36SAndroid Build Coastguard Worker	`
2225*333d2b36SAndroid Build Coastguard Worker	lib_bp_a := `
2226*333d2b36SAndroid Build Coastguard Worker	java_library {
2227*333d2b36SAndroid Build Coastguard Worker		name: "lib1",
2228*333d2b36SAndroid Build Coastguard Worker		srcs: ["Lib.java"],
2229*333d2b36SAndroid Build Coastguard Worker	}
2230*333d2b36SAndroid Build Coastguard Worker	`
2231*333d2b36SAndroid Build Coastguard Worker	lib_bp_b := `
2232*333d2b36SAndroid Build Coastguard Worker	java_library {
2233*333d2b36SAndroid Build Coastguard Worker		name: "lib2",
2234*333d2b36SAndroid Build Coastguard Worker		srcs: ["Lib.java"],
2235*333d2b36SAndroid Build Coastguard Worker	}
2236*333d2b36SAndroid Build Coastguard Worker	`
2237*333d2b36SAndroid Build Coastguard Worker
2238*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
2239*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2240*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
2241*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
2242*333d2b36SAndroid Build Coastguard Worker				"a/Android.bp": []byte(provider_bp_a),
2243*333d2b36SAndroid Build Coastguard Worker				"b/Android.bp": []byte(provider_bp_b),
2244*333d2b36SAndroid Build Coastguard Worker				"c/Android.bp": []byte(lib_bp_a),
2245*333d2b36SAndroid Build Coastguard Worker				"c/Lib.java":   {},
2246*333d2b36SAndroid Build Coastguard Worker				"d/Android.bp": []byte(lib_bp_b),
2247*333d2b36SAndroid Build Coastguard Worker				"d/Lib.java":   {},
2248*333d2b36SAndroid Build Coastguard Worker			},
2249*333d2b36SAndroid Build Coastguard Worker		),
2250*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(
2251*333d2b36SAndroid Build Coastguard Worker			map[string]string{
2252*333d2b36SAndroid Build Coastguard Worker				"DISABLE_STUB_VALIDATION": "true",
2253*333d2b36SAndroid Build Coastguard Worker			},
2254*333d2b36SAndroid Build Coastguard Worker		),
2255*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2256*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2257*333d2b36SAndroid Build Coastguard Worker			name: "bar1",
2258*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
2259*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1"],
2260*333d2b36SAndroid Build Coastguard Worker			libs: ["lib1"],
2261*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2262*333d2b36SAndroid Build Coastguard Worker		}
2263*333d2b36SAndroid Build Coastguard Worker
2264*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2265*333d2b36SAndroid Build Coastguard Worker			name: "bar2",
2266*333d2b36SAndroid Build Coastguard Worker			api_surface: "system",
2267*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1", "foo2"],
2268*333d2b36SAndroid Build Coastguard Worker			libs: ["lib1", "lib2", "bar1"],
2269*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2270*333d2b36SAndroid Build Coastguard Worker		}
2271*333d2b36SAndroid Build Coastguard Worker	`)
2272*333d2b36SAndroid Build Coastguard Worker
2273*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
2274*333d2b36SAndroid Build Coastguard Worker		moduleName        string
2275*333d2b36SAndroid Build Coastguard Worker		classPathJarNames []string
2276*333d2b36SAndroid Build Coastguard Worker	}{
2277*333d2b36SAndroid Build Coastguard Worker		{
2278*333d2b36SAndroid Build Coastguard Worker			moduleName:        "bar1",
2279*333d2b36SAndroid Build Coastguard Worker			classPathJarNames: []string{"lib1.jar"},
2280*333d2b36SAndroid Build Coastguard Worker		},
2281*333d2b36SAndroid Build Coastguard Worker		{
2282*333d2b36SAndroid Build Coastguard Worker			moduleName:        "bar2",
2283*333d2b36SAndroid Build Coastguard Worker			classPathJarNames: []string{"lib1.jar", "lib2.jar", "bar1/bar1.jar"},
2284*333d2b36SAndroid Build Coastguard Worker		},
2285*333d2b36SAndroid Build Coastguard Worker	}
2286*333d2b36SAndroid Build Coastguard Worker	for _, c := range testcases {
2287*333d2b36SAndroid Build Coastguard Worker		m := ctx.ModuleForTests(c.moduleName, "android_common")
2288*333d2b36SAndroid Build Coastguard Worker		javacRules := m.Rule("javac")
2289*333d2b36SAndroid Build Coastguard Worker		classPathArgs := javacRules.Args["classpath"]
2290*333d2b36SAndroid Build Coastguard Worker		for _, jarName := range c.classPathJarNames {
2291*333d2b36SAndroid Build Coastguard Worker			if !strings.Contains(classPathArgs, jarName) {
2292*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Module output does not contain expected jar %s", jarName)
2293*333d2b36SAndroid Build Coastguard Worker			}
2294*333d2b36SAndroid Build Coastguard Worker		}
2295*333d2b36SAndroid Build Coastguard Worker	}
2296*333d2b36SAndroid Build Coastguard Worker}
2297*333d2b36SAndroid Build Coastguard Worker
2298*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryStaticLibsLink(t *testing.T) {
2299*333d2b36SAndroid Build Coastguard Worker	provider_bp_a := `
2300*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2301*333d2b36SAndroid Build Coastguard Worker		name: "foo1",
2302*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
2303*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2304*333d2b36SAndroid Build Coastguard Worker	}
2305*333d2b36SAndroid Build Coastguard Worker	`
2306*333d2b36SAndroid Build Coastguard Worker	provider_bp_b := `
2307*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2308*333d2b36SAndroid Build Coastguard Worker		name: "foo2",
2309*333d2b36SAndroid Build Coastguard Worker		api_file: "current.txt",
2310*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2311*333d2b36SAndroid Build Coastguard Worker	}
2312*333d2b36SAndroid Build Coastguard Worker	`
2313*333d2b36SAndroid Build Coastguard Worker	lib_bp_a := `
2314*333d2b36SAndroid Build Coastguard Worker	java_library {
2315*333d2b36SAndroid Build Coastguard Worker		name: "lib1",
2316*333d2b36SAndroid Build Coastguard Worker		srcs: ["Lib.java"],
2317*333d2b36SAndroid Build Coastguard Worker	}
2318*333d2b36SAndroid Build Coastguard Worker	`
2319*333d2b36SAndroid Build Coastguard Worker	lib_bp_b := `
2320*333d2b36SAndroid Build Coastguard Worker	java_library {
2321*333d2b36SAndroid Build Coastguard Worker		name: "lib2",
2322*333d2b36SAndroid Build Coastguard Worker		srcs: ["Lib.java"],
2323*333d2b36SAndroid Build Coastguard Worker	}
2324*333d2b36SAndroid Build Coastguard Worker	`
2325*333d2b36SAndroid Build Coastguard Worker
2326*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
2327*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2328*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
2329*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
2330*333d2b36SAndroid Build Coastguard Worker				"a/Android.bp": []byte(provider_bp_a),
2331*333d2b36SAndroid Build Coastguard Worker				"b/Android.bp": []byte(provider_bp_b),
2332*333d2b36SAndroid Build Coastguard Worker				"c/Android.bp": []byte(lib_bp_a),
2333*333d2b36SAndroid Build Coastguard Worker				"c/Lib.java":   {},
2334*333d2b36SAndroid Build Coastguard Worker				"d/Android.bp": []byte(lib_bp_b),
2335*333d2b36SAndroid Build Coastguard Worker				"d/Lib.java":   {},
2336*333d2b36SAndroid Build Coastguard Worker			},
2337*333d2b36SAndroid Build Coastguard Worker		),
2338*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(
2339*333d2b36SAndroid Build Coastguard Worker			map[string]string{
2340*333d2b36SAndroid Build Coastguard Worker				"DISABLE_STUB_VALIDATION": "true",
2341*333d2b36SAndroid Build Coastguard Worker			},
2342*333d2b36SAndroid Build Coastguard Worker		),
2343*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2344*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2345*333d2b36SAndroid Build Coastguard Worker			name: "bar1",
2346*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
2347*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1"],
2348*333d2b36SAndroid Build Coastguard Worker			static_libs: ["lib1"],
2349*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2350*333d2b36SAndroid Build Coastguard Worker		}
2351*333d2b36SAndroid Build Coastguard Worker
2352*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2353*333d2b36SAndroid Build Coastguard Worker			name: "bar2",
2354*333d2b36SAndroid Build Coastguard Worker			api_surface: "system",
2355*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["foo1", "foo2"],
2356*333d2b36SAndroid Build Coastguard Worker			static_libs: ["lib1", "lib2", "bar1"],
2357*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2358*333d2b36SAndroid Build Coastguard Worker		}
2359*333d2b36SAndroid Build Coastguard Worker	`)
2360*333d2b36SAndroid Build Coastguard Worker
2361*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
2362*333d2b36SAndroid Build Coastguard Worker		moduleName        string
2363*333d2b36SAndroid Build Coastguard Worker		staticLibJarNames []string
2364*333d2b36SAndroid Build Coastguard Worker	}{
2365*333d2b36SAndroid Build Coastguard Worker		{
2366*333d2b36SAndroid Build Coastguard Worker			moduleName:        "bar1",
2367*333d2b36SAndroid Build Coastguard Worker			staticLibJarNames: []string{"lib1.jar"},
2368*333d2b36SAndroid Build Coastguard Worker		},
2369*333d2b36SAndroid Build Coastguard Worker		{
2370*333d2b36SAndroid Build Coastguard Worker			moduleName:        "bar2",
2371*333d2b36SAndroid Build Coastguard Worker			staticLibJarNames: []string{"lib1.jar", "lib2.jar", "bar1/bar1.jar"},
2372*333d2b36SAndroid Build Coastguard Worker		},
2373*333d2b36SAndroid Build Coastguard Worker	}
2374*333d2b36SAndroid Build Coastguard Worker	for _, c := range testcases {
2375*333d2b36SAndroid Build Coastguard Worker		m := ctx.ModuleForTests(c.moduleName, "android_common")
2376*333d2b36SAndroid Build Coastguard Worker		mergeZipsCommand := m.Rule("merge_zips").RuleParams.Command
2377*333d2b36SAndroid Build Coastguard Worker		for _, jarName := range c.staticLibJarNames {
2378*333d2b36SAndroid Build Coastguard Worker			if !strings.Contains(mergeZipsCommand, jarName) {
2379*333d2b36SAndroid Build Coastguard Worker				t.Errorf("merge_zips command does not contain expected jar %s", jarName)
2380*333d2b36SAndroid Build Coastguard Worker			}
2381*333d2b36SAndroid Build Coastguard Worker		}
2382*333d2b36SAndroid Build Coastguard Worker	}
2383*333d2b36SAndroid Build Coastguard Worker}
2384*333d2b36SAndroid Build Coastguard Worker
2385*333d2b36SAndroid Build Coastguard Workerfunc TestTransitiveSrcFiles(t *testing.T) {
2386*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
2387*333d2b36SAndroid Build Coastguard Worker		java_library {
2388*333d2b36SAndroid Build Coastguard Worker			name: "a",
2389*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2390*333d2b36SAndroid Build Coastguard Worker		}
2391*333d2b36SAndroid Build Coastguard Worker		java_library {
2392*333d2b36SAndroid Build Coastguard Worker			name: "b",
2393*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
2394*333d2b36SAndroid Build Coastguard Worker		}
2395*333d2b36SAndroid Build Coastguard Worker		java_library {
2396*333d2b36SAndroid Build Coastguard Worker			name: "c",
2397*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
2398*333d2b36SAndroid Build Coastguard Worker			libs: ["a"],
2399*333d2b36SAndroid Build Coastguard Worker			static_libs: ["b"],
2400*333d2b36SAndroid Build Coastguard Worker		}
2401*333d2b36SAndroid Build Coastguard Worker	`)
2402*333d2b36SAndroid Build Coastguard Worker	c := ctx.ModuleForTests("c", "android_common").Module()
2403*333d2b36SAndroid Build Coastguard Worker	javaInfo, _ := android.OtherModuleProvider(ctx, c, JavaInfoProvider)
2404*333d2b36SAndroid Build Coastguard Worker	transitiveSrcFiles := android.Paths(javaInfo.TransitiveSrcFiles.ToList())
2405*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "unexpected jar deps", []string{"b.java", "c.java"}, transitiveSrcFiles.Strings())
2406*333d2b36SAndroid Build Coastguard Worker}
2407*333d2b36SAndroid Build Coastguard Worker
2408*333d2b36SAndroid Build Coastguard Workerfunc TestTradefedOptions(t *testing.T) {
2409*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, `
2410*333d2b36SAndroid Build Coastguard Workerjava_test_host {
2411*333d2b36SAndroid Build Coastguard Worker	name: "foo",
2412*333d2b36SAndroid Build Coastguard Worker	test_options: {
2413*333d2b36SAndroid Build Coastguard Worker		tradefed_options: [
2414*333d2b36SAndroid Build Coastguard Worker			{
2415*333d2b36SAndroid Build Coastguard Worker				name: "exclude-path",
2416*333d2b36SAndroid Build Coastguard Worker				value: "org/apache"
2417*333d2b36SAndroid Build Coastguard Worker			}
2418*333d2b36SAndroid Build Coastguard Worker		]
2419*333d2b36SAndroid Build Coastguard Worker	}
2420*333d2b36SAndroid Build Coastguard Worker}
2421*333d2b36SAndroid Build Coastguard Worker`)
2422*333d2b36SAndroid Build Coastguard Worker
2423*333d2b36SAndroid Build Coastguard Worker	buildOS := result.Config.BuildOS.String()
2424*333d2b36SAndroid Build Coastguard Worker	args := result.ModuleForTests("foo", buildOS+"_common").
2425*333d2b36SAndroid Build Coastguard Worker		Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args
2426*333d2b36SAndroid Build Coastguard Worker	expected := proptools.NinjaAndShellEscape("<option name=\"exclude-path\" value=\"org/apache\" />")
2427*333d2b36SAndroid Build Coastguard Worker	if args["extraConfigs"] != expected {
2428*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected args[\"extraConfigs\"] to equal %q, was %q", expected, args["extraConfigs"])
2429*333d2b36SAndroid Build Coastguard Worker	}
2430*333d2b36SAndroid Build Coastguard Worker}
2431*333d2b36SAndroid Build Coastguard Worker
2432*333d2b36SAndroid Build Coastguard Workerfunc TestTestRunnerOptions(t *testing.T) {
2433*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaBuildComponents.RunTestWithBp(t, `
2434*333d2b36SAndroid Build Coastguard Workerjava_test_host {
2435*333d2b36SAndroid Build Coastguard Worker	name: "foo",
2436*333d2b36SAndroid Build Coastguard Worker	test_options: {
2437*333d2b36SAndroid Build Coastguard Worker		test_runner_options: [
2438*333d2b36SAndroid Build Coastguard Worker			{
2439*333d2b36SAndroid Build Coastguard Worker				name: "test-timeout",
2440*333d2b36SAndroid Build Coastguard Worker				value: "10m"
2441*333d2b36SAndroid Build Coastguard Worker			}
2442*333d2b36SAndroid Build Coastguard Worker		]
2443*333d2b36SAndroid Build Coastguard Worker	}
2444*333d2b36SAndroid Build Coastguard Worker}
2445*333d2b36SAndroid Build Coastguard Worker`)
2446*333d2b36SAndroid Build Coastguard Worker
2447*333d2b36SAndroid Build Coastguard Worker	buildOS := result.Config.BuildOS.String()
2448*333d2b36SAndroid Build Coastguard Worker	args := result.ModuleForTests("foo", buildOS+"_common").
2449*333d2b36SAndroid Build Coastguard Worker		Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args
2450*333d2b36SAndroid Build Coastguard Worker	expected := proptools.NinjaAndShellEscape("<option name=\"test-timeout\" value=\"10m\" />\\n        ")
2451*333d2b36SAndroid Build Coastguard Worker	if args["extraTestRunnerConfigs"] != expected {
2452*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected args[\"extraTestRunnerConfigs\"] to equal %q, was %q", expected, args["extraTestRunnerConfigs"])
2453*333d2b36SAndroid Build Coastguard Worker	}
2454*333d2b36SAndroid Build Coastguard Worker}
2455*333d2b36SAndroid Build Coastguard Worker
2456*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibraryWithResourcesStem(t *testing.T) {
2457*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJavaWithFS(t, `
2458*333d2b36SAndroid Build Coastguard Worker    java_library {
2459*333d2b36SAndroid Build Coastguard Worker        name: "foo",
2460*333d2b36SAndroid Build Coastguard Worker        java_resource_dirs: ["test-jar"],
2461*333d2b36SAndroid Build Coastguard Worker        stem: "test",
2462*333d2b36SAndroid Build Coastguard Worker    }
2463*333d2b36SAndroid Build Coastguard Worker    `,
2464*333d2b36SAndroid Build Coastguard Worker		map[string][]byte{
2465*333d2b36SAndroid Build Coastguard Worker			"test-jar/test/resource.txt": nil,
2466*333d2b36SAndroid Build Coastguard Worker		})
2467*333d2b36SAndroid Build Coastguard Worker
2468*333d2b36SAndroid Build Coastguard Worker	m := ctx.ModuleForTests("foo", "android_common")
2469*333d2b36SAndroid Build Coastguard Worker	outputs := fmt.Sprint(m.AllOutputs())
2470*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(outputs, "test.jar") {
2471*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Module output does not contain expected jar %s", "test.jar")
2472*333d2b36SAndroid Build Coastguard Worker	}
2473*333d2b36SAndroid Build Coastguard Worker}
2474*333d2b36SAndroid Build Coastguard Worker
2475*333d2b36SAndroid Build Coastguard Workerfunc TestHeadersOnly(t *testing.T) {
2476*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
2477*333d2b36SAndroid Build Coastguard Worker		java_library {
2478*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2479*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2480*333d2b36SAndroid Build Coastguard Worker			headers_only: true,
2481*333d2b36SAndroid Build Coastguard Worker		}
2482*333d2b36SAndroid Build Coastguard Worker	`)
2483*333d2b36SAndroid Build Coastguard Worker
2484*333d2b36SAndroid Build Coastguard Worker	turbine := ctx.ModuleForTests("foo", "android_common").Rule("turbine")
2485*333d2b36SAndroid Build Coastguard Worker	if len(turbine.Inputs) != 1 || turbine.Inputs[0].String() != "a.java" {
2486*333d2b36SAndroid Build Coastguard Worker		t.Errorf(`foo inputs %v != ["a.java"]`, turbine.Inputs)
2487*333d2b36SAndroid Build Coastguard Worker	}
2488*333d2b36SAndroid Build Coastguard Worker
2489*333d2b36SAndroid Build Coastguard Worker	javac := ctx.ModuleForTests("foo", "android_common").MaybeRule("javac")
2490*333d2b36SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "javac rule", nil, javac.Rule)
2491*333d2b36SAndroid Build Coastguard Worker}
2492*333d2b36SAndroid Build Coastguard Worker
2493*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiContributionImport(t *testing.T) {
2494*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
2495*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2496*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeEnv(
2497*333d2b36SAndroid Build Coastguard Worker			map[string]string{
2498*333d2b36SAndroid Build Coastguard Worker				"DISABLE_STUB_VALIDATION": "true",
2499*333d2b36SAndroid Build Coastguard Worker			},
2500*333d2b36SAndroid Build Coastguard Worker		),
2501*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2502*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2503*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2504*333d2b36SAndroid Build Coastguard Worker			api_contributions: ["bar"],
2505*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2506*333d2b36SAndroid Build Coastguard Worker		}
2507*333d2b36SAndroid Build Coastguard Worker		java_api_contribution_import {
2508*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2509*333d2b36SAndroid Build Coastguard Worker			api_file: "current.txt",
2510*333d2b36SAndroid Build Coastguard Worker			api_surface: "public",
2511*333d2b36SAndroid Build Coastguard Worker		}
2512*333d2b36SAndroid Build Coastguard Worker	`)
2513*333d2b36SAndroid Build Coastguard Worker	m := ctx.ModuleForTests("foo", "android_common")
2514*333d2b36SAndroid Build Coastguard Worker	manifest := m.Output("metalava.sbox.textproto")
2515*333d2b36SAndroid Build Coastguard Worker	sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest)
2516*333d2b36SAndroid Build Coastguard Worker	manifestCommand := sboxProto.Commands[0].GetCommand()
2517*333d2b36SAndroid Build Coastguard Worker	sourceFilesFlag := "--source-files current.txt"
2518*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "source text files not present", manifestCommand, sourceFilesFlag)
2519*333d2b36SAndroid Build Coastguard Worker}
2520*333d2b36SAndroid Build Coastguard Worker
2521*333d2b36SAndroid Build Coastguard Workerfunc TestJavaApiLibraryApiFilesSorting(t *testing.T) {
2522*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
2523*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2524*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2525*333d2b36SAndroid Build Coastguard Worker			api_contributions: [
2526*333d2b36SAndroid Build Coastguard Worker				"system-server-api-stubs-docs-non-updatable.api.contribution",
2527*333d2b36SAndroid Build Coastguard Worker				"test-api-stubs-docs-non-updatable.api.contribution",
2528*333d2b36SAndroid Build Coastguard Worker				"system-api-stubs-docs-non-updatable.api.contribution",
2529*333d2b36SAndroid Build Coastguard Worker				"module-lib-api-stubs-docs-non-updatable.api.contribution",
2530*333d2b36SAndroid Build Coastguard Worker				"api-stubs-docs-non-updatable.api.contribution",
2531*333d2b36SAndroid Build Coastguard Worker			],
2532*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2533*333d2b36SAndroid Build Coastguard Worker		}
2534*333d2b36SAndroid Build Coastguard Worker	`)
2535*333d2b36SAndroid Build Coastguard Worker	m := ctx.ModuleForTests("foo", "android_common")
2536*333d2b36SAndroid Build Coastguard Worker	manifest := m.Output("metalava.sbox.textproto")
2537*333d2b36SAndroid Build Coastguard Worker	sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, manifest)
2538*333d2b36SAndroid Build Coastguard Worker	manifestCommand := sboxProto.Commands[0].GetCommand()
2539*333d2b36SAndroid Build Coastguard Worker
2540*333d2b36SAndroid Build Coastguard Worker	// Api files are sorted from the narrowest api scope to the widest api scope.
2541*333d2b36SAndroid Build Coastguard Worker	// test api and module lib api surface do not have subset/superset relationship,
2542*333d2b36SAndroid Build Coastguard Worker	// but they will never be passed as inputs at the same time.
2543*333d2b36SAndroid Build Coastguard Worker	sourceFilesFlag := "--source-files default/java/api/current.txt " +
2544*333d2b36SAndroid Build Coastguard Worker		"default/java/api/system-current.txt default/java/api/test-current.txt " +
2545*333d2b36SAndroid Build Coastguard Worker		"default/java/api/module-lib-current.txt default/java/api/system-server-current.txt"
2546*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "source text files not in api scope order", manifestCommand, sourceFilesFlag)
2547*333d2b36SAndroid Build Coastguard Worker}
2548*333d2b36SAndroid Build Coastguard Worker
2549*333d2b36SAndroid Build Coastguard Workerfunc TestSdkLibraryProvidesSystemModulesToApiLibrary(t *testing.T) {
2550*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
2551*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2552*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
2553*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
2554*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
2555*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
2556*333d2b36SAndroid Build Coastguard Worker				"A.java": nil,
2557*333d2b36SAndroid Build Coastguard Worker			},
2558*333d2b36SAndroid Build Coastguard Worker		),
2559*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2560*333d2b36SAndroid Build Coastguard Worker		java_library {
2561*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2562*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2563*333d2b36SAndroid Build Coastguard Worker		}
2564*333d2b36SAndroid Build Coastguard Worker		java_system_modules {
2565*333d2b36SAndroid Build Coastguard Worker			name: "baz",
2566*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
2567*333d2b36SAndroid Build Coastguard Worker		}
2568*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
2569*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2570*333d2b36SAndroid Build Coastguard Worker			srcs: ["A.java"],
2571*333d2b36SAndroid Build Coastguard Worker			system_modules: "baz",
2572*333d2b36SAndroid Build Coastguard Worker		}
2573*333d2b36SAndroid Build Coastguard Worker	`)
2574*333d2b36SAndroid Build Coastguard Worker
2575*333d2b36SAndroid Build Coastguard Worker	checkBootClasspathForLibWithSystemModule(t, result.TestContext, apiScopePublic.apiLibraryModuleName("foo"), "/bar.jar")
2576*333d2b36SAndroid Build Coastguard Worker}
2577*333d2b36SAndroid Build Coastguard Worker
2578*333d2b36SAndroid Build Coastguard Workerfunc TestApiLibraryDroidstubsDependency(t *testing.T) {
2579*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
2580*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2581*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
2582*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
2583*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(
2584*333d2b36SAndroid Build Coastguard Worker			map[string][]byte{
2585*333d2b36SAndroid Build Coastguard Worker				"A.java": nil,
2586*333d2b36SAndroid Build Coastguard Worker			},
2587*333d2b36SAndroid Build Coastguard Worker		),
2588*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2589*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2590*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2591*333d2b36SAndroid Build Coastguard Worker			api_contributions: [
2592*333d2b36SAndroid Build Coastguard Worker				"api-stubs-docs-non-updatable.api.contribution",
2593*333d2b36SAndroid Build Coastguard Worker			],
2594*333d2b36SAndroid Build Coastguard Worker			enable_validation: true,
2595*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2596*333d2b36SAndroid Build Coastguard Worker		}
2597*333d2b36SAndroid Build Coastguard Worker		java_api_library {
2598*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2599*333d2b36SAndroid Build Coastguard Worker			api_contributions: [
2600*333d2b36SAndroid Build Coastguard Worker				"api-stubs-docs-non-updatable.api.contribution",
2601*333d2b36SAndroid Build Coastguard Worker			],
2602*333d2b36SAndroid Build Coastguard Worker			enable_validation: false,
2603*333d2b36SAndroid Build Coastguard Worker			stubs_type: "everything",
2604*333d2b36SAndroid Build Coastguard Worker		}
2605*333d2b36SAndroid Build Coastguard Worker	`)
2606*333d2b36SAndroid Build Coastguard Worker
2607*333d2b36SAndroid Build Coastguard Worker	currentApiTimestampPath := "api-stubs-docs-non-updatable/android_common/everything/check_current_api.timestamp"
2608*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common").Module().(*ApiLibrary)
2609*333d2b36SAndroid Build Coastguard Worker	fooValidationPathsString := strings.Join(foo.validationPaths.Strings(), " ")
2610*333d2b36SAndroid Build Coastguard Worker	bar := result.ModuleForTests("bar", "android_common").Module().(*ApiLibrary)
2611*333d2b36SAndroid Build Coastguard Worker	barValidationPathsString := strings.Join(bar.validationPaths.Strings(), " ")
2612*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
2613*333d2b36SAndroid Build Coastguard Worker		"Module expected to have validation",
2614*333d2b36SAndroid Build Coastguard Worker		fooValidationPathsString,
2615*333d2b36SAndroid Build Coastguard Worker		currentApiTimestampPath,
2616*333d2b36SAndroid Build Coastguard Worker	)
2617*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t,
2618*333d2b36SAndroid Build Coastguard Worker		"Module expected to not have validation",
2619*333d2b36SAndroid Build Coastguard Worker		barValidationPathsString,
2620*333d2b36SAndroid Build Coastguard Worker		currentApiTimestampPath,
2621*333d2b36SAndroid Build Coastguard Worker	)
2622*333d2b36SAndroid Build Coastguard Worker}
2623*333d2b36SAndroid Build Coastguard Worker
2624*333d2b36SAndroid Build Coastguard Workerfunc TestDisableFromTextStubForCoverageBuild(t *testing.T) {
2625*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
2626*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2627*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
2628*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJacocoInstrumentation,
2629*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
2630*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
2631*333d2b36SAndroid Build Coastguard Worker			config.SetBuildFromTextStub(true)
2632*333d2b36SAndroid Build Coastguard Worker		}),
2633*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyEnv(func(env map[string]string) {
2634*333d2b36SAndroid Build Coastguard Worker			env["EMMA_INSTRUMENT"] = "true"
2635*333d2b36SAndroid Build Coastguard Worker		}),
2636*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2637*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
2638*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2639*333d2b36SAndroid Build Coastguard Worker			srcs: ["A.java"],
2640*333d2b36SAndroid Build Coastguard Worker		}
2641*333d2b36SAndroid Build Coastguard Worker	`)
2642*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "stub module expected to depend on from-source stub",
2643*333d2b36SAndroid Build Coastguard Worker		true, CheckModuleHasDependency(t, result.TestContext,
2644*333d2b36SAndroid Build Coastguard Worker			apiScopePublic.stubsLibraryModuleName("foo"), "android_common",
2645*333d2b36SAndroid Build Coastguard Worker			apiScopePublic.sourceStubsLibraryModuleName("foo")))
2646*333d2b36SAndroid Build Coastguard Worker
2647*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "stub module expected to not depend on from-text stub",
2648*333d2b36SAndroid Build Coastguard Worker		false, CheckModuleHasDependency(t, result.TestContext,
2649*333d2b36SAndroid Build Coastguard Worker			apiScopePublic.stubsLibraryModuleName("foo"), "android_common",
2650*333d2b36SAndroid Build Coastguard Worker			apiScopePublic.apiLibraryModuleName("foo")))
2651*333d2b36SAndroid Build Coastguard Worker}
2652*333d2b36SAndroid Build Coastguard Worker
2653*333d2b36SAndroid Build Coastguard Workerfunc TestMultiplePrebuilts(t *testing.T) {
2654*333d2b36SAndroid Build Coastguard Worker	bp := `
2655*333d2b36SAndroid Build Coastguard Worker		// an rdep
2656*333d2b36SAndroid Build Coastguard Worker		java_library {
2657*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2658*333d2b36SAndroid Build Coastguard Worker			libs: ["bar"],
2659*333d2b36SAndroid Build Coastguard Worker		}
2660*333d2b36SAndroid Build Coastguard Worker
2661*333d2b36SAndroid Build Coastguard Worker		// multiple variations of dep
2662*333d2b36SAndroid Build Coastguard Worker		// source
2663*333d2b36SAndroid Build Coastguard Worker		java_library {
2664*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2665*333d2b36SAndroid Build Coastguard Worker			srcs: ["bar.java"],
2666*333d2b36SAndroid Build Coastguard Worker		}
2667*333d2b36SAndroid Build Coastguard Worker		// prebuilt "v1"
2668*333d2b36SAndroid Build Coastguard Worker		java_import {
2669*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2670*333d2b36SAndroid Build Coastguard Worker			jars: ["bar.jar"],
2671*333d2b36SAndroid Build Coastguard Worker		}
2672*333d2b36SAndroid Build Coastguard Worker		// prebuilt "v2"
2673*333d2b36SAndroid Build Coastguard Worker		java_import {
2674*333d2b36SAndroid Build Coastguard Worker			name: "bar.v2",
2675*333d2b36SAndroid Build Coastguard Worker			source_module_name: "bar",
2676*333d2b36SAndroid Build Coastguard Worker			jars: ["bar.v1.jar"],
2677*333d2b36SAndroid Build Coastguard Worker		}
2678*333d2b36SAndroid Build Coastguard Worker
2679*333d2b36SAndroid Build Coastguard Worker		// selectors
2680*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
2681*333d2b36SAndroid Build Coastguard Worker			name: "myapex_contributions",
2682*333d2b36SAndroid Build Coastguard Worker			contents: ["%v"],
2683*333d2b36SAndroid Build Coastguard Worker		}
2684*333d2b36SAndroid Build Coastguard Worker	`
2685*333d2b36SAndroid Build Coastguard Worker	hasDep := func(ctx *android.TestResult, m android.Module, wantDep android.Module) bool {
2686*333d2b36SAndroid Build Coastguard Worker		t.Helper()
2687*333d2b36SAndroid Build Coastguard Worker		var found bool
2688*333d2b36SAndroid Build Coastguard Worker		ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
2689*333d2b36SAndroid Build Coastguard Worker			if dep == wantDep {
2690*333d2b36SAndroid Build Coastguard Worker				found = true
2691*333d2b36SAndroid Build Coastguard Worker			}
2692*333d2b36SAndroid Build Coastguard Worker		})
2693*333d2b36SAndroid Build Coastguard Worker		return found
2694*333d2b36SAndroid Build Coastguard Worker	}
2695*333d2b36SAndroid Build Coastguard Worker
2696*333d2b36SAndroid Build Coastguard Worker	hasFileWithStem := func(m android.TestingModule, stem string) bool {
2697*333d2b36SAndroid Build Coastguard Worker		t.Helper()
2698*333d2b36SAndroid Build Coastguard Worker		for _, o := range m.AllOutputs() {
2699*333d2b36SAndroid Build Coastguard Worker			_, file := filepath.Split(o)
2700*333d2b36SAndroid Build Coastguard Worker			if file == stem+".jar" {
2701*333d2b36SAndroid Build Coastguard Worker				return true
2702*333d2b36SAndroid Build Coastguard Worker			}
2703*333d2b36SAndroid Build Coastguard Worker		}
2704*333d2b36SAndroid Build Coastguard Worker		return false
2705*333d2b36SAndroid Build Coastguard Worker	}
2706*333d2b36SAndroid Build Coastguard Worker
2707*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
2708*333d2b36SAndroid Build Coastguard Worker		desc                   string
2709*333d2b36SAndroid Build Coastguard Worker		selectedDependencyName string
2710*333d2b36SAndroid Build Coastguard Worker		expectedDependencyName string
2711*333d2b36SAndroid Build Coastguard Worker	}{
2712*333d2b36SAndroid Build Coastguard Worker		{
2713*333d2b36SAndroid Build Coastguard Worker			desc:                   "Source library is selected using apex_contributions",
2714*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName: "bar",
2715*333d2b36SAndroid Build Coastguard Worker			expectedDependencyName: "bar",
2716*333d2b36SAndroid Build Coastguard Worker		},
2717*333d2b36SAndroid Build Coastguard Worker		{
2718*333d2b36SAndroid Build Coastguard Worker			desc:                   "Prebuilt library v1 is selected using apex_contributions",
2719*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName: "prebuilt_bar",
2720*333d2b36SAndroid Build Coastguard Worker			expectedDependencyName: "prebuilt_bar",
2721*333d2b36SAndroid Build Coastguard Worker		},
2722*333d2b36SAndroid Build Coastguard Worker		{
2723*333d2b36SAndroid Build Coastguard Worker			desc:                   "Prebuilt library v2 is selected using apex_contributions",
2724*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName: "prebuilt_bar.v2",
2725*333d2b36SAndroid Build Coastguard Worker			expectedDependencyName: "prebuilt_bar.v2",
2726*333d2b36SAndroid Build Coastguard Worker		},
2727*333d2b36SAndroid Build Coastguard Worker	}
2728*333d2b36SAndroid Build Coastguard Worker
2729*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
2730*333d2b36SAndroid Build Coastguard Worker		ctx := android.GroupFixturePreparers(
2731*333d2b36SAndroid Build Coastguard Worker			prepareForJavaTest,
2732*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "myapex_contributions"),
2733*333d2b36SAndroid Build Coastguard Worker		).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName))
2734*333d2b36SAndroid Build Coastguard Worker
2735*333d2b36SAndroid Build Coastguard Worker		// check that rdep gets the correct variation of dep
2736*333d2b36SAndroid Build Coastguard Worker		foo := ctx.ModuleForTests("foo", "android_common")
2737*333d2b36SAndroid Build Coastguard Worker		expectedDependency := ctx.ModuleForTests(tc.expectedDependencyName, "android_common")
2738*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from %s to %s\n", foo.Module().Name(), tc.expectedDependencyName), true, hasDep(ctx, foo.Module(), expectedDependency.Module()))
2739*333d2b36SAndroid Build Coastguard Worker
2740*333d2b36SAndroid Build Coastguard Worker		// check that output file of dep is always bar.jar
2741*333d2b36SAndroid Build Coastguard Worker		// The filename should be agnostic to source/prebuilt/prebuilt_version
2742*333d2b36SAndroid Build Coastguard Worker		android.AssertBoolEquals(t, fmt.Sprintf("could not find bar.jar in outputs of %s. All Outputs %v\n", tc.expectedDependencyName, expectedDependency.AllOutputs()), true, hasFileWithStem(expectedDependency, "bar"))
2743*333d2b36SAndroid Build Coastguard Worker
2744*333d2b36SAndroid Build Coastguard Worker		// check LOCAL_MODULE of the selected module name
2745*333d2b36SAndroid Build Coastguard Worker		// the prebuilt should have the same LOCAL_MODULE when exported to make
2746*333d2b36SAndroid Build Coastguard Worker		entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, expectedDependency.Module())[0]
2747*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "unexpected LOCAL_MODULE", "bar", entries.EntryMap["LOCAL_MODULE"][0])
2748*333d2b36SAndroid Build Coastguard Worker	}
2749*333d2b36SAndroid Build Coastguard Worker}
2750*333d2b36SAndroid Build Coastguard Worker
2751*333d2b36SAndroid Build Coastguard Workerfunc TestMultiplePlatformCompatConfigPrebuilts(t *testing.T) {
2752*333d2b36SAndroid Build Coastguard Worker	bp := `
2753*333d2b36SAndroid Build Coastguard Worker		// multiple variations of platform_compat_config
2754*333d2b36SAndroid Build Coastguard Worker		// source
2755*333d2b36SAndroid Build Coastguard Worker		platform_compat_config {
2756*333d2b36SAndroid Build Coastguard Worker			name: "myconfig",
2757*333d2b36SAndroid Build Coastguard Worker		}
2758*333d2b36SAndroid Build Coastguard Worker		// prebuilt "v1"
2759*333d2b36SAndroid Build Coastguard Worker		prebuilt_platform_compat_config {
2760*333d2b36SAndroid Build Coastguard Worker			name: "myconfig",
2761*333d2b36SAndroid Build Coastguard Worker			metadata: "myconfig.xml",
2762*333d2b36SAndroid Build Coastguard Worker		}
2763*333d2b36SAndroid Build Coastguard Worker		// prebuilt "v2"
2764*333d2b36SAndroid Build Coastguard Worker		prebuilt_platform_compat_config {
2765*333d2b36SAndroid Build Coastguard Worker			name: "myconfig.v2",
2766*333d2b36SAndroid Build Coastguard Worker			source_module_name: "myconfig", // without source_module_name, the singleton will merge two .xml files
2767*333d2b36SAndroid Build Coastguard Worker			metadata: "myconfig.v2.xml",
2768*333d2b36SAndroid Build Coastguard Worker		}
2769*333d2b36SAndroid Build Coastguard Worker
2770*333d2b36SAndroid Build Coastguard Worker		// selectors
2771*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
2772*333d2b36SAndroid Build Coastguard Worker			name: "myapex_contributions",
2773*333d2b36SAndroid Build Coastguard Worker			contents: ["%v"],
2774*333d2b36SAndroid Build Coastguard Worker		}
2775*333d2b36SAndroid Build Coastguard Worker	`
2776*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
2777*333d2b36SAndroid Build Coastguard Worker		desc                            string
2778*333d2b36SAndroid Build Coastguard Worker		selectedDependencyName          string
2779*333d2b36SAndroid Build Coastguard Worker		expectedPlatformCompatConfigXml string
2780*333d2b36SAndroid Build Coastguard Worker	}{
2781*333d2b36SAndroid Build Coastguard Worker		{
2782*333d2b36SAndroid Build Coastguard Worker			desc:                            "Source platform_compat_config is selected using apex_contributions",
2783*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName:          "myconfig",
2784*333d2b36SAndroid Build Coastguard Worker			expectedPlatformCompatConfigXml: "out/soong/.intermediates/myconfig/android_common/myconfig_meta.xml",
2785*333d2b36SAndroid Build Coastguard Worker		},
2786*333d2b36SAndroid Build Coastguard Worker		{
2787*333d2b36SAndroid Build Coastguard Worker			desc:                            "Prebuilt platform_compat_config v1 is selected using apex_contributions",
2788*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName:          "prebuilt_myconfig",
2789*333d2b36SAndroid Build Coastguard Worker			expectedPlatformCompatConfigXml: "myconfig.xml",
2790*333d2b36SAndroid Build Coastguard Worker		},
2791*333d2b36SAndroid Build Coastguard Worker		{
2792*333d2b36SAndroid Build Coastguard Worker			desc:                            "Prebuilt platform_compat_config v2 is selected using apex_contributions",
2793*333d2b36SAndroid Build Coastguard Worker			selectedDependencyName:          "prebuilt_myconfig.v2",
2794*333d2b36SAndroid Build Coastguard Worker			expectedPlatformCompatConfigXml: "myconfig.v2.xml",
2795*333d2b36SAndroid Build Coastguard Worker		},
2796*333d2b36SAndroid Build Coastguard Worker	}
2797*333d2b36SAndroid Build Coastguard Worker
2798*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
2799*333d2b36SAndroid Build Coastguard Worker		ctx := android.GroupFixturePreparers(
2800*333d2b36SAndroid Build Coastguard Worker			prepareForJavaTest,
2801*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithPlatformCompatConfig,
2802*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "myapex_contributions"),
2803*333d2b36SAndroid Build Coastguard Worker		).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName))
2804*333d2b36SAndroid Build Coastguard Worker
2805*333d2b36SAndroid Build Coastguard Worker		mergedGlobalConfig := ctx.SingletonForTests("platform_compat_config_singleton").Output("compat_config/merged_compat_config.xml")
2806*333d2b36SAndroid Build Coastguard Worker		android.AssertIntEquals(t, "The merged compat config file should only have a single dependency", 1, len(mergedGlobalConfig.Implicits))
2807*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "The merged compat config file is missing the appropriate platform compat config", mergedGlobalConfig.Implicits[0].String(), tc.expectedPlatformCompatConfigXml)
2808*333d2b36SAndroid Build Coastguard Worker	}
2809*333d2b36SAndroid Build Coastguard Worker}
2810*333d2b36SAndroid Build Coastguard Worker
2811*333d2b36SAndroid Build Coastguard Workerfunc TestApiLibraryAconfigDeclarations(t *testing.T) {
2812*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
2813*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2814*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2815*333d2b36SAndroid Build Coastguard Worker		}),
2816*333d2b36SAndroid Build Coastguard Worker		android.FixtureMergeMockFs(map[string][]byte{
2817*333d2b36SAndroid Build Coastguard Worker			"a/A.java":      nil,
2818*333d2b36SAndroid Build Coastguard Worker			"a/current.txt": nil,
2819*333d2b36SAndroid Build Coastguard Worker			"a/removed.txt": nil,
2820*333d2b36SAndroid Build Coastguard Worker		}),
2821*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2822*333d2b36SAndroid Build Coastguard Worker	aconfig_declarations {
2823*333d2b36SAndroid Build Coastguard Worker		name: "bar",
2824*333d2b36SAndroid Build Coastguard Worker		package: "com.example.package",
2825*333d2b36SAndroid Build Coastguard Worker		container: "com.android.foo",
2826*333d2b36SAndroid Build Coastguard Worker		srcs: [
2827*333d2b36SAndroid Build Coastguard Worker			"bar.aconfig",
2828*333d2b36SAndroid Build Coastguard Worker		],
2829*333d2b36SAndroid Build Coastguard Worker	}
2830*333d2b36SAndroid Build Coastguard Worker	java_api_contribution {
2831*333d2b36SAndroid Build Coastguard Worker		name: "baz",
2832*333d2b36SAndroid Build Coastguard Worker		api_file: "a/current.txt",
2833*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2834*333d2b36SAndroid Build Coastguard Worker	}
2835*333d2b36SAndroid Build Coastguard Worker	java_api_library {
2836*333d2b36SAndroid Build Coastguard Worker		name: "foo",
2837*333d2b36SAndroid Build Coastguard Worker		api_surface: "public",
2838*333d2b36SAndroid Build Coastguard Worker		api_contributions: [
2839*333d2b36SAndroid Build Coastguard Worker			"baz",
2840*333d2b36SAndroid Build Coastguard Worker		],
2841*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations: [
2842*333d2b36SAndroid Build Coastguard Worker			"bar",
2843*333d2b36SAndroid Build Coastguard Worker		],
2844*333d2b36SAndroid Build Coastguard Worker		stubs_type: "exportable",
2845*333d2b36SAndroid Build Coastguard Worker		enable_validation: false,
2846*333d2b36SAndroid Build Coastguard Worker	}
2847*333d2b36SAndroid Build Coastguard Worker	`)
2848*333d2b36SAndroid Build Coastguard Worker
2849*333d2b36SAndroid Build Coastguard Worker	// Check if java_api_library depends on aconfig_declarations
2850*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "foo expected to depend on bar",
2851*333d2b36SAndroid Build Coastguard Worker		CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"), true)
2852*333d2b36SAndroid Build Coastguard Worker
2853*333d2b36SAndroid Build Coastguard Worker	m := result.ModuleForTests("foo", "android_common")
2854*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "foo generates revert annotations file",
2855*333d2b36SAndroid Build Coastguard Worker		strings.Join(m.AllOutputs(), ""), "revert-annotations-exportable.txt")
2856*333d2b36SAndroid Build Coastguard Worker
2857*333d2b36SAndroid Build Coastguard Worker	// revert-annotations.txt passed to exportable stubs generation metalava command
2858*333d2b36SAndroid Build Coastguard Worker	manifest := m.Output("metalava.sbox.textproto")
2859*333d2b36SAndroid Build Coastguard Worker	cmdline := String(android.RuleBuilderSboxProtoForTests(t, result.TestContext, manifest).Commands[0].Command)
2860*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "flagged api hide command not included", cmdline, "revert-annotations-exportable.txt")
2861*333d2b36SAndroid Build Coastguard Worker}
2862*333d2b36SAndroid Build Coastguard Worker
2863*333d2b36SAndroid Build Coastguard Workerfunc TestTestOnly(t *testing.T) {
2864*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
2865*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
2866*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
2867*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2868*333d2b36SAndroid Build Coastguard Worker                // These should be test-only
2869*333d2b36SAndroid Build Coastguard Worker		java_library {
2870*333d2b36SAndroid Build Coastguard Worker			name: "lib1-test-only",
2871*333d2b36SAndroid Build Coastguard Worker                        srcs: ["a.java"],
2872*333d2b36SAndroid Build Coastguard Worker                        test_only: true,
2873*333d2b36SAndroid Build Coastguard Worker		}
2874*333d2b36SAndroid Build Coastguard Worker                java_test {
2875*333d2b36SAndroid Build Coastguard Worker                        name: "java-test",
2876*333d2b36SAndroid Build Coastguard Worker                }
2877*333d2b36SAndroid Build Coastguard Worker                java_test_host {
2878*333d2b36SAndroid Build Coastguard Worker                        name: "java-test-host",
2879*333d2b36SAndroid Build Coastguard Worker                }
2880*333d2b36SAndroid Build Coastguard Worker                java_test_helper_library {
2881*333d2b36SAndroid Build Coastguard Worker                        name: "helper-library",
2882*333d2b36SAndroid Build Coastguard Worker                }
2883*333d2b36SAndroid Build Coastguard Worker                java_binary {
2884*333d2b36SAndroid Build Coastguard Worker                        name: "java-data-binary",
2885*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
2886*333d2b36SAndroid Build Coastguard Worker			main_class: "foo.bar.jb",
2887*333d2b36SAndroid Build Coastguard Worker                        test_only: true,
2888*333d2b36SAndroid Build Coastguard Worker                }
2889*333d2b36SAndroid Build Coastguard Worker
2890*333d2b36SAndroid Build Coastguard Worker                // These are NOT
2891*333d2b36SAndroid Build Coastguard Worker		java_library {
2892*333d2b36SAndroid Build Coastguard Worker			name: "lib2-app",
2893*333d2b36SAndroid Build Coastguard Worker                        srcs: ["b.java"],
2894*333d2b36SAndroid Build Coastguard Worker		}
2895*333d2b36SAndroid Build Coastguard Worker		java_import {
2896*333d2b36SAndroid Build Coastguard Worker			name: "bar",
2897*333d2b36SAndroid Build Coastguard Worker			jars: ["bar.jar"],
2898*333d2b36SAndroid Build Coastguard Worker		}
2899*333d2b36SAndroid Build Coastguard Worker                java_binary {
2900*333d2b36SAndroid Build Coastguard Worker                        name: "java-binary",
2901*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
2902*333d2b36SAndroid Build Coastguard Worker			main_class: "foo.bar.jb",
2903*333d2b36SAndroid Build Coastguard Worker                }
2904*333d2b36SAndroid Build Coastguard Worker	`)
2905*333d2b36SAndroid Build Coastguard Worker
2906*333d2b36SAndroid Build Coastguard Worker	expectedTestOnlyModules := []string{
2907*333d2b36SAndroid Build Coastguard Worker		"lib1-test-only",
2908*333d2b36SAndroid Build Coastguard Worker		"java-test",
2909*333d2b36SAndroid Build Coastguard Worker		"java-test-host",
2910*333d2b36SAndroid Build Coastguard Worker		"helper-library",
2911*333d2b36SAndroid Build Coastguard Worker		"java-data-binary",
2912*333d2b36SAndroid Build Coastguard Worker	}
2913*333d2b36SAndroid Build Coastguard Worker	expectedTopLevelTests := []string{
2914*333d2b36SAndroid Build Coastguard Worker		"java-test",
2915*333d2b36SAndroid Build Coastguard Worker		"java-test-host",
2916*333d2b36SAndroid Build Coastguard Worker	}
2917*333d2b36SAndroid Build Coastguard Worker	assertTestOnlyAndTopLevel(t, ctx, expectedTestOnlyModules, expectedTopLevelTests)
2918*333d2b36SAndroid Build Coastguard Worker}
2919*333d2b36SAndroid Build Coastguard Worker
2920*333d2b36SAndroid Build Coastguard Worker// Don't allow setting test-only on things that are always tests or never tests.
2921*333d2b36SAndroid Build Coastguard Workerfunc TestInvalidTestOnlyTargets(t *testing.T) {
2922*333d2b36SAndroid Build Coastguard Worker	testCases := []string{
2923*333d2b36SAndroid Build Coastguard Worker		` java_test {  name: "java-test", test_only: true, srcs: ["foo.java"],  } `,
2924*333d2b36SAndroid Build Coastguard Worker		` java_test_host {  name: "java-test-host", test_only: true, srcs: ["foo.java"],  } `,
2925*333d2b36SAndroid Build Coastguard Worker		` java_test_import {  name: "java-test-import", test_only: true, } `,
2926*333d2b36SAndroid Build Coastguard Worker		` java_api_library {  name: "java-api-library", test_only: true, } `,
2927*333d2b36SAndroid Build Coastguard Worker		` java_test_helper_library { name: "test-help-lib", test_only: true, } `,
2928*333d2b36SAndroid Build Coastguard Worker		` java_defaults { name: "java-defaults", test_only: true, } `,
2929*333d2b36SAndroid Build Coastguard Worker	}
2930*333d2b36SAndroid Build Coastguard Worker
2931*333d2b36SAndroid Build Coastguard Worker	for i, bp := range testCases {
2932*333d2b36SAndroid Build Coastguard Worker		android.GroupFixturePreparers(prepareForJavaTest).
2933*333d2b36SAndroid Build Coastguard Worker			ExtendWithErrorHandler(
2934*333d2b36SAndroid Build Coastguard Worker				expectOneError("unrecognized property \"test_only\"",
2935*333d2b36SAndroid Build Coastguard Worker					fmt.Sprintf("testcase: %d", i))).
2936*333d2b36SAndroid Build Coastguard Worker			RunTestWithBp(t, bp)
2937*333d2b36SAndroid Build Coastguard Worker	}
2938*333d2b36SAndroid Build Coastguard Worker}
2939*333d2b36SAndroid Build Coastguard Worker
2940*333d2b36SAndroid Build Coastguard Worker// Expect exactly one that matches 'expected'.
2941*333d2b36SAndroid Build Coastguard Worker// Append 'msg' to the Errorf that printed.
2942*333d2b36SAndroid Build Coastguard Workerfunc expectOneError(expected string, msg string) android.FixtureErrorHandler {
2943*333d2b36SAndroid Build Coastguard Worker	return android.FixtureCustomErrorHandler(func(t *testing.T, result *android.TestResult) {
2944*333d2b36SAndroid Build Coastguard Worker		t.Helper()
2945*333d2b36SAndroid Build Coastguard Worker		if len(result.Errs) != 1 {
2946*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Expected exactly one error, but found: %d when  setting test_only on: %s", len(result.Errs), msg)
2947*333d2b36SAndroid Build Coastguard Worker			return
2948*333d2b36SAndroid Build Coastguard Worker		}
2949*333d2b36SAndroid Build Coastguard Worker		actualErrMsg := result.Errs[0].Error()
2950*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(actualErrMsg, expected) {
2951*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Different error than expected.  Received: [%v] on %s expected: %s", actualErrMsg, msg, expected)
2952*333d2b36SAndroid Build Coastguard Worker		}
2953*333d2b36SAndroid Build Coastguard Worker	})
2954*333d2b36SAndroid Build Coastguard Worker}
2955*333d2b36SAndroid Build Coastguard Worker
2956*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibHostWithStem(t *testing.T) {
2957*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
2958*333d2b36SAndroid Build Coastguard Worker		java_library_host {
2959*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2960*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2961*333d2b36SAndroid Build Coastguard Worker			stem: "foo-new",
2962*333d2b36SAndroid Build Coastguard Worker		}
2963*333d2b36SAndroid Build Coastguard Worker	`)
2964*333d2b36SAndroid Build Coastguard Worker
2965*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
2966*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", buildOS+"_common")
2967*333d2b36SAndroid Build Coastguard Worker
2968*333d2b36SAndroid Build Coastguard Worker	outputs := fmt.Sprint(foo.AllOutputs())
2969*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(outputs, "foo-new.jar") {
2970*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Module output does not contain expected jar %s", "foo-new.jar")
2971*333d2b36SAndroid Build Coastguard Worker	}
2972*333d2b36SAndroid Build Coastguard Worker}
2973*333d2b36SAndroid Build Coastguard Worker
2974*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibWithStem(t *testing.T) {
2975*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
2976*333d2b36SAndroid Build Coastguard Worker		java_library {
2977*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2978*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2979*333d2b36SAndroid Build Coastguard Worker			stem: "foo-new",
2980*333d2b36SAndroid Build Coastguard Worker		}
2981*333d2b36SAndroid Build Coastguard Worker	`)
2982*333d2b36SAndroid Build Coastguard Worker
2983*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", "android_common")
2984*333d2b36SAndroid Build Coastguard Worker
2985*333d2b36SAndroid Build Coastguard Worker	outputs := fmt.Sprint(foo.AllOutputs())
2986*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(outputs, "foo-new.jar") {
2987*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Module output does not contain expected jar %s", "foo-new.jar")
2988*333d2b36SAndroid Build Coastguard Worker	}
2989*333d2b36SAndroid Build Coastguard Worker}
2990*333d2b36SAndroid Build Coastguard Worker
2991*333d2b36SAndroid Build Coastguard Workerfunc TestJavaLibraryOutputFilesRel(t *testing.T) {
2992*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
2993*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
2994*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
2995*333d2b36SAndroid Build Coastguard Worker		java_library {
2996*333d2b36SAndroid Build Coastguard Worker			name: "foo",
2997*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
2998*333d2b36SAndroid Build Coastguard Worker		}
2999*333d2b36SAndroid Build Coastguard Worker
3000*333d2b36SAndroid Build Coastguard Worker		java_import {
3001*333d2b36SAndroid Build Coastguard Worker			name: "bar",
3002*333d2b36SAndroid Build Coastguard Worker			jars: ["bar.aar"],
3003*333d2b36SAndroid Build Coastguard Worker
3004*333d2b36SAndroid Build Coastguard Worker		}
3005*333d2b36SAndroid Build Coastguard Worker
3006*333d2b36SAndroid Build Coastguard Worker		java_import {
3007*333d2b36SAndroid Build Coastguard Worker			name: "baz",
3008*333d2b36SAndroid Build Coastguard Worker			jars: ["baz.aar"],
3009*333d2b36SAndroid Build Coastguard Worker			static_libs: ["bar"],
3010*333d2b36SAndroid Build Coastguard Worker		}
3011*333d2b36SAndroid Build Coastguard Worker	`)
3012*333d2b36SAndroid Build Coastguard Worker
3013*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
3014*333d2b36SAndroid Build Coastguard Worker	bar := result.ModuleForTests("bar", "android_common")
3015*333d2b36SAndroid Build Coastguard Worker	baz := result.ModuleForTests("baz", "android_common")
3016*333d2b36SAndroid Build Coastguard Worker
3017*333d2b36SAndroid Build Coastguard Worker	fooOutputPaths := foo.OutputFiles(result.TestContext, t, "")
3018*333d2b36SAndroid Build Coastguard Worker	barOutputPaths := bar.OutputFiles(result.TestContext, t, "")
3019*333d2b36SAndroid Build Coastguard Worker	bazOutputPaths := baz.OutputFiles(result.TestContext, t, "")
3020*333d2b36SAndroid Build Coastguard Worker
3021*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "foo output path",
3022*333d2b36SAndroid Build Coastguard Worker		[]string{"out/soong/.intermediates/foo/android_common/javac/foo.jar"}, fooOutputPaths)
3023*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "bar output path",
3024*333d2b36SAndroid Build Coastguard Worker		[]string{"out/soong/.intermediates/bar/android_common/combined/bar.jar"}, barOutputPaths)
3025*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "baz output path",
3026*333d2b36SAndroid Build Coastguard Worker		[]string{"out/soong/.intermediates/baz/android_common/combined/baz.jar"}, bazOutputPaths)
3027*333d2b36SAndroid Build Coastguard Worker
3028*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "foo relative output path",
3029*333d2b36SAndroid Build Coastguard Worker		"foo.jar", fooOutputPaths[0].Rel())
3030*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "bar relative output path",
3031*333d2b36SAndroid Build Coastguard Worker		"bar.jar", barOutputPaths[0].Rel())
3032*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "baz relative output path",
3033*333d2b36SAndroid Build Coastguard Worker		"baz.jar", bazOutputPaths[0].Rel())
3034*333d2b36SAndroid Build Coastguard Worker}
3035*333d2b36SAndroid Build Coastguard Worker
3036*333d2b36SAndroid Build Coastguard Workerfunc TestCoverage(t *testing.T) {
3037*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
3038*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
3039*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithFrameworkJacocoInstrumentation,
3040*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithTransitiveClasspathEnabled,
3041*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
3042*333d2b36SAndroid Build Coastguard Worker		android_app {
3043*333d2b36SAndroid Build Coastguard Worker			name: "foo",
3044*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
3045*333d2b36SAndroid Build Coastguard Worker			static_libs: ["android.car"],
3046*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
3047*333d2b36SAndroid Build Coastguard Worker		}
3048*333d2b36SAndroid Build Coastguard Worker
3049*333d2b36SAndroid Build Coastguard Worker		// A library in InstrumentFrameworkModules
3050*333d2b36SAndroid Build Coastguard Worker		java_library {
3051*333d2b36SAndroid Build Coastguard Worker			name: "android.car",
3052*333d2b36SAndroid Build Coastguard Worker			srcs: ["android.car.java"],
3053*333d2b36SAndroid Build Coastguard Worker			installable: true,
3054*333d2b36SAndroid Build Coastguard Worker		}
3055*333d2b36SAndroid Build Coastguard Worker	`)
3056*333d2b36SAndroid Build Coastguard Worker
3057*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
3058*333d2b36SAndroid Build Coastguard Worker	androidCar := result.ModuleForTests("android.car", "android_common")
3059*333d2b36SAndroid Build Coastguard Worker
3060*333d2b36SAndroid Build Coastguard Worker	fooJacoco := foo.Rule("jacoco")
3061*333d2b36SAndroid Build Coastguard Worker	fooCombine := foo.Description("for javac")
3062*333d2b36SAndroid Build Coastguard Worker
3063*333d2b36SAndroid Build Coastguard Worker	androidCarJacoco := androidCar.Rule("jacoco")
3064*333d2b36SAndroid Build Coastguard Worker	androidCarJavac := androidCar.Rule("javac")
3065*333d2b36SAndroid Build Coastguard Worker
3066*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "foo instrumentation rule inputs", fooJacoco.Input.String(), fooCombine.Output.String())
3067*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "android.car instrumentation rule inputs", androidCarJacoco.Input.String(), androidCarJavac.Output.String())
3068*333d2b36SAndroid Build Coastguard Worker
3069*333d2b36SAndroid Build Coastguard Worker	// The input to instrumentation for the `foo` app contains the non-instrumented android.car classes.
3070*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "foo combined inputs", fooCombine.Inputs.Strings(), androidCarJavac.Output.String())
3071*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "foo combined inputs", fooCombine.Inputs.Strings(), androidCarJacoco.Output.String())
3072*333d2b36SAndroid Build Coastguard Worker}
3073*333d2b36SAndroid Build Coastguard Worker
3074*333d2b36SAndroid Build Coastguard Workerfunc assertTestOnlyAndTopLevel(t *testing.T, ctx *android.TestResult, expectedTestOnly []string, expectedTopLevel []string) {
3075*333d2b36SAndroid Build Coastguard Worker	t.Helper()
3076*333d2b36SAndroid Build Coastguard Worker	actualTrueModules := []string{}
3077*333d2b36SAndroid Build Coastguard Worker	actualTopLevelTests := []string{}
3078*333d2b36SAndroid Build Coastguard Worker	addActuals := func(m blueprint.Module, key blueprint.ProviderKey[android.TestModuleInformation]) {
3079*333d2b36SAndroid Build Coastguard Worker		if provider, ok := android.OtherModuleProvider(ctx.TestContext.OtherModuleProviderAdaptor(), m, key); ok {
3080*333d2b36SAndroid Build Coastguard Worker			if provider.TestOnly {
3081*333d2b36SAndroid Build Coastguard Worker				actualTrueModules = append(actualTrueModules, m.Name())
3082*333d2b36SAndroid Build Coastguard Worker			}
3083*333d2b36SAndroid Build Coastguard Worker			if provider.TopLevelTarget {
3084*333d2b36SAndroid Build Coastguard Worker				actualTopLevelTests = append(actualTopLevelTests, m.Name())
3085*333d2b36SAndroid Build Coastguard Worker			}
3086*333d2b36SAndroid Build Coastguard Worker		}
3087*333d2b36SAndroid Build Coastguard Worker	}
3088*333d2b36SAndroid Build Coastguard Worker
3089*333d2b36SAndroid Build Coastguard Worker	ctx.VisitAllModules(func(m blueprint.Module) {
3090*333d2b36SAndroid Build Coastguard Worker		addActuals(m, android.TestOnlyProviderKey)
3091*333d2b36SAndroid Build Coastguard Worker
3092*333d2b36SAndroid Build Coastguard Worker	})
3093*333d2b36SAndroid Build Coastguard Worker
3094*333d2b36SAndroid Build Coastguard Worker	notEqual, left, right := android.ListSetDifference(expectedTestOnly, actualTrueModules)
3095*333d2b36SAndroid Build Coastguard Worker	if notEqual {
3096*333d2b36SAndroid Build Coastguard Worker		t.Errorf("test-only: Expected but not found: %v, Found but not expected: %v", left, right)
3097*333d2b36SAndroid Build Coastguard Worker	}
3098*333d2b36SAndroid Build Coastguard Worker
3099*333d2b36SAndroid Build Coastguard Worker	notEqual, left, right = android.ListSetDifference(expectedTopLevel, actualTopLevelTests)
3100*333d2b36SAndroid Build Coastguard Worker	if notEqual {
3101*333d2b36SAndroid Build Coastguard Worker		t.Errorf("top-level: Expected but not found: %v, Found but not expected: %v", left, right)
3102*333d2b36SAndroid Build Coastguard Worker	}
3103*333d2b36SAndroid Build Coastguard Worker}
3104*333d2b36SAndroid Build Coastguard Worker
3105*333d2b36SAndroid Build Coastguard Worker// Test that a dependency edge is created to the matching variant of a native library listed in `jni_libs` of java_binary
3106*333d2b36SAndroid Build Coastguard Workerfunc TestNativeRequiredDepOfJavaBinary(t *testing.T) {
3107*333d2b36SAndroid Build Coastguard Worker	findDepsOfModule := func(ctx *android.TestContext, module android.Module, depName string) []blueprint.Module {
3108*333d2b36SAndroid Build Coastguard Worker		var ret []blueprint.Module
3109*333d2b36SAndroid Build Coastguard Worker		ctx.VisitDirectDeps(module, func(dep blueprint.Module) {
3110*333d2b36SAndroid Build Coastguard Worker			if dep.Name() == depName {
3111*333d2b36SAndroid Build Coastguard Worker				ret = append(ret, dep)
3112*333d2b36SAndroid Build Coastguard Worker			}
3113*333d2b36SAndroid Build Coastguard Worker		})
3114*333d2b36SAndroid Build Coastguard Worker		return ret
3115*333d2b36SAndroid Build Coastguard Worker	}
3116*333d2b36SAndroid Build Coastguard Worker
3117*333d2b36SAndroid Build Coastguard Worker	bp := cc.GatherRequiredDepsForTest(android.Android) + `
3118*333d2b36SAndroid Build Coastguard Workerjava_binary {
3119*333d2b36SAndroid Build Coastguard Worker	name: "myjavabin",
3120*333d2b36SAndroid Build Coastguard Worker	main_class: "com.android.MyJava",
3121*333d2b36SAndroid Build Coastguard Worker	jni_libs: ["mynativelib"],
3122*333d2b36SAndroid Build Coastguard Worker}
3123*333d2b36SAndroid Build Coastguard Workercc_library_shared {
3124*333d2b36SAndroid Build Coastguard Worker	name: "mynativelib",
3125*333d2b36SAndroid Build Coastguard Worker}
3126*333d2b36SAndroid Build Coastguard Worker`
3127*333d2b36SAndroid Build Coastguard Worker	res, _ := testJava(t, bp)
3128*333d2b36SAndroid Build Coastguard Worker	deps := findDepsOfModule(res, res.ModuleForTests("myjavabin", "android_common").Module(), "mynativelib")
3129*333d2b36SAndroid Build Coastguard Worker	android.AssertIntEquals(t, "Create a dep on the first variant", 1, len(deps))
3130*333d2b36SAndroid Build Coastguard Worker}
3131