xref: /aosp_15_r20/build/soong/java/dex_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2022 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	"testing"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerfunc TestR8(t *testing.T) {
27*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, `
28*333d2b36SAndroid Build Coastguard Worker		android_app {
29*333d2b36SAndroid Build Coastguard Worker			name: "app",
30*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
31*333d2b36SAndroid Build Coastguard Worker			libs: ["lib"],
32*333d2b36SAndroid Build Coastguard Worker			static_libs: ["static_lib"],
33*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
34*333d2b36SAndroid Build Coastguard Worker		}
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Worker		android_app {
37*333d2b36SAndroid Build Coastguard Worker			name: "stable_app",
38*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
39*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
40*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "31",
41*333d2b36SAndroid Build Coastguard Worker		}
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker		android_app {
44*333d2b36SAndroid Build Coastguard Worker			name: "core_platform_app",
45*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
46*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_platform",
47*333d2b36SAndroid Build Coastguard Worker			min_sdk_version: "31",
48*333d2b36SAndroid Build Coastguard Worker		}
49*333d2b36SAndroid Build Coastguard Worker
50*333d2b36SAndroid Build Coastguard Worker		java_library {
51*333d2b36SAndroid Build Coastguard Worker			name: "lib",
52*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
53*333d2b36SAndroid Build Coastguard Worker		}
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker		java_library {
56*333d2b36SAndroid Build Coastguard Worker			name: "static_lib",
57*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
58*333d2b36SAndroid Build Coastguard Worker		}
59*333d2b36SAndroid Build Coastguard Worker	`)
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Worker	app := result.ModuleForTests("app", "android_common")
62*333d2b36SAndroid Build Coastguard Worker	stableApp := result.ModuleForTests("stable_app", "android_common")
63*333d2b36SAndroid Build Coastguard Worker	corePlatformApp := result.ModuleForTests("core_platform_app", "android_common")
64*333d2b36SAndroid Build Coastguard Worker	lib := result.ModuleForTests("lib", "android_common")
65*333d2b36SAndroid Build Coastguard Worker	staticLib := result.ModuleForTests("static_lib", "android_common")
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker	appJavac := app.Rule("javac")
68*333d2b36SAndroid Build Coastguard Worker	appR8 := app.Rule("r8")
69*333d2b36SAndroid Build Coastguard Worker	stableAppR8 := stableApp.Rule("r8")
70*333d2b36SAndroid Build Coastguard Worker	corePlatformAppR8 := corePlatformApp.Rule("r8")
71*333d2b36SAndroid Build Coastguard Worker	libHeader := lib.Output("turbine-combined/lib.jar").Output
72*333d2b36SAndroid Build Coastguard Worker	staticLibHeader := staticLib.Output("turbine-combined/static_lib.jar").Output
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected lib header jar in app javac classpath",
75*333d2b36SAndroid Build Coastguard Worker		appJavac.Args["classpath"], libHeader.String())
76*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected static_lib header jar in app javac classpath",
77*333d2b36SAndroid Build Coastguard Worker		appJavac.Args["classpath"], staticLibHeader.String())
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected lib header jar in app r8 classpath",
80*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], libHeader.String())
81*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "expected no static_lib header jar in app r8 classpath",
82*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], staticLibHeader.String())
83*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected -ignorewarnings in app r8 flags",
84*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "-ignorewarnings")
85*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected --android-platform-build in app r8 flags",
86*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "--android-platform-build")
87*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "expected no --android-platform-build in stable_app r8 flags",
88*333d2b36SAndroid Build Coastguard Worker		stableAppR8.Args["r8Flags"], "--android-platform-build")
89*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected --android-platform-build in core_platform_app r8 flags",
90*333d2b36SAndroid Build Coastguard Worker		corePlatformAppR8.Args["r8Flags"], "--android-platform-build")
91*333d2b36SAndroid Build Coastguard Worker}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Workerfunc TestR8TransitiveDeps(t *testing.T) {
94*333d2b36SAndroid Build Coastguard Worker	bp := `
95*333d2b36SAndroid Build Coastguard Worker		override_android_app {
96*333d2b36SAndroid Build Coastguard Worker			name: "override_app",
97*333d2b36SAndroid Build Coastguard Worker			base: "app",
98*333d2b36SAndroid Build Coastguard Worker		}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker		android_app {
101*333d2b36SAndroid Build Coastguard Worker			name: "app",
102*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
103*333d2b36SAndroid Build Coastguard Worker			libs: [
104*333d2b36SAndroid Build Coastguard Worker				"lib",
105*333d2b36SAndroid Build Coastguard Worker				"uses_libs_dep_import",
106*333d2b36SAndroid Build Coastguard Worker			],
107*333d2b36SAndroid Build Coastguard Worker			static_libs: [
108*333d2b36SAndroid Build Coastguard Worker				"static_lib",
109*333d2b36SAndroid Build Coastguard Worker				"repeated_dep",
110*333d2b36SAndroid Build Coastguard Worker			],
111*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
112*333d2b36SAndroid Build Coastguard Worker		}
113*333d2b36SAndroid Build Coastguard Worker
114*333d2b36SAndroid Build Coastguard Worker		java_library {
115*333d2b36SAndroid Build Coastguard Worker			name: "static_lib",
116*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
117*333d2b36SAndroid Build Coastguard Worker		}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker		java_library {
120*333d2b36SAndroid Build Coastguard Worker			name: "lib",
121*333d2b36SAndroid Build Coastguard Worker			libs: [
122*333d2b36SAndroid Build Coastguard Worker				"transitive_lib",
123*333d2b36SAndroid Build Coastguard Worker				"repeated_dep",
124*333d2b36SAndroid Build Coastguard Worker				"prebuilt_lib",
125*333d2b36SAndroid Build Coastguard Worker			],
126*333d2b36SAndroid Build Coastguard Worker			static_libs: ["transitive_static_lib"],
127*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
128*333d2b36SAndroid Build Coastguard Worker		}
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker		java_library {
131*333d2b36SAndroid Build Coastguard Worker			name: "repeated_dep",
132*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
133*333d2b36SAndroid Build Coastguard Worker		}
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker		java_library {
136*333d2b36SAndroid Build Coastguard Worker			name: "transitive_static_lib",
137*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
138*333d2b36SAndroid Build Coastguard Worker		}
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Worker		java_library {
141*333d2b36SAndroid Build Coastguard Worker			name: "transitive_lib",
142*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
143*333d2b36SAndroid Build Coastguard Worker			libs: ["transitive_lib_2"],
144*333d2b36SAndroid Build Coastguard Worker		}
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker		java_library {
147*333d2b36SAndroid Build Coastguard Worker			name: "transitive_lib_2",
148*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
149*333d2b36SAndroid Build Coastguard Worker		}
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker		java_import {
152*333d2b36SAndroid Build Coastguard Worker			name: "lib",
153*333d2b36SAndroid Build Coastguard Worker			jars: ["lib.jar"],
154*333d2b36SAndroid Build Coastguard Worker		}
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Worker		java_library {
157*333d2b36SAndroid Build Coastguard Worker			name: "uses_lib",
158*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
159*333d2b36SAndroid Build Coastguard Worker		}
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Worker		java_library {
162*333d2b36SAndroid Build Coastguard Worker			name: "optional_uses_lib",
163*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
164*333d2b36SAndroid Build Coastguard Worker		}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker		android_library {
167*333d2b36SAndroid Build Coastguard Worker			name: "uses_libs_dep",
168*333d2b36SAndroid Build Coastguard Worker			uses_libs: ["uses_lib"],
169*333d2b36SAndroid Build Coastguard Worker			optional_uses_libs: ["optional_uses_lib"],
170*333d2b36SAndroid Build Coastguard Worker		}
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Worker		android_library_import {
173*333d2b36SAndroid Build Coastguard Worker			name: "uses_libs_dep_import",
174*333d2b36SAndroid Build Coastguard Worker			aars: ["aar.aar"],
175*333d2b36SAndroid Build Coastguard Worker			static_libs: ["uses_libs_dep"],
176*333d2b36SAndroid Build Coastguard Worker		}
177*333d2b36SAndroid Build Coastguard Worker	`
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
180*333d2b36SAndroid Build Coastguard Worker		name      string
181*333d2b36SAndroid Build Coastguard Worker		unbundled bool
182*333d2b36SAndroid Build Coastguard Worker	}{
183*333d2b36SAndroid Build Coastguard Worker		{
184*333d2b36SAndroid Build Coastguard Worker			name:      "non-unbundled build",
185*333d2b36SAndroid Build Coastguard Worker			unbundled: false,
186*333d2b36SAndroid Build Coastguard Worker		},
187*333d2b36SAndroid Build Coastguard Worker		{
188*333d2b36SAndroid Build Coastguard Worker			name:      "unbundled build",
189*333d2b36SAndroid Build Coastguard Worker			unbundled: true,
190*333d2b36SAndroid Build Coastguard Worker		},
191*333d2b36SAndroid Build Coastguard Worker	}
192*333d2b36SAndroid Build Coastguard Worker
193*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testcases {
194*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
195*333d2b36SAndroid Build Coastguard Worker			fixturePreparer := PrepareForTestWithJavaDefaultModules
196*333d2b36SAndroid Build Coastguard Worker			if tc.unbundled {
197*333d2b36SAndroid Build Coastguard Worker				fixturePreparer = android.GroupFixturePreparers(
198*333d2b36SAndroid Build Coastguard Worker					fixturePreparer,
199*333d2b36SAndroid Build Coastguard Worker					android.FixtureModifyProductVariables(
200*333d2b36SAndroid Build Coastguard Worker						func(variables android.FixtureProductVariables) {
201*333d2b36SAndroid Build Coastguard Worker							variables.Unbundled_build = proptools.BoolPtr(true)
202*333d2b36SAndroid Build Coastguard Worker						},
203*333d2b36SAndroid Build Coastguard Worker					),
204*333d2b36SAndroid Build Coastguard Worker				)
205*333d2b36SAndroid Build Coastguard Worker			}
206*333d2b36SAndroid Build Coastguard Worker			result := fixturePreparer.RunTestWithBp(t, bp)
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Worker			getHeaderJar := func(name string) android.Path {
209*333d2b36SAndroid Build Coastguard Worker				mod := result.ModuleForTests(name, "android_common")
210*333d2b36SAndroid Build Coastguard Worker				return mod.Output("turbine-combined/" + name + ".jar").Output
211*333d2b36SAndroid Build Coastguard Worker			}
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker			appR8 := result.ModuleForTests("app", "android_common").Rule("r8")
214*333d2b36SAndroid Build Coastguard Worker			overrideAppR8 := result.ModuleForTests("app", "android_common_override_app").Rule("r8")
215*333d2b36SAndroid Build Coastguard Worker			appHeader := getHeaderJar("app")
216*333d2b36SAndroid Build Coastguard Worker			overrideAppHeader := result.ModuleForTests("app", "android_common_override_app").Output("turbine-combined/app.jar").Output
217*333d2b36SAndroid Build Coastguard Worker			libHeader := getHeaderJar("lib")
218*333d2b36SAndroid Build Coastguard Worker			transitiveLibHeader := getHeaderJar("transitive_lib")
219*333d2b36SAndroid Build Coastguard Worker			transitiveLib2Header := getHeaderJar("transitive_lib_2")
220*333d2b36SAndroid Build Coastguard Worker			staticLibHeader := getHeaderJar("static_lib")
221*333d2b36SAndroid Build Coastguard Worker			transitiveStaticLibHeader := getHeaderJar("transitive_static_lib")
222*333d2b36SAndroid Build Coastguard Worker			repeatedDepHeader := getHeaderJar("repeated_dep")
223*333d2b36SAndroid Build Coastguard Worker			usesLibHeader := getHeaderJar("uses_lib")
224*333d2b36SAndroid Build Coastguard Worker			optionalUsesLibHeader := getHeaderJar("optional_uses_lib")
225*333d2b36SAndroid Build Coastguard Worker			prebuiltLibHeader := result.ModuleForTests("prebuilt_lib", "android_common").Output("combined/lib.jar").Output
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Worker			for _, rule := range []android.TestingBuildParams{appR8, overrideAppR8} {
228*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesNotContain(t, "expected no app header jar in app r8 classpath",
229*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], appHeader.String())
230*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesNotContain(t, "expected no override_app header jar in app r8 classpath",
231*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], overrideAppHeader.String())
232*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesContain(t, "expected transitive lib header jar in app r8 classpath",
233*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], transitiveLibHeader.String())
234*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesContain(t, "expected transitive lib ^2 header jar in app r8 classpath",
235*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], transitiveLib2Header.String())
236*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesContain(t, "expected lib header jar in app r8 classpath",
237*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], libHeader.String())
238*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesContain(t, "expected uses_lib header jar in app r8 classpath",
239*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], usesLibHeader.String())
240*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesContain(t, "expected optional_uses_lib header jar in app r8 classpath",
241*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], optionalUsesLibHeader.String())
242*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesNotContain(t, "expected no static_lib header jar in app r8 classpath",
243*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], staticLibHeader.String())
244*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesNotContain(t, "expected no transitive static_lib header jar in app r8 classpath",
245*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], transitiveStaticLibHeader.String())
246*333d2b36SAndroid Build Coastguard Worker				// we shouldn't list this dep because it is already included as static_libs in the app
247*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesNotContain(t, "expected no repeated_dep header jar in app r8 classpath",
248*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], repeatedDepHeader.String())
249*333d2b36SAndroid Build Coastguard Worker				// skip a prebuilt transitive dep if the source is also a transitive dep
250*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesNotContain(t, "expected no prebuilt header jar in app r8 classpath",
251*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], prebuiltLibHeader.String())
252*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesContain(t, "expected -ignorewarnings in app r8 flags",
253*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], "-ignorewarnings")
254*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesContain(t, "expected --android-platform-build in app r8 flags",
255*333d2b36SAndroid Build Coastguard Worker					rule.Args["r8Flags"], "--android-platform-build")
256*333d2b36SAndroid Build Coastguard Worker			}
257*333d2b36SAndroid Build Coastguard Worker		})
258*333d2b36SAndroid Build Coastguard Worker	}
259*333d2b36SAndroid Build Coastguard Worker}
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Workerfunc TestR8Flags(t *testing.T) {
262*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, `
263*333d2b36SAndroid Build Coastguard Worker		android_app {
264*333d2b36SAndroid Build Coastguard Worker			name: "app",
265*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
266*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
267*333d2b36SAndroid Build Coastguard Worker			optimize: {
268*333d2b36SAndroid Build Coastguard Worker				shrink: false,
269*333d2b36SAndroid Build Coastguard Worker				optimize: false,
270*333d2b36SAndroid Build Coastguard Worker				obfuscate: false,
271*333d2b36SAndroid Build Coastguard Worker				ignore_warnings: false,
272*333d2b36SAndroid Build Coastguard Worker			},
273*333d2b36SAndroid Build Coastguard Worker		}
274*333d2b36SAndroid Build Coastguard Worker	`)
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Worker	app := result.ModuleForTests("app", "android_common")
277*333d2b36SAndroid Build Coastguard Worker	appR8 := app.Rule("r8")
278*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected -dontshrink in app r8 flags",
279*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "-dontshrink")
280*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected -dontoptimize in app r8 flags",
281*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "-dontoptimize")
282*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected -dontobfuscate in app r8 flags",
283*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "-dontobfuscate")
284*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "expected no -ignorewarnings in app r8 flags",
285*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "-ignorewarnings")
286*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected --android-platform-build in app r8 flags",
287*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "--android-platform-build")
288*333d2b36SAndroid Build Coastguard Worker}
289*333d2b36SAndroid Build Coastguard Worker
290*333d2b36SAndroid Build Coastguard Workerfunc TestD8(t *testing.T) {
291*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, `
292*333d2b36SAndroid Build Coastguard Worker		java_library {
293*333d2b36SAndroid Build Coastguard Worker			name: "foo",
294*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
295*333d2b36SAndroid Build Coastguard Worker			libs: ["lib"],
296*333d2b36SAndroid Build Coastguard Worker			static_libs: ["static_lib"],
297*333d2b36SAndroid Build Coastguard Worker			installable: true,
298*333d2b36SAndroid Build Coastguard Worker		}
299*333d2b36SAndroid Build Coastguard Worker
300*333d2b36SAndroid Build Coastguard Worker		java_library {
301*333d2b36SAndroid Build Coastguard Worker			name: "lib",
302*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
303*333d2b36SAndroid Build Coastguard Worker		}
304*333d2b36SAndroid Build Coastguard Worker
305*333d2b36SAndroid Build Coastguard Worker		java_library {
306*333d2b36SAndroid Build Coastguard Worker			name: "static_lib",
307*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
308*333d2b36SAndroid Build Coastguard Worker		}
309*333d2b36SAndroid Build Coastguard Worker	`)
310*333d2b36SAndroid Build Coastguard Worker
311*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
312*333d2b36SAndroid Build Coastguard Worker	lib := result.ModuleForTests("lib", "android_common")
313*333d2b36SAndroid Build Coastguard Worker	staticLib := result.ModuleForTests("static_lib", "android_common")
314*333d2b36SAndroid Build Coastguard Worker
315*333d2b36SAndroid Build Coastguard Worker	fooJavac := foo.Rule("javac")
316*333d2b36SAndroid Build Coastguard Worker	fooD8 := foo.Rule("d8")
317*333d2b36SAndroid Build Coastguard Worker	libHeader := lib.Output("turbine-combined/lib.jar").Output
318*333d2b36SAndroid Build Coastguard Worker	staticLibHeader := staticLib.Output("turbine-combined/static_lib.jar").Output
319*333d2b36SAndroid Build Coastguard Worker
320*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected lib header jar in foo javac classpath",
321*333d2b36SAndroid Build Coastguard Worker		fooJavac.Args["classpath"], libHeader.String())
322*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected static_lib header jar in foo javac classpath",
323*333d2b36SAndroid Build Coastguard Worker		fooJavac.Args["classpath"], staticLibHeader.String())
324*333d2b36SAndroid Build Coastguard Worker
325*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected lib header jar in foo d8 classpath",
326*333d2b36SAndroid Build Coastguard Worker		fooD8.Args["d8Flags"], libHeader.String())
327*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "expected no  static_lib header jar in foo javac classpath",
328*333d2b36SAndroid Build Coastguard Worker		fooD8.Args["d8Flags"], staticLibHeader.String())
329*333d2b36SAndroid Build Coastguard Worker}
330*333d2b36SAndroid Build Coastguard Worker
331*333d2b36SAndroid Build Coastguard Workerfunc TestProguardFlagsInheritanceStatic(t *testing.T) {
332*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, `
333*333d2b36SAndroid Build Coastguard Worker		android_app {
334*333d2b36SAndroid Build Coastguard Worker			name: "app",
335*333d2b36SAndroid Build Coastguard Worker			static_libs: [
336*333d2b36SAndroid Build Coastguard Worker				"primary_android_lib",
337*333d2b36SAndroid Build Coastguard Worker				"primary_lib",
338*333d2b36SAndroid Build Coastguard Worker			],
339*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
340*333d2b36SAndroid Build Coastguard Worker		}
341*333d2b36SAndroid Build Coastguard Worker
342*333d2b36SAndroid Build Coastguard Worker		java_library {
343*333d2b36SAndroid Build Coastguard Worker			name: "primary_lib",
344*333d2b36SAndroid Build Coastguard Worker			optimize: {
345*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["primary.flags"],
346*333d2b36SAndroid Build Coastguard Worker			},
347*333d2b36SAndroid Build Coastguard Worker		}
348*333d2b36SAndroid Build Coastguard Worker
349*333d2b36SAndroid Build Coastguard Worker		android_library {
350*333d2b36SAndroid Build Coastguard Worker			name: "primary_android_lib",
351*333d2b36SAndroid Build Coastguard Worker			static_libs: ["secondary_lib"],
352*333d2b36SAndroid Build Coastguard Worker			optimize: {
353*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["primary_android.flags"],
354*333d2b36SAndroid Build Coastguard Worker			},
355*333d2b36SAndroid Build Coastguard Worker		}
356*333d2b36SAndroid Build Coastguard Worker
357*333d2b36SAndroid Build Coastguard Worker		java_library {
358*333d2b36SAndroid Build Coastguard Worker			name: "secondary_lib",
359*333d2b36SAndroid Build Coastguard Worker			static_libs: ["tertiary_lib"],
360*333d2b36SAndroid Build Coastguard Worker			optimize: {
361*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["secondary.flags"],
362*333d2b36SAndroid Build Coastguard Worker			},
363*333d2b36SAndroid Build Coastguard Worker		}
364*333d2b36SAndroid Build Coastguard Worker
365*333d2b36SAndroid Build Coastguard Worker		java_library {
366*333d2b36SAndroid Build Coastguard Worker			name: "tertiary_lib",
367*333d2b36SAndroid Build Coastguard Worker			optimize: {
368*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["tertiary.flags"],
369*333d2b36SAndroid Build Coastguard Worker			},
370*333d2b36SAndroid Build Coastguard Worker		}
371*333d2b36SAndroid Build Coastguard Worker	`)
372*333d2b36SAndroid Build Coastguard Worker
373*333d2b36SAndroid Build Coastguard Worker	app := result.ModuleForTests("app", "android_common")
374*333d2b36SAndroid Build Coastguard Worker	appR8 := app.Rule("r8")
375*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected primary_lib's proguard flags from direct dep",
376*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "primary.flags")
377*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected primary_android_lib's proguard flags from direct dep",
378*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "primary_android.flags")
379*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected secondary_lib's proguard flags from inherited dep",
380*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "secondary.flags")
381*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected tertiary_lib's proguard flags from inherited dep",
382*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "tertiary.flags")
383*333d2b36SAndroid Build Coastguard Worker}
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Workerfunc TestProguardFlagsInheritance(t *testing.T) {
386*333d2b36SAndroid Build Coastguard Worker	directDepFlagsFileName := "direct_dep.flags"
387*333d2b36SAndroid Build Coastguard Worker	transitiveDepFlagsFileName := "transitive_dep.flags"
388*333d2b36SAndroid Build Coastguard Worker
389*333d2b36SAndroid Build Coastguard Worker	topLevelModules := []struct {
390*333d2b36SAndroid Build Coastguard Worker		name       string
391*333d2b36SAndroid Build Coastguard Worker		definition string
392*333d2b36SAndroid Build Coastguard Worker	}{
393*333d2b36SAndroid Build Coastguard Worker		{
394*333d2b36SAndroid Build Coastguard Worker			name: "android_app",
395*333d2b36SAndroid Build Coastguard Worker			definition: `
396*333d2b36SAndroid Build Coastguard Worker				android_app {
397*333d2b36SAndroid Build Coastguard Worker					name: "app",
398*333d2b36SAndroid Build Coastguard Worker					static_libs: ["androidlib"], // this must be static_libs to initate dexing
399*333d2b36SAndroid Build Coastguard Worker					platform_apis: true,
400*333d2b36SAndroid Build Coastguard Worker				}
401*333d2b36SAndroid Build Coastguard Worker			`,
402*333d2b36SAndroid Build Coastguard Worker		},
403*333d2b36SAndroid Build Coastguard Worker		{
404*333d2b36SAndroid Build Coastguard Worker			name: "android_library",
405*333d2b36SAndroid Build Coastguard Worker			definition: `
406*333d2b36SAndroid Build Coastguard Worker				android_library {
407*333d2b36SAndroid Build Coastguard Worker					name: "app",
408*333d2b36SAndroid Build Coastguard Worker					static_libs: ["androidlib"], // this must be static_libs to initate dexing
409*333d2b36SAndroid Build Coastguard Worker					installable: true,
410*333d2b36SAndroid Build Coastguard Worker					optimize: {
411*333d2b36SAndroid Build Coastguard Worker						enabled: true,
412*333d2b36SAndroid Build Coastguard Worker						shrink: true,
413*333d2b36SAndroid Build Coastguard Worker					},
414*333d2b36SAndroid Build Coastguard Worker				}
415*333d2b36SAndroid Build Coastguard Worker			`,
416*333d2b36SAndroid Build Coastguard Worker		},
417*333d2b36SAndroid Build Coastguard Worker		{
418*333d2b36SAndroid Build Coastguard Worker			name: "java_library",
419*333d2b36SAndroid Build Coastguard Worker			definition: `
420*333d2b36SAndroid Build Coastguard Worker				java_library {
421*333d2b36SAndroid Build Coastguard Worker					name: "app",
422*333d2b36SAndroid Build Coastguard Worker					static_libs: ["androidlib"], // this must be static_libs to initate dexing
423*333d2b36SAndroid Build Coastguard Worker					srcs: ["Foo.java"],
424*333d2b36SAndroid Build Coastguard Worker					installable: true,
425*333d2b36SAndroid Build Coastguard Worker					optimize: {
426*333d2b36SAndroid Build Coastguard Worker						enabled: true,
427*333d2b36SAndroid Build Coastguard Worker						shrink: true,
428*333d2b36SAndroid Build Coastguard Worker					},
429*333d2b36SAndroid Build Coastguard Worker				}
430*333d2b36SAndroid Build Coastguard Worker			`,
431*333d2b36SAndroid Build Coastguard Worker		},
432*333d2b36SAndroid Build Coastguard Worker	}
433*333d2b36SAndroid Build Coastguard Worker
434*333d2b36SAndroid Build Coastguard Worker	bp := `
435*333d2b36SAndroid Build Coastguard Worker		android_library {
436*333d2b36SAndroid Build Coastguard Worker			name: "androidlib",
437*333d2b36SAndroid Build Coastguard Worker			static_libs: ["app_dep"],
438*333d2b36SAndroid Build Coastguard Worker		}
439*333d2b36SAndroid Build Coastguard Worker
440*333d2b36SAndroid Build Coastguard Worker		java_library {
441*333d2b36SAndroid Build Coastguard Worker			name: "app_dep",
442*333d2b36SAndroid Build Coastguard Worker			%s: ["dep"],
443*333d2b36SAndroid Build Coastguard Worker		}
444*333d2b36SAndroid Build Coastguard Worker
445*333d2b36SAndroid Build Coastguard Worker		java_library {
446*333d2b36SAndroid Build Coastguard Worker			name: "dep",
447*333d2b36SAndroid Build Coastguard Worker			%s: ["transitive_dep"],
448*333d2b36SAndroid Build Coastguard Worker			optimize: {
449*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["direct_dep.flags"],
450*333d2b36SAndroid Build Coastguard Worker				export_proguard_flags_files: %v,
451*333d2b36SAndroid Build Coastguard Worker			},
452*333d2b36SAndroid Build Coastguard Worker		}
453*333d2b36SAndroid Build Coastguard Worker
454*333d2b36SAndroid Build Coastguard Worker		java_library {
455*333d2b36SAndroid Build Coastguard Worker			name: "transitive_dep",
456*333d2b36SAndroid Build Coastguard Worker			optimize: {
457*333d2b36SAndroid Build Coastguard Worker				proguard_flags_files: ["transitive_dep.flags"],
458*333d2b36SAndroid Build Coastguard Worker				export_proguard_flags_files: %v,
459*333d2b36SAndroid Build Coastguard Worker			},
460*333d2b36SAndroid Build Coastguard Worker		}
461*333d2b36SAndroid Build Coastguard Worker	`
462*333d2b36SAndroid Build Coastguard Worker
463*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
464*333d2b36SAndroid Build Coastguard Worker		name                           string
465*333d2b36SAndroid Build Coastguard Worker		depType                        string
466*333d2b36SAndroid Build Coastguard Worker		depExportsFlagsFiles           bool
467*333d2b36SAndroid Build Coastguard Worker		transitiveDepType              string
468*333d2b36SAndroid Build Coastguard Worker		transitiveDepExportsFlagsFiles bool
469*333d2b36SAndroid Build Coastguard Worker		expectedFlagsFiles             []string
470*333d2b36SAndroid Build Coastguard Worker	}{
471*333d2b36SAndroid Build Coastguard Worker		{
472*333d2b36SAndroid Build Coastguard Worker			name:                           "libs_export_libs_export",
473*333d2b36SAndroid Build Coastguard Worker			depType:                        "libs",
474*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           true,
475*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "libs",
476*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: true,
477*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
478*333d2b36SAndroid Build Coastguard Worker		},
479*333d2b36SAndroid Build Coastguard Worker		{
480*333d2b36SAndroid Build Coastguard Worker			name:                           "static_export_libs_export",
481*333d2b36SAndroid Build Coastguard Worker			depType:                        "static_libs",
482*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           true,
483*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "libs",
484*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: true,
485*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
486*333d2b36SAndroid Build Coastguard Worker		},
487*333d2b36SAndroid Build Coastguard Worker		{
488*333d2b36SAndroid Build Coastguard Worker			name:                           "libs_no-export_static_export",
489*333d2b36SAndroid Build Coastguard Worker			depType:                        "libs",
490*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           false,
491*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "static_libs",
492*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: true,
493*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{transitiveDepFlagsFileName},
494*333d2b36SAndroid Build Coastguard Worker		},
495*333d2b36SAndroid Build Coastguard Worker		{
496*333d2b36SAndroid Build Coastguard Worker			name:                           "static_no-export_static_export",
497*333d2b36SAndroid Build Coastguard Worker			depType:                        "static_libs",
498*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           false,
499*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "static_libs",
500*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: true,
501*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
502*333d2b36SAndroid Build Coastguard Worker		},
503*333d2b36SAndroid Build Coastguard Worker		{
504*333d2b36SAndroid Build Coastguard Worker			name:                           "libs_export_libs_no-export",
505*333d2b36SAndroid Build Coastguard Worker			depType:                        "libs",
506*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           true,
507*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "libs",
508*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: false,
509*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName},
510*333d2b36SAndroid Build Coastguard Worker		},
511*333d2b36SAndroid Build Coastguard Worker		{
512*333d2b36SAndroid Build Coastguard Worker			name:                           "static_export_libs_no-export",
513*333d2b36SAndroid Build Coastguard Worker			depType:                        "static_libs",
514*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           true,
515*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "libs",
516*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: false,
517*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName},
518*333d2b36SAndroid Build Coastguard Worker		},
519*333d2b36SAndroid Build Coastguard Worker		{
520*333d2b36SAndroid Build Coastguard Worker			name:                           "libs_no-export_static_no-export",
521*333d2b36SAndroid Build Coastguard Worker			depType:                        "libs",
522*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           false,
523*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "static_libs",
524*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: false,
525*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{},
526*333d2b36SAndroid Build Coastguard Worker		},
527*333d2b36SAndroid Build Coastguard Worker		{
528*333d2b36SAndroid Build Coastguard Worker			name:                           "static_no-export_static_no-export",
529*333d2b36SAndroid Build Coastguard Worker			depType:                        "static_libs",
530*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           false,
531*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "static_libs",
532*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: false,
533*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
534*333d2b36SAndroid Build Coastguard Worker		},
535*333d2b36SAndroid Build Coastguard Worker		{
536*333d2b36SAndroid Build Coastguard Worker			name:                           "libs_no-export_libs_export",
537*333d2b36SAndroid Build Coastguard Worker			depType:                        "libs",
538*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           false,
539*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "libs",
540*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: true,
541*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{transitiveDepFlagsFileName},
542*333d2b36SAndroid Build Coastguard Worker		},
543*333d2b36SAndroid Build Coastguard Worker		{
544*333d2b36SAndroid Build Coastguard Worker			name:                           "static_no-export_libs_export",
545*333d2b36SAndroid Build Coastguard Worker			depType:                        "static_libs",
546*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           false,
547*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "libs",
548*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: true,
549*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
550*333d2b36SAndroid Build Coastguard Worker		},
551*333d2b36SAndroid Build Coastguard Worker		{
552*333d2b36SAndroid Build Coastguard Worker			name:                           "libs_export_static_export",
553*333d2b36SAndroid Build Coastguard Worker			depType:                        "libs",
554*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           true,
555*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "static_libs",
556*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: true,
557*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
558*333d2b36SAndroid Build Coastguard Worker		},
559*333d2b36SAndroid Build Coastguard Worker		{
560*333d2b36SAndroid Build Coastguard Worker			name:                           "static_export_static_export",
561*333d2b36SAndroid Build Coastguard Worker			depType:                        "static_libs",
562*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           true,
563*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "static_libs",
564*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: true,
565*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
566*333d2b36SAndroid Build Coastguard Worker		},
567*333d2b36SAndroid Build Coastguard Worker		{
568*333d2b36SAndroid Build Coastguard Worker			name:                           "libs_no-export_libs_no-export",
569*333d2b36SAndroid Build Coastguard Worker			depType:                        "libs",
570*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           false,
571*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "libs",
572*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: false,
573*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{},
574*333d2b36SAndroid Build Coastguard Worker		},
575*333d2b36SAndroid Build Coastguard Worker		{
576*333d2b36SAndroid Build Coastguard Worker			name:                           "static_no-export_libs_no-export",
577*333d2b36SAndroid Build Coastguard Worker			depType:                        "static_libs",
578*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           false,
579*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "libs",
580*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: false,
581*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName},
582*333d2b36SAndroid Build Coastguard Worker		},
583*333d2b36SAndroid Build Coastguard Worker		{
584*333d2b36SAndroid Build Coastguard Worker			name:                           "libs_export_static_no-export",
585*333d2b36SAndroid Build Coastguard Worker			depType:                        "libs",
586*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           true,
587*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "static_libs",
588*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: false,
589*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
590*333d2b36SAndroid Build Coastguard Worker		},
591*333d2b36SAndroid Build Coastguard Worker		{
592*333d2b36SAndroid Build Coastguard Worker			name:                           "static_export_static_no-export",
593*333d2b36SAndroid Build Coastguard Worker			depType:                        "static_libs",
594*333d2b36SAndroid Build Coastguard Worker			depExportsFlagsFiles:           true,
595*333d2b36SAndroid Build Coastguard Worker			transitiveDepType:              "static_libs",
596*333d2b36SAndroid Build Coastguard Worker			transitiveDepExportsFlagsFiles: false,
597*333d2b36SAndroid Build Coastguard Worker			expectedFlagsFiles:             []string{directDepFlagsFileName, transitiveDepFlagsFileName},
598*333d2b36SAndroid Build Coastguard Worker		},
599*333d2b36SAndroid Build Coastguard Worker	}
600*333d2b36SAndroid Build Coastguard Worker
601*333d2b36SAndroid Build Coastguard Worker	for _, topLevelModuleDef := range topLevelModules {
602*333d2b36SAndroid Build Coastguard Worker		for _, tc := range testcases {
603*333d2b36SAndroid Build Coastguard Worker			t.Run(topLevelModuleDef.name+"-"+tc.name, func(t *testing.T) {
604*333d2b36SAndroid Build Coastguard Worker				result := android.GroupFixturePreparers(
605*333d2b36SAndroid Build Coastguard Worker					PrepareForTestWithJavaDefaultModules,
606*333d2b36SAndroid Build Coastguard Worker					android.FixtureMergeMockFs(android.MockFS{
607*333d2b36SAndroid Build Coastguard Worker						directDepFlagsFileName:     nil,
608*333d2b36SAndroid Build Coastguard Worker						transitiveDepFlagsFileName: nil,
609*333d2b36SAndroid Build Coastguard Worker					}),
610*333d2b36SAndroid Build Coastguard Worker				).RunTestWithBp(t,
611*333d2b36SAndroid Build Coastguard Worker					topLevelModuleDef.definition+
612*333d2b36SAndroid Build Coastguard Worker						fmt.Sprintf(
613*333d2b36SAndroid Build Coastguard Worker							bp,
614*333d2b36SAndroid Build Coastguard Worker							tc.depType,
615*333d2b36SAndroid Build Coastguard Worker							tc.transitiveDepType,
616*333d2b36SAndroid Build Coastguard Worker							tc.depExportsFlagsFiles,
617*333d2b36SAndroid Build Coastguard Worker							tc.transitiveDepExportsFlagsFiles,
618*333d2b36SAndroid Build Coastguard Worker						),
619*333d2b36SAndroid Build Coastguard Worker				)
620*333d2b36SAndroid Build Coastguard Worker				appR8 := result.ModuleForTests("app", "android_common").Rule("r8")
621*333d2b36SAndroid Build Coastguard Worker
622*333d2b36SAndroid Build Coastguard Worker				shouldHaveDepFlags := android.InList(directDepFlagsFileName, tc.expectedFlagsFiles)
623*333d2b36SAndroid Build Coastguard Worker				if shouldHaveDepFlags {
624*333d2b36SAndroid Build Coastguard Worker					android.AssertStringDoesContain(t, "expected deps's proguard flags",
625*333d2b36SAndroid Build Coastguard Worker						appR8.Args["r8Flags"], directDepFlagsFileName)
626*333d2b36SAndroid Build Coastguard Worker				} else {
627*333d2b36SAndroid Build Coastguard Worker					android.AssertStringDoesNotContain(t, "app did not expect deps's proguard flags",
628*333d2b36SAndroid Build Coastguard Worker						appR8.Args["r8Flags"], directDepFlagsFileName)
629*333d2b36SAndroid Build Coastguard Worker				}
630*333d2b36SAndroid Build Coastguard Worker
631*333d2b36SAndroid Build Coastguard Worker				shouldHaveTransitiveDepFlags := android.InList(transitiveDepFlagsFileName, tc.expectedFlagsFiles)
632*333d2b36SAndroid Build Coastguard Worker				if shouldHaveTransitiveDepFlags {
633*333d2b36SAndroid Build Coastguard Worker					android.AssertStringDoesContain(t, "expected transitive deps's proguard flags",
634*333d2b36SAndroid Build Coastguard Worker						appR8.Args["r8Flags"], transitiveDepFlagsFileName)
635*333d2b36SAndroid Build Coastguard Worker				} else {
636*333d2b36SAndroid Build Coastguard Worker					android.AssertStringDoesNotContain(t, "app did not expect transitive deps's proguard flags",
637*333d2b36SAndroid Build Coastguard Worker						appR8.Args["r8Flags"], transitiveDepFlagsFileName)
638*333d2b36SAndroid Build Coastguard Worker				}
639*333d2b36SAndroid Build Coastguard Worker			})
640*333d2b36SAndroid Build Coastguard Worker		}
641*333d2b36SAndroid Build Coastguard Worker	}
642*333d2b36SAndroid Build Coastguard Worker}
643*333d2b36SAndroid Build Coastguard Worker
644*333d2b36SAndroid Build Coastguard Workerfunc TestProguardFlagsInheritanceAppImport(t *testing.T) {
645*333d2b36SAndroid Build Coastguard Worker	bp := `
646*333d2b36SAndroid Build Coastguard Worker		android_app {
647*333d2b36SAndroid Build Coastguard Worker			name: "app",
648*333d2b36SAndroid Build Coastguard Worker			static_libs: ["aarimport"], // this must be static_libs to initate dexing
649*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
650*333d2b36SAndroid Build Coastguard Worker		}
651*333d2b36SAndroid Build Coastguard Worker
652*333d2b36SAndroid Build Coastguard Worker		android_library_import {
653*333d2b36SAndroid Build Coastguard Worker			name: "aarimport",
654*333d2b36SAndroid Build Coastguard Worker			aars: ["import.aar"],
655*333d2b36SAndroid Build Coastguard Worker		}
656*333d2b36SAndroid Build Coastguard Worker	`
657*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
658*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
659*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
660*333d2b36SAndroid Build Coastguard Worker
661*333d2b36SAndroid Build Coastguard Worker	appR8 := result.ModuleForTests("app", "android_common").Rule("r8")
662*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected aarimports's proguard flags",
663*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "proguard.txt")
664*333d2b36SAndroid Build Coastguard Worker}
665*333d2b36SAndroid Build Coastguard Worker
666*333d2b36SAndroid Build Coastguard Workerfunc TestR8FlagsArtProfile(t *testing.T) {
667*333d2b36SAndroid Build Coastguard Worker	result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, `
668*333d2b36SAndroid Build Coastguard Worker		android_app {
669*333d2b36SAndroid Build Coastguard Worker			name: "app",
670*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
671*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
672*333d2b36SAndroid Build Coastguard Worker			dex_preopt: {
673*333d2b36SAndroid Build Coastguard Worker				profile_guided: true,
674*333d2b36SAndroid Build Coastguard Worker				profile: "profile.txt.prof",
675*333d2b36SAndroid Build Coastguard Worker				enable_profile_rewriting: true,
676*333d2b36SAndroid Build Coastguard Worker			},
677*333d2b36SAndroid Build Coastguard Worker		}
678*333d2b36SAndroid Build Coastguard Worker	`)
679*333d2b36SAndroid Build Coastguard Worker
680*333d2b36SAndroid Build Coastguard Worker	app := result.ModuleForTests("app", "android_common")
681*333d2b36SAndroid Build Coastguard Worker	appR8 := app.Rule("r8")
682*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "expected --art-profile in app r8 flags",
683*333d2b36SAndroid Build Coastguard Worker		appR8.Args["r8Flags"], "--art-profile")
684*333d2b36SAndroid Build Coastguard Worker
685*333d2b36SAndroid Build Coastguard Worker	appDexpreopt := app.Rule("dexpreopt")
686*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
687*333d2b36SAndroid Build Coastguard Worker		"expected --art-profile output to be used to create .prof binary",
688*333d2b36SAndroid Build Coastguard Worker		appDexpreopt.RuleParams.Command,
689*333d2b36SAndroid Build Coastguard Worker		"--create-profile-from=out/soong/.intermediates/app/android_common/profile.prof.txt --output-profile-type=app",
690*333d2b36SAndroid Build Coastguard Worker	)
691*333d2b36SAndroid Build Coastguard Worker}
692*333d2b36SAndroid Build Coastguard Worker
693*333d2b36SAndroid Build Coastguard Worker// This test checks that users explicitly set `enable_profile_rewriting` to true when the following are true
694*333d2b36SAndroid Build Coastguard Worker// 1. optimize or obfuscate is enabled AND
695*333d2b36SAndroid Build Coastguard Worker// 2. dex_preopt.profile_guided is enabled
696*333d2b36SAndroid Build Coastguard Worker//
697*333d2b36SAndroid Build Coastguard Worker// The rewritten profile should be used since the dex signatures in the checked-in profile will not match the optimized binary.
698*333d2b36SAndroid Build Coastguard Workerfunc TestEnableProfileRewritingIsRequiredForOptimizedApps(t *testing.T) {
699*333d2b36SAndroid Build Coastguard Worker	testJavaError(t,
700*333d2b36SAndroid Build Coastguard Worker		"Enable_profile_rewriting must be true when profile_guided dexpreopt and R8 optimization/obfuscation is turned on",
701*333d2b36SAndroid Build Coastguard Worker		`
702*333d2b36SAndroid Build Coastguard Workerandroid_app {
703*333d2b36SAndroid Build Coastguard Worker	name: "app",
704*333d2b36SAndroid Build Coastguard Worker	srcs: ["foo.java"],
705*333d2b36SAndroid Build Coastguard Worker	platform_apis: true,
706*333d2b36SAndroid Build Coastguard Worker	dex_preopt: {
707*333d2b36SAndroid Build Coastguard Worker		profile_guided: true,
708*333d2b36SAndroid Build Coastguard Worker		profile: "profile.txt.prof",
709*333d2b36SAndroid Build Coastguard Worker		// enable_profile_rewriting is not set, this is an error
710*333d2b36SAndroid Build Coastguard Worker	},
711*333d2b36SAndroid Build Coastguard Worker	optimize: {
712*333d2b36SAndroid Build Coastguard Worker		optimize: true,
713*333d2b36SAndroid Build Coastguard Worker	}
714*333d2b36SAndroid Build Coastguard Worker}`)
715*333d2b36SAndroid Build Coastguard Worker}
716*333d2b36SAndroid Build Coastguard Worker
717*333d2b36SAndroid Build Coastguard Workerfunc TestDebugReleaseFlags(t *testing.T) {
718*333d2b36SAndroid Build Coastguard Worker	bp := `
719*333d2b36SAndroid Build Coastguard Worker		android_app {
720*333d2b36SAndroid Build Coastguard Worker			name: "app",
721*333d2b36SAndroid Build Coastguard Worker			srcs: ["foo.java"],
722*333d2b36SAndroid Build Coastguard Worker			platform_apis: true,
723*333d2b36SAndroid Build Coastguard Worker			dxflags: ["%s"]
724*333d2b36SAndroid Build Coastguard Worker		}
725*333d2b36SAndroid Build Coastguard Worker	`
726*333d2b36SAndroid Build Coastguard Worker
727*333d2b36SAndroid Build Coastguard Worker	testcases := []struct {
728*333d2b36SAndroid Build Coastguard Worker		name          string
729*333d2b36SAndroid Build Coastguard Worker		envVar        string
730*333d2b36SAndroid Build Coastguard Worker		isEng         bool
731*333d2b36SAndroid Build Coastguard Worker		dxFlags       string
732*333d2b36SAndroid Build Coastguard Worker		expectedFlags string
733*333d2b36SAndroid Build Coastguard Worker	}{
734*333d2b36SAndroid Build Coastguard Worker		{
735*333d2b36SAndroid Build Coastguard Worker			name:          "app_no_optimize_dx",
736*333d2b36SAndroid Build Coastguard Worker			envVar:        "NO_OPTIMIZE_DX",
737*333d2b36SAndroid Build Coastguard Worker			expectedFlags: "--debug",
738*333d2b36SAndroid Build Coastguard Worker		},
739*333d2b36SAndroid Build Coastguard Worker		{
740*333d2b36SAndroid Build Coastguard Worker			name:    "app_release_no_optimize_dx",
741*333d2b36SAndroid Build Coastguard Worker			envVar:  "NO_OPTIMIZE_DX",
742*333d2b36SAndroid Build Coastguard Worker			dxFlags: "--release",
743*333d2b36SAndroid Build Coastguard Worker			// Global env vars override explicit dxflags.
744*333d2b36SAndroid Build Coastguard Worker			expectedFlags: "--debug",
745*333d2b36SAndroid Build Coastguard Worker		},
746*333d2b36SAndroid Build Coastguard Worker		{
747*333d2b36SAndroid Build Coastguard Worker			name:          "app_generate_dex_debug",
748*333d2b36SAndroid Build Coastguard Worker			envVar:        "GENERATE_DEX_DEBUG",
749*333d2b36SAndroid Build Coastguard Worker			expectedFlags: "--debug",
750*333d2b36SAndroid Build Coastguard Worker		},
751*333d2b36SAndroid Build Coastguard Worker		{
752*333d2b36SAndroid Build Coastguard Worker			name:    "app_release_generate_dex_debug",
753*333d2b36SAndroid Build Coastguard Worker			envVar:  "GENERATE_DEX_DEBUG",
754*333d2b36SAndroid Build Coastguard Worker			dxFlags: "--release",
755*333d2b36SAndroid Build Coastguard Worker			// Global env vars override explicit dxflags.
756*333d2b36SAndroid Build Coastguard Worker			expectedFlags: "--debug",
757*333d2b36SAndroid Build Coastguard Worker		},
758*333d2b36SAndroid Build Coastguard Worker		{
759*333d2b36SAndroid Build Coastguard Worker			name:          "app_eng",
760*333d2b36SAndroid Build Coastguard Worker			isEng:         true,
761*333d2b36SAndroid Build Coastguard Worker			expectedFlags: "--debug",
762*333d2b36SAndroid Build Coastguard Worker		},
763*333d2b36SAndroid Build Coastguard Worker		{
764*333d2b36SAndroid Build Coastguard Worker			name:    "app_release_eng",
765*333d2b36SAndroid Build Coastguard Worker			isEng:   true,
766*333d2b36SAndroid Build Coastguard Worker			dxFlags: "--release",
767*333d2b36SAndroid Build Coastguard Worker			// Eng mode does *not* override explicit dxflags.
768*333d2b36SAndroid Build Coastguard Worker			expectedFlags: "--release",
769*333d2b36SAndroid Build Coastguard Worker		},
770*333d2b36SAndroid Build Coastguard Worker	}
771*333d2b36SAndroid Build Coastguard Worker
772*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testcases {
773*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
774*333d2b36SAndroid Build Coastguard Worker			fixturePreparer := PrepareForTestWithJavaDefaultModules
775*333d2b36SAndroid Build Coastguard Worker			fixturePreparer = android.GroupFixturePreparers(
776*333d2b36SAndroid Build Coastguard Worker				fixturePreparer,
777*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(
778*333d2b36SAndroid Build Coastguard Worker					func(variables android.FixtureProductVariables) {
779*333d2b36SAndroid Build Coastguard Worker						variables.Eng = proptools.BoolPtr(tc.isEng)
780*333d2b36SAndroid Build Coastguard Worker					},
781*333d2b36SAndroid Build Coastguard Worker				),
782*333d2b36SAndroid Build Coastguard Worker			)
783*333d2b36SAndroid Build Coastguard Worker			if tc.envVar != "" {
784*333d2b36SAndroid Build Coastguard Worker				fixturePreparer = android.GroupFixturePreparers(
785*333d2b36SAndroid Build Coastguard Worker					fixturePreparer,
786*333d2b36SAndroid Build Coastguard Worker					android.FixtureMergeEnv(map[string]string{
787*333d2b36SAndroid Build Coastguard Worker						tc.envVar: "true",
788*333d2b36SAndroid Build Coastguard Worker					}),
789*333d2b36SAndroid Build Coastguard Worker				)
790*333d2b36SAndroid Build Coastguard Worker			}
791*333d2b36SAndroid Build Coastguard Worker			result := fixturePreparer.RunTestWithBp(t, fmt.Sprintf(bp, tc.dxFlags))
792*333d2b36SAndroid Build Coastguard Worker
793*333d2b36SAndroid Build Coastguard Worker			appR8 := result.ModuleForTests("app", "android_common").Rule("r8")
794*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "expected flag in R8 flags",
795*333d2b36SAndroid Build Coastguard Worker				appR8.Args["r8Flags"], tc.expectedFlags)
796*333d2b36SAndroid Build Coastguard Worker
797*333d2b36SAndroid Build Coastguard Worker			var unexpectedFlags string
798*333d2b36SAndroid Build Coastguard Worker			if tc.expectedFlags == "--debug" {
799*333d2b36SAndroid Build Coastguard Worker				unexpectedFlags = "--release"
800*333d2b36SAndroid Build Coastguard Worker			} else if tc.expectedFlags == "--release" {
801*333d2b36SAndroid Build Coastguard Worker				unexpectedFlags = "--debug"
802*333d2b36SAndroid Build Coastguard Worker			}
803*333d2b36SAndroid Build Coastguard Worker			if unexpectedFlags != "" {
804*333d2b36SAndroid Build Coastguard Worker				android.AssertStringDoesNotContain(t, "unexpected flag in R8 flags",
805*333d2b36SAndroid Build Coastguard Worker					appR8.Args["r8Flags"], unexpectedFlags)
806*333d2b36SAndroid Build Coastguard Worker			}
807*333d2b36SAndroid Build Coastguard Worker		})
808*333d2b36SAndroid Build Coastguard Worker	}
809*333d2b36SAndroid Build Coastguard Worker}
810