xref: /aosp_15_r20/build/soong/java/kotlin_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	"slices"
19*333d2b36SAndroid Build Coastguard Worker	"strconv"
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker	"testing"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerfunc TestKotlin(t *testing.T) {
27*333d2b36SAndroid Build Coastguard Worker	bp := `
28*333d2b36SAndroid Build Coastguard Worker		java_library {
29*333d2b36SAndroid Build Coastguard Worker			name: "foo",
30*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.kt"],
31*333d2b36SAndroid Build Coastguard Worker			static_libs: ["quz"],
32*333d2b36SAndroid Build Coastguard Worker		}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Worker		java_library {
35*333d2b36SAndroid Build Coastguard Worker			name: "bar",
36*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.kt"],
37*333d2b36SAndroid Build Coastguard Worker			libs: ["foo"],
38*333d2b36SAndroid Build Coastguard Worker			static_libs: ["baz"],
39*333d2b36SAndroid Build Coastguard Worker		}
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Worker		java_library {
42*333d2b36SAndroid Build Coastguard Worker			name: "baz",
43*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
44*333d2b36SAndroid Build Coastguard Worker			static_libs: ["quz"],
45*333d2b36SAndroid Build Coastguard Worker		}
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker		java_library {
48*333d2b36SAndroid Build Coastguard Worker			name: "quz",
49*333d2b36SAndroid Build Coastguard Worker			srcs: ["d.kt"],
50*333d2b36SAndroid Build Coastguard Worker		}`
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker	kotlinStdlibTurbineCombinedJars := []string{
53*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib/android_common/turbine-combined/kotlin-stdlib.jar",
54*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib-jdk7/android_common/turbine-combined/kotlin-stdlib-jdk7.jar",
55*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib-jdk8/android_common/turbine-combined/kotlin-stdlib-jdk8.jar",
56*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-annotations/android_common/turbine-combined/kotlin-annotations.jar",
57*333d2b36SAndroid Build Coastguard Worker	}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker	kotlinStdlibTurbineJars := []string{
60*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib/android_common/turbine/kotlin-stdlib.jar",
61*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib-jdk7/android_common/turbine/kotlin-stdlib-jdk7.jar",
62*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib-jdk8/android_common/turbine/kotlin-stdlib-jdk8.jar",
63*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-annotations/android_common/turbine/kotlin-annotations.jar",
64*333d2b36SAndroid Build Coastguard Worker	}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker	kotlinStdlibJavacJars := []string{
67*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib/android_common/javac/kotlin-stdlib.jar",
68*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib-jdk7/android_common/javac/kotlin-stdlib-jdk7.jar",
69*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-stdlib-jdk8/android_common/javac/kotlin-stdlib-jdk8.jar",
70*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/kotlin-annotations/android_common/javac/kotlin-annotations.jar",
71*333d2b36SAndroid Build Coastguard Worker	}
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker	bootclasspathTurbineCombinedJars := []string{
74*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/stable.core.platform.api.stubs/android_common/turbine-combined/stable.core.platform.api.stubs.jar",
75*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/core-lambda-stubs/android_common/turbine-combined/core-lambda-stubs.jar",
76*333d2b36SAndroid Build Coastguard Worker	}
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker	bootclasspathTurbineJars := []string{
79*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/stable.core.platform.api.stubs/android_common/turbine/stable.core.platform.api.stubs.jar",
80*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/core-lambda-stubs/android_common/turbine/core-lambda-stubs.jar",
81*333d2b36SAndroid Build Coastguard Worker	}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker	frameworkTurbineCombinedJars := []string{
84*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/ext/android_common/turbine-combined/ext.jar",
85*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/framework/android_common/turbine-combined/framework.jar",
86*333d2b36SAndroid Build Coastguard Worker	}
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Worker	frameworkTurbineJars := []string{
89*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/ext/android_common/turbine/ext.jar",
90*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/default/java/framework/android_common/turbine/framework.jar",
91*333d2b36SAndroid Build Coastguard Worker	}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
94*333d2b36SAndroid Build Coastguard Worker		name string
95*333d2b36SAndroid Build Coastguard Worker
96*333d2b36SAndroid Build Coastguard Worker		preparer android.FixturePreparer
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Worker		fooKotlincInputs        []string
99*333d2b36SAndroid Build Coastguard Worker		fooJavacInputs          []string
100*333d2b36SAndroid Build Coastguard Worker		fooKotlincClasspath     []string
101*333d2b36SAndroid Build Coastguard Worker		fooJavacClasspath       []string
102*333d2b36SAndroid Build Coastguard Worker		fooCombinedInputs       []string
103*333d2b36SAndroid Build Coastguard Worker		fooHeaderCombinedInputs []string
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker		barKotlincInputs        []string
106*333d2b36SAndroid Build Coastguard Worker		barKotlincClasspath     []string
107*333d2b36SAndroid Build Coastguard Worker		barCombinedInputs       []string
108*333d2b36SAndroid Build Coastguard Worker		barHeaderCombinedInputs []string
109*333d2b36SAndroid Build Coastguard Worker	}{
110*333d2b36SAndroid Build Coastguard Worker		{
111*333d2b36SAndroid Build Coastguard Worker			name:             "normal",
112*333d2b36SAndroid Build Coastguard Worker			preparer:         android.NullFixturePreparer,
113*333d2b36SAndroid Build Coastguard Worker			fooKotlincInputs: []string{"a.java", "b.kt"},
114*333d2b36SAndroid Build Coastguard Worker			fooJavacInputs:   []string{"a.java"},
115*333d2b36SAndroid Build Coastguard Worker			fooKotlincClasspath: slices.Concat(
116*333d2b36SAndroid Build Coastguard Worker				bootclasspathTurbineCombinedJars,
117*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineCombinedJars,
118*333d2b36SAndroid Build Coastguard Worker				[]string{"out/soong/.intermediates/quz/android_common/turbine-combined/quz.jar"},
119*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineCombinedJars,
120*333d2b36SAndroid Build Coastguard Worker			),
121*333d2b36SAndroid Build Coastguard Worker			fooJavacClasspath: slices.Concat(
122*333d2b36SAndroid Build Coastguard Worker				[]string{"out/soong/.intermediates/foo/android_common/kotlin_headers/foo.jar"},
123*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineCombinedJars,
124*333d2b36SAndroid Build Coastguard Worker				[]string{"out/soong/.intermediates/quz/android_common/turbine-combined/quz.jar"},
125*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineCombinedJars,
126*333d2b36SAndroid Build Coastguard Worker			),
127*333d2b36SAndroid Build Coastguard Worker			fooCombinedInputs: slices.Concat(
128*333d2b36SAndroid Build Coastguard Worker				[]string{
129*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/kotlin/foo.jar",
130*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/javac/foo.jar",
131*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/combined/quz.jar",
132*333d2b36SAndroid Build Coastguard Worker				},
133*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibJavacJars,
134*333d2b36SAndroid Build Coastguard Worker			),
135*333d2b36SAndroid Build Coastguard Worker			fooHeaderCombinedInputs: slices.Concat(
136*333d2b36SAndroid Build Coastguard Worker				[]string{
137*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/turbine/foo.jar",
138*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/kotlin_headers/foo.jar",
139*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/turbine-combined/quz.jar",
140*333d2b36SAndroid Build Coastguard Worker				},
141*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineCombinedJars,
142*333d2b36SAndroid Build Coastguard Worker			),
143*333d2b36SAndroid Build Coastguard Worker
144*333d2b36SAndroid Build Coastguard Worker			barKotlincInputs: []string{"b.kt"},
145*333d2b36SAndroid Build Coastguard Worker			barKotlincClasspath: slices.Concat(
146*333d2b36SAndroid Build Coastguard Worker				bootclasspathTurbineCombinedJars,
147*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineCombinedJars,
148*333d2b36SAndroid Build Coastguard Worker				[]string{
149*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar",
150*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/baz/android_common/turbine-combined/baz.jar",
151*333d2b36SAndroid Build Coastguard Worker				},
152*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineCombinedJars,
153*333d2b36SAndroid Build Coastguard Worker			),
154*333d2b36SAndroid Build Coastguard Worker			barCombinedInputs: slices.Concat(
155*333d2b36SAndroid Build Coastguard Worker				[]string{
156*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/bar/android_common/kotlin/bar.jar",
157*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/baz/android_common/combined/baz.jar",
158*333d2b36SAndroid Build Coastguard Worker				},
159*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibJavacJars,
160*333d2b36SAndroid Build Coastguard Worker				[]string{},
161*333d2b36SAndroid Build Coastguard Worker			),
162*333d2b36SAndroid Build Coastguard Worker			barHeaderCombinedInputs: slices.Concat(
163*333d2b36SAndroid Build Coastguard Worker				[]string{
164*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/bar/android_common/kotlin_headers/bar.jar",
165*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/baz/android_common/turbine-combined/baz.jar",
166*333d2b36SAndroid Build Coastguard Worker				},
167*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineCombinedJars,
168*333d2b36SAndroid Build Coastguard Worker			),
169*333d2b36SAndroid Build Coastguard Worker		},
170*333d2b36SAndroid Build Coastguard Worker		{
171*333d2b36SAndroid Build Coastguard Worker			name:             "transitive classpath",
172*333d2b36SAndroid Build Coastguard Worker			preparer:         PrepareForTestWithTransitiveClasspathEnabled,
173*333d2b36SAndroid Build Coastguard Worker			fooKotlincInputs: []string{"a.java", "b.kt"},
174*333d2b36SAndroid Build Coastguard Worker			fooJavacInputs:   []string{"a.java"},
175*333d2b36SAndroid Build Coastguard Worker			fooKotlincClasspath: slices.Concat(
176*333d2b36SAndroid Build Coastguard Worker				bootclasspathTurbineJars,
177*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineJars,
178*333d2b36SAndroid Build Coastguard Worker				[]string{"out/soong/.intermediates/quz/android_common/kotlin_headers/quz.jar"},
179*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineJars,
180*333d2b36SAndroid Build Coastguard Worker			),
181*333d2b36SAndroid Build Coastguard Worker			fooJavacClasspath: slices.Concat(
182*333d2b36SAndroid Build Coastguard Worker				[]string{"out/soong/.intermediates/foo/android_common/kotlin_headers/foo.jar"},
183*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineJars,
184*333d2b36SAndroid Build Coastguard Worker				[]string{"out/soong/.intermediates/quz/android_common/kotlin_headers/quz.jar"},
185*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineJars,
186*333d2b36SAndroid Build Coastguard Worker			),
187*333d2b36SAndroid Build Coastguard Worker			fooCombinedInputs: slices.Concat(
188*333d2b36SAndroid Build Coastguard Worker				[]string{
189*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/kotlin/foo.jar",
190*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/javac/foo.jar",
191*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/kotlin/quz.jar",
192*333d2b36SAndroid Build Coastguard Worker				},
193*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibJavacJars,
194*333d2b36SAndroid Build Coastguard Worker			),
195*333d2b36SAndroid Build Coastguard Worker			fooHeaderCombinedInputs: slices.Concat(
196*333d2b36SAndroid Build Coastguard Worker				[]string{
197*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/turbine/foo.jar",
198*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/kotlin_headers/foo.jar",
199*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/kotlin_headers/quz.jar",
200*333d2b36SAndroid Build Coastguard Worker				},
201*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineJars,
202*333d2b36SAndroid Build Coastguard Worker			),
203*333d2b36SAndroid Build Coastguard Worker
204*333d2b36SAndroid Build Coastguard Worker			barKotlincInputs: []string{"b.kt"},
205*333d2b36SAndroid Build Coastguard Worker			barKotlincClasspath: slices.Concat(
206*333d2b36SAndroid Build Coastguard Worker				bootclasspathTurbineJars,
207*333d2b36SAndroid Build Coastguard Worker				frameworkTurbineJars,
208*333d2b36SAndroid Build Coastguard Worker				[]string{
209*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/turbine/foo.jar",
210*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/foo/android_common/kotlin_headers/foo.jar",
211*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/kotlin_headers/quz.jar",
212*333d2b36SAndroid Build Coastguard Worker				},
213*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineJars,
214*333d2b36SAndroid Build Coastguard Worker				[]string{"out/soong/.intermediates/baz/android_common/turbine/baz.jar"},
215*333d2b36SAndroid Build Coastguard Worker			),
216*333d2b36SAndroid Build Coastguard Worker			barCombinedInputs: slices.Concat(
217*333d2b36SAndroid Build Coastguard Worker				[]string{
218*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/bar/android_common/kotlin/bar.jar",
219*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/baz/android_common/javac/baz.jar",
220*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/kotlin/quz.jar",
221*333d2b36SAndroid Build Coastguard Worker				},
222*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibJavacJars,
223*333d2b36SAndroid Build Coastguard Worker			),
224*333d2b36SAndroid Build Coastguard Worker			barHeaderCombinedInputs: slices.Concat(
225*333d2b36SAndroid Build Coastguard Worker				[]string{
226*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/bar/android_common/kotlin_headers/bar.jar",
227*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/baz/android_common/turbine/baz.jar",
228*333d2b36SAndroid Build Coastguard Worker					"out/soong/.intermediates/quz/android_common/kotlin_headers/quz.jar",
229*333d2b36SAndroid Build Coastguard Worker				},
230*333d2b36SAndroid Build Coastguard Worker				kotlinStdlibTurbineJars,
231*333d2b36SAndroid Build Coastguard Worker			),
232*333d2b36SAndroid Build Coastguard Worker		},
233*333d2b36SAndroid Build Coastguard Worker	}
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Worker	for _, tt := range testCases {
236*333d2b36SAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
237*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
238*333d2b36SAndroid Build Coastguard Worker				PrepareForTestWithJavaDefaultModules,
239*333d2b36SAndroid Build Coastguard Worker				tt.preparer,
240*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, bp)
241*333d2b36SAndroid Build Coastguard Worker			foo := result.ModuleForTests("foo", "android_common")
242*333d2b36SAndroid Build Coastguard Worker			fooKotlinc := foo.Rule("kotlinc")
243*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "foo kotlinc inputs", tt.fooKotlincInputs, fooKotlinc.Inputs)
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Worker			fooKotlincClasspath := android.ContentFromFileRuleForTests(t, result.TestContext, foo.Output("kotlinc/classpath.rsp"))
246*333d2b36SAndroid Build Coastguard Worker			android.AssertStringPathsRelativeToTopEquals(t, "foo kotlinc classpath", result.Config, tt.fooKotlincClasspath, strings.Fields(fooKotlincClasspath))
247*333d2b36SAndroid Build Coastguard Worker
248*333d2b36SAndroid Build Coastguard Worker			fooJavac := foo.Rule("javac")
249*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "foo javac inputs", tt.fooJavacInputs, fooJavac.Inputs)
250*333d2b36SAndroid Build Coastguard Worker
251*333d2b36SAndroid Build Coastguard Worker			fooJavacClasspath := fooJavac.Args["classpath"]
252*333d2b36SAndroid Build Coastguard Worker			android.AssertStringPathsRelativeToTopEquals(t, "foo javac classpath", result.Config, tt.fooJavacClasspath,
253*333d2b36SAndroid Build Coastguard Worker				strings.Split(strings.TrimPrefix(fooJavacClasspath, "-classpath "), ":"))
254*333d2b36SAndroid Build Coastguard Worker
255*333d2b36SAndroid Build Coastguard Worker			fooCombinedJar := foo.Output("combined/foo.jar")
256*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "foo combined inputs", tt.fooCombinedInputs, fooCombinedJar.Inputs)
257*333d2b36SAndroid Build Coastguard Worker
258*333d2b36SAndroid Build Coastguard Worker			fooCombinedHeaderJar := foo.Output("turbine-combined/foo.jar")
259*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "foo header combined inputs", tt.fooHeaderCombinedInputs, fooCombinedHeaderJar.Inputs)
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Worker			bar := result.ModuleForTests("bar", "android_common")
262*333d2b36SAndroid Build Coastguard Worker			barKotlinc := bar.Rule("kotlinc")
263*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "bar kotlinc inputs", tt.barKotlincInputs, barKotlinc.Inputs)
264*333d2b36SAndroid Build Coastguard Worker
265*333d2b36SAndroid Build Coastguard Worker			barKotlincClasspath := android.ContentFromFileRuleForTests(t, result.TestContext, bar.Output("kotlinc/classpath.rsp"))
266*333d2b36SAndroid Build Coastguard Worker			android.AssertStringPathsRelativeToTopEquals(t, "bar kotlinc classpath", result.Config, tt.barKotlincClasspath, strings.Fields(barKotlincClasspath))
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Worker			barCombinedJar := bar.Output("combined/bar.jar")
269*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "bar combined inputs", tt.barCombinedInputs, barCombinedJar.Inputs)
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Worker			barCombinedHeaderJar := bar.Output("turbine-combined/bar.jar")
272*333d2b36SAndroid Build Coastguard Worker			android.AssertPathsRelativeToTopEquals(t, "bar header combined inputs", tt.barHeaderCombinedInputs, barCombinedHeaderJar.Inputs)
273*333d2b36SAndroid Build Coastguard Worker		})
274*333d2b36SAndroid Build Coastguard Worker	}
275*333d2b36SAndroid Build Coastguard Worker}
276*333d2b36SAndroid Build Coastguard Worker
277*333d2b36SAndroid Build Coastguard Workerfunc TestKapt(t *testing.T) {
278*333d2b36SAndroid Build Coastguard Worker	bp := `
279*333d2b36SAndroid Build Coastguard Worker		java_library {
280*333d2b36SAndroid Build Coastguard Worker			name: "foo",
281*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java", "b.kt"],
282*333d2b36SAndroid Build Coastguard Worker			plugins: ["bar", "baz"],
283*333d2b36SAndroid Build Coastguard Worker			errorprone: {
284*333d2b36SAndroid Build Coastguard Worker				extra_check_modules: ["my_check"],
285*333d2b36SAndroid Build Coastguard Worker			},
286*333d2b36SAndroid Build Coastguard Worker		}
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Worker		java_plugin {
289*333d2b36SAndroid Build Coastguard Worker			name: "bar",
290*333d2b36SAndroid Build Coastguard Worker			processor_class: "com.bar",
291*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
292*333d2b36SAndroid Build Coastguard Worker		}
293*333d2b36SAndroid Build Coastguard Worker
294*333d2b36SAndroid Build Coastguard Worker		java_plugin {
295*333d2b36SAndroid Build Coastguard Worker			name: "baz",
296*333d2b36SAndroid Build Coastguard Worker			processor_class: "com.baz",
297*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
298*333d2b36SAndroid Build Coastguard Worker		}
299*333d2b36SAndroid Build Coastguard Worker
300*333d2b36SAndroid Build Coastguard Worker		java_plugin {
301*333d2b36SAndroid Build Coastguard Worker			name: "my_check",
302*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
303*333d2b36SAndroid Build Coastguard Worker		}
304*333d2b36SAndroid Build Coastguard Worker	`
305*333d2b36SAndroid Build Coastguard Worker	t.Run("", func(t *testing.T) {
306*333d2b36SAndroid Build Coastguard Worker		ctx, _ := testJava(t, bp)
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Worker		buildOS := ctx.Config().BuildOS.String()
309*333d2b36SAndroid Build Coastguard Worker
310*333d2b36SAndroid Build Coastguard Worker		foo := ctx.ModuleForTests("foo", "android_common")
311*333d2b36SAndroid Build Coastguard Worker		kaptStubs := foo.Rule("kapt")
312*333d2b36SAndroid Build Coastguard Worker		turbineApt := foo.Description("turbine apt")
313*333d2b36SAndroid Build Coastguard Worker		kotlinc := foo.Rule("kotlinc")
314*333d2b36SAndroid Build Coastguard Worker		javac := foo.Rule("javac")
315*333d2b36SAndroid Build Coastguard Worker
316*333d2b36SAndroid Build Coastguard Worker		bar := ctx.ModuleForTests("bar", buildOS+"_common").Rule("javac").Output.String()
317*333d2b36SAndroid Build Coastguard Worker		baz := ctx.ModuleForTests("baz", buildOS+"_common").Rule("javac").Output.String()
318*333d2b36SAndroid Build Coastguard Worker
319*333d2b36SAndroid Build Coastguard Worker		// Test that the kotlin and java sources are passed to kapt and kotlinc
320*333d2b36SAndroid Build Coastguard Worker		if len(kaptStubs.Inputs) != 2 || kaptStubs.Inputs[0].String() != "a.java" || kaptStubs.Inputs[1].String() != "b.kt" {
321*333d2b36SAndroid Build Coastguard Worker			t.Errorf(`foo kapt inputs %v != ["a.java", "b.kt"]`, kaptStubs.Inputs)
322*333d2b36SAndroid Build Coastguard Worker		}
323*333d2b36SAndroid Build Coastguard Worker		if len(kotlinc.Inputs) != 2 || kotlinc.Inputs[0].String() != "a.java" || kotlinc.Inputs[1].String() != "b.kt" {
324*333d2b36SAndroid Build Coastguard Worker			t.Errorf(`foo kotlinc inputs %v != ["a.java", "b.kt"]`, kotlinc.Inputs)
325*333d2b36SAndroid Build Coastguard Worker		}
326*333d2b36SAndroid Build Coastguard Worker
327*333d2b36SAndroid Build Coastguard Worker		// Test that only the java sources are passed to turbine-apt and javac
328*333d2b36SAndroid Build Coastguard Worker		if len(turbineApt.Inputs) != 1 || turbineApt.Inputs[0].String() != "a.java" {
329*333d2b36SAndroid Build Coastguard Worker			t.Errorf(`foo turbine apt inputs %v != ["a.java"]`, turbineApt.Inputs)
330*333d2b36SAndroid Build Coastguard Worker		}
331*333d2b36SAndroid Build Coastguard Worker		if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
332*333d2b36SAndroid Build Coastguard Worker			t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
333*333d2b36SAndroid Build Coastguard Worker		}
334*333d2b36SAndroid Build Coastguard Worker
335*333d2b36SAndroid Build Coastguard Worker		// Test that the kapt stubs jar is a dependency of turbine-apt
336*333d2b36SAndroid Build Coastguard Worker		if !inList(kaptStubs.Output.String(), turbineApt.Implicits.Strings()) {
337*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected %q in turbine-apt implicits %v", kaptStubs.Output.String(), kotlinc.Implicits.Strings())
338*333d2b36SAndroid Build Coastguard Worker		}
339*333d2b36SAndroid Build Coastguard Worker
340*333d2b36SAndroid Build Coastguard Worker		// Test that the turbine-apt srcjar is a dependency of kotlinc and javac rules
341*333d2b36SAndroid Build Coastguard Worker		if !inList(turbineApt.Output.String(), kotlinc.Implicits.Strings()) {
342*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected %q in kotlinc implicits %v", turbineApt.Output.String(), kotlinc.Implicits.Strings())
343*333d2b36SAndroid Build Coastguard Worker		}
344*333d2b36SAndroid Build Coastguard Worker		if !inList(turbineApt.Output.String(), javac.Implicits.Strings()) {
345*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected %q in javac implicits %v", turbineApt.Output.String(), javac.Implicits.Strings())
346*333d2b36SAndroid Build Coastguard Worker		}
347*333d2b36SAndroid Build Coastguard Worker
348*333d2b36SAndroid Build Coastguard Worker		// Test that the turbine-apt srcjar is extracted by the kotlinc and javac rules
349*333d2b36SAndroid Build Coastguard Worker		if kotlinc.Args["srcJars"] != turbineApt.Output.String() {
350*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected %q in kotlinc srcjars %v", turbineApt.Output.String(), kotlinc.Args["srcJars"])
351*333d2b36SAndroid Build Coastguard Worker		}
352*333d2b36SAndroid Build Coastguard Worker		if javac.Args["srcJars"] != turbineApt.Output.String() {
353*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected %q in javac srcjars %v", turbineApt.Output.String(), kotlinc.Args["srcJars"])
354*333d2b36SAndroid Build Coastguard Worker		}
355*333d2b36SAndroid Build Coastguard Worker
356*333d2b36SAndroid Build Coastguard Worker		// Test that the processors are passed to kapt
357*333d2b36SAndroid Build Coastguard Worker		expectedProcessorPath := "-P plugin:org.jetbrains.kotlin.kapt3:apclasspath=" + bar +
358*333d2b36SAndroid Build Coastguard Worker			" -P plugin:org.jetbrains.kotlin.kapt3:apclasspath=" + baz
359*333d2b36SAndroid Build Coastguard Worker		if kaptStubs.Args["kaptProcessorPath"] != expectedProcessorPath {
360*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected kaptProcessorPath %q, got %q", expectedProcessorPath, kaptStubs.Args["kaptProcessorPath"])
361*333d2b36SAndroid Build Coastguard Worker		}
362*333d2b36SAndroid Build Coastguard Worker		expectedProcessor := "-P plugin:org.jetbrains.kotlin.kapt3:processors=com.bar -P plugin:org.jetbrains.kotlin.kapt3:processors=com.baz"
363*333d2b36SAndroid Build Coastguard Worker		if kaptStubs.Args["kaptProcessor"] != expectedProcessor {
364*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected kaptProcessor %q, got %q", expectedProcessor, kaptStubs.Args["kaptProcessor"])
365*333d2b36SAndroid Build Coastguard Worker		}
366*333d2b36SAndroid Build Coastguard Worker
367*333d2b36SAndroid Build Coastguard Worker		// Test that the processors are passed to turbine-apt
368*333d2b36SAndroid Build Coastguard Worker		expectedProcessorPath = "--processorpath " + bar + " " + baz
369*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(turbineApt.Args["turbineFlags"], expectedProcessorPath) {
370*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected turbine-apt processorpath %q, got %q", expectedProcessorPath, turbineApt.Args["turbineFlags"])
371*333d2b36SAndroid Build Coastguard Worker		}
372*333d2b36SAndroid Build Coastguard Worker		expectedProcessor = "--processors com.bar com.baz"
373*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(turbineApt.Args["turbineFlags"], expectedProcessor) {
374*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected turbine-apt processor %q, got %q", expectedProcessor, turbineApt.Args["turbineFlags"])
375*333d2b36SAndroid Build Coastguard Worker		}
376*333d2b36SAndroid Build Coastguard Worker
377*333d2b36SAndroid Build Coastguard Worker		// Test that the processors are not passed to javac
378*333d2b36SAndroid Build Coastguard Worker		if javac.Args["processorpath"] != "" {
379*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected processorPath '', got %q", javac.Args["processorpath"])
380*333d2b36SAndroid Build Coastguard Worker		}
381*333d2b36SAndroid Build Coastguard Worker		if javac.Args["processor"] != "-proc:none" {
382*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected processor '-proc:none', got %q", javac.Args["processor"])
383*333d2b36SAndroid Build Coastguard Worker		}
384*333d2b36SAndroid Build Coastguard Worker	})
385*333d2b36SAndroid Build Coastguard Worker
386*333d2b36SAndroid Build Coastguard Worker	t.Run("errorprone", func(t *testing.T) {
387*333d2b36SAndroid Build Coastguard Worker		env := map[string]string{
388*333d2b36SAndroid Build Coastguard Worker			"RUN_ERROR_PRONE": "true",
389*333d2b36SAndroid Build Coastguard Worker		}
390*333d2b36SAndroid Build Coastguard Worker
391*333d2b36SAndroid Build Coastguard Worker		result := android.GroupFixturePreparers(
392*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithJavaDefaultModules,
393*333d2b36SAndroid Build Coastguard Worker			android.FixtureMergeEnv(env),
394*333d2b36SAndroid Build Coastguard Worker		).RunTestWithBp(t, bp)
395*333d2b36SAndroid Build Coastguard Worker
396*333d2b36SAndroid Build Coastguard Worker		buildOS := result.Config.BuildOS.String()
397*333d2b36SAndroid Build Coastguard Worker
398*333d2b36SAndroid Build Coastguard Worker		kapt := result.ModuleForTests("foo", "android_common").Rule("kapt")
399*333d2b36SAndroid Build Coastguard Worker		javac := result.ModuleForTests("foo", "android_common").Description("javac")
400*333d2b36SAndroid Build Coastguard Worker		errorprone := result.ModuleForTests("foo", "android_common").Description("errorprone")
401*333d2b36SAndroid Build Coastguard Worker
402*333d2b36SAndroid Build Coastguard Worker		bar := result.ModuleForTests("bar", buildOS+"_common").Description("javac").Output.String()
403*333d2b36SAndroid Build Coastguard Worker		baz := result.ModuleForTests("baz", buildOS+"_common").Description("javac").Output.String()
404*333d2b36SAndroid Build Coastguard Worker		myCheck := result.ModuleForTests("my_check", buildOS+"_common").Description("javac").Output.String()
405*333d2b36SAndroid Build Coastguard Worker
406*333d2b36SAndroid Build Coastguard Worker		// Test that the errorprone plugins are not passed to kapt
407*333d2b36SAndroid Build Coastguard Worker		expectedProcessorPath := "-P plugin:org.jetbrains.kotlin.kapt3:apclasspath=" + bar +
408*333d2b36SAndroid Build Coastguard Worker			" -P plugin:org.jetbrains.kotlin.kapt3:apclasspath=" + baz
409*333d2b36SAndroid Build Coastguard Worker		if kapt.Args["kaptProcessorPath"] != expectedProcessorPath {
410*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected kaptProcessorPath %q, got %q", expectedProcessorPath, kapt.Args["kaptProcessorPath"])
411*333d2b36SAndroid Build Coastguard Worker		}
412*333d2b36SAndroid Build Coastguard Worker		expectedProcessor := "-P plugin:org.jetbrains.kotlin.kapt3:processors=com.bar -P plugin:org.jetbrains.kotlin.kapt3:processors=com.baz"
413*333d2b36SAndroid Build Coastguard Worker		if kapt.Args["kaptProcessor"] != expectedProcessor {
414*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected kaptProcessor %q, got %q", expectedProcessor, kapt.Args["kaptProcessor"])
415*333d2b36SAndroid Build Coastguard Worker		}
416*333d2b36SAndroid Build Coastguard Worker
417*333d2b36SAndroid Build Coastguard Worker		// Test that the errorprone plugins are not passed to javac
418*333d2b36SAndroid Build Coastguard Worker		if javac.Args["processorpath"] != "" {
419*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected processorPath '', got %q", javac.Args["processorpath"])
420*333d2b36SAndroid Build Coastguard Worker		}
421*333d2b36SAndroid Build Coastguard Worker		if javac.Args["processor"] != "-proc:none" {
422*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected processor '-proc:none', got %q", javac.Args["processor"])
423*333d2b36SAndroid Build Coastguard Worker		}
424*333d2b36SAndroid Build Coastguard Worker
425*333d2b36SAndroid Build Coastguard Worker		// Test that the errorprone plugins are passed to errorprone
426*333d2b36SAndroid Build Coastguard Worker		expectedProcessorPath = "-processorpath " + myCheck
427*333d2b36SAndroid Build Coastguard Worker		if errorprone.Args["processorpath"] != expectedProcessorPath {
428*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected processorpath %q, got %q", expectedProcessorPath, errorprone.Args["processorpath"])
429*333d2b36SAndroid Build Coastguard Worker		}
430*333d2b36SAndroid Build Coastguard Worker		if errorprone.Args["processor"] != "-proc:none" {
431*333d2b36SAndroid Build Coastguard Worker			t.Errorf("expected processor '-proc:none', got %q", errorprone.Args["processor"])
432*333d2b36SAndroid Build Coastguard Worker		}
433*333d2b36SAndroid Build Coastguard Worker	})
434*333d2b36SAndroid Build Coastguard Worker}
435*333d2b36SAndroid Build Coastguard Worker
436*333d2b36SAndroid Build Coastguard Workerfunc TestKaptEncodeFlags(t *testing.T) {
437*333d2b36SAndroid Build Coastguard Worker	// Compares the kaptEncodeFlags against the results of the example implementation at
438*333d2b36SAndroid Build Coastguard Worker	// https://kotlinlang.org/docs/reference/kapt.html#apjavac-options-encoding
439*333d2b36SAndroid Build Coastguard Worker	tests := []struct {
440*333d2b36SAndroid Build Coastguard Worker		in  [][2]string
441*333d2b36SAndroid Build Coastguard Worker		out string
442*333d2b36SAndroid Build Coastguard Worker	}{
443*333d2b36SAndroid Build Coastguard Worker		{
444*333d2b36SAndroid Build Coastguard Worker			// empty input
445*333d2b36SAndroid Build Coastguard Worker			in:  [][2]string{},
446*333d2b36SAndroid Build Coastguard Worker			out: "rO0ABXcEAAAAAA==",
447*333d2b36SAndroid Build Coastguard Worker		},
448*333d2b36SAndroid Build Coastguard Worker		{
449*333d2b36SAndroid Build Coastguard Worker			// common input
450*333d2b36SAndroid Build Coastguard Worker			in: [][2]string{
451*333d2b36SAndroid Build Coastguard Worker				{"-source", "1.8"},
452*333d2b36SAndroid Build Coastguard Worker				{"-target", "1.8"},
453*333d2b36SAndroid Build Coastguard Worker			},
454*333d2b36SAndroid Build Coastguard Worker			out: "rO0ABXcgAAAAAgAHLXNvdXJjZQADMS44AActdGFyZ2V0AAMxLjg=",
455*333d2b36SAndroid Build Coastguard Worker		},
456*333d2b36SAndroid Build Coastguard Worker		{
457*333d2b36SAndroid Build Coastguard Worker			// input that serializes to a 255 byte block
458*333d2b36SAndroid Build Coastguard Worker			in: [][2]string{
459*333d2b36SAndroid Build Coastguard Worker				{"-source", "1.8"},
460*333d2b36SAndroid Build Coastguard Worker				{"-target", "1.8"},
461*333d2b36SAndroid Build Coastguard Worker				{"a", strings.Repeat("b", 218)},
462*333d2b36SAndroid Build Coastguard Worker			},
463*333d2b36SAndroid Build Coastguard Worker			out: "rO0ABXf/AAAAAwAHLXNvdXJjZQADMS44AActdGFyZ2V0AAMxLjgAAWEA2mJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJi",
464*333d2b36SAndroid Build Coastguard Worker		},
465*333d2b36SAndroid Build Coastguard Worker		{
466*333d2b36SAndroid Build Coastguard Worker			// input that serializes to a 256 byte block
467*333d2b36SAndroid Build Coastguard Worker			in: [][2]string{
468*333d2b36SAndroid Build Coastguard Worker				{"-source", "1.8"},
469*333d2b36SAndroid Build Coastguard Worker				{"-target", "1.8"},
470*333d2b36SAndroid Build Coastguard Worker				{"a", strings.Repeat("b", 219)},
471*333d2b36SAndroid Build Coastguard Worker			},
472*333d2b36SAndroid Build Coastguard Worker			out: "rO0ABXoAAAEAAAAAAwAHLXNvdXJjZQADMS44AActdGFyZ2V0AAMxLjgAAWEA22JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYg==",
473*333d2b36SAndroid Build Coastguard Worker		},
474*333d2b36SAndroid Build Coastguard Worker		{
475*333d2b36SAndroid Build Coastguard Worker			// input that serializes to a 257 byte block
476*333d2b36SAndroid Build Coastguard Worker			in: [][2]string{
477*333d2b36SAndroid Build Coastguard Worker				{"-source", "1.8"},
478*333d2b36SAndroid Build Coastguard Worker				{"-target", "1.8"},
479*333d2b36SAndroid Build Coastguard Worker				{"a", strings.Repeat("b", 220)},
480*333d2b36SAndroid Build Coastguard Worker			},
481*333d2b36SAndroid Build Coastguard Worker			out: "rO0ABXoAAAEBAAAAAwAHLXNvdXJjZQADMS44AActdGFyZ2V0AAMxLjgAAWEA3GJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmI=",
482*333d2b36SAndroid Build Coastguard Worker		},
483*333d2b36SAndroid Build Coastguard Worker	}
484*333d2b36SAndroid Build Coastguard Worker
485*333d2b36SAndroid Build Coastguard Worker	for i, test := range tests {
486*333d2b36SAndroid Build Coastguard Worker		t.Run(strconv.Itoa(i), func(t *testing.T) {
487*333d2b36SAndroid Build Coastguard Worker			got := kaptEncodeFlags(test.in)
488*333d2b36SAndroid Build Coastguard Worker			if got != test.out {
489*333d2b36SAndroid Build Coastguard Worker				t.Errorf("\nwant %q\n got %q", test.out, got)
490*333d2b36SAndroid Build Coastguard Worker			}
491*333d2b36SAndroid Build Coastguard Worker		})
492*333d2b36SAndroid Build Coastguard Worker	}
493*333d2b36SAndroid Build Coastguard Worker}
494*333d2b36SAndroid Build Coastguard Worker
495*333d2b36SAndroid Build Coastguard Workerfunc TestKotlinCompose(t *testing.T) {
496*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
497*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
498*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
499*333d2b36SAndroid Build Coastguard Worker		java_library {
500*333d2b36SAndroid Build Coastguard Worker			name: "androidx.compose.runtime_runtime",
501*333d2b36SAndroid Build Coastguard Worker		}
502*333d2b36SAndroid Build Coastguard Worker
503*333d2b36SAndroid Build Coastguard Worker		kotlin_plugin {
504*333d2b36SAndroid Build Coastguard Worker			name: "androidx.compose.compiler_compiler-hosted-plugin",
505*333d2b36SAndroid Build Coastguard Worker		}
506*333d2b36SAndroid Build Coastguard Worker
507*333d2b36SAndroid Build Coastguard Worker		java_library {
508*333d2b36SAndroid Build Coastguard Worker			name: "withcompose",
509*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.kt"],
510*333d2b36SAndroid Build Coastguard Worker			plugins: ["plugin"],
511*333d2b36SAndroid Build Coastguard Worker			static_libs: ["androidx.compose.runtime_runtime"],
512*333d2b36SAndroid Build Coastguard Worker		}
513*333d2b36SAndroid Build Coastguard Worker
514*333d2b36SAndroid Build Coastguard Worker		java_library {
515*333d2b36SAndroid Build Coastguard Worker			name: "nocompose",
516*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.kt"],
517*333d2b36SAndroid Build Coastguard Worker		}
518*333d2b36SAndroid Build Coastguard Worker
519*333d2b36SAndroid Build Coastguard Worker		java_plugin {
520*333d2b36SAndroid Build Coastguard Worker			name: "plugin",
521*333d2b36SAndroid Build Coastguard Worker		}
522*333d2b36SAndroid Build Coastguard Worker	`)
523*333d2b36SAndroid Build Coastguard Worker
524*333d2b36SAndroid Build Coastguard Worker	buildOS := result.Config.BuildOS.String()
525*333d2b36SAndroid Build Coastguard Worker
526*333d2b36SAndroid Build Coastguard Worker	composeCompiler := result.ModuleForTests("androidx.compose.compiler_compiler-hosted-plugin", buildOS+"_common").Rule("combineJar").Output
527*333d2b36SAndroid Build Coastguard Worker	withCompose := result.ModuleForTests("withcompose", "android_common")
528*333d2b36SAndroid Build Coastguard Worker	noCompose := result.ModuleForTests("nocompose", "android_common")
529*333d2b36SAndroid Build Coastguard Worker
530*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "missing compose compiler dependency",
531*333d2b36SAndroid Build Coastguard Worker		withCompose.Rule("kotlinc").Implicits.Strings(), composeCompiler.String())
532*333d2b36SAndroid Build Coastguard Worker
533*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "missing compose compiler plugin",
534*333d2b36SAndroid Build Coastguard Worker		withCompose.VariablesForTestsRelativeToTop()["kotlincFlags"], "-Xplugin="+composeCompiler.String())
535*333d2b36SAndroid Build Coastguard Worker
536*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "missing kapt compose compiler dependency",
537*333d2b36SAndroid Build Coastguard Worker		withCompose.Rule("kapt").Implicits.Strings(), composeCompiler.String())
538*333d2b36SAndroid Build Coastguard Worker
539*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "unexpected compose compiler dependency",
540*333d2b36SAndroid Build Coastguard Worker		noCompose.Rule("kotlinc").Implicits.Strings(), composeCompiler.String())
541*333d2b36SAndroid Build Coastguard Worker
542*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "unexpected compose compiler plugin",
543*333d2b36SAndroid Build Coastguard Worker		noCompose.VariablesForTestsRelativeToTop()["kotlincFlags"], "-Xplugin="+composeCompiler.String())
544*333d2b36SAndroid Build Coastguard Worker}
545*333d2b36SAndroid Build Coastguard Worker
546*333d2b36SAndroid Build Coastguard Workerfunc TestKotlinPlugin(t *testing.T) {
547*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
548*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
549*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
550*333d2b36SAndroid Build Coastguard Worker		kotlin_plugin {
551*333d2b36SAndroid Build Coastguard Worker			name: "kotlin_plugin",
552*333d2b36SAndroid Build Coastguard Worker		}
553*333d2b36SAndroid Build Coastguard Worker
554*333d2b36SAndroid Build Coastguard Worker		java_library {
555*333d2b36SAndroid Build Coastguard Worker			name: "with_kotlin_plugin",
556*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.kt"],
557*333d2b36SAndroid Build Coastguard Worker			plugins: ["plugin"],
558*333d2b36SAndroid Build Coastguard Worker			kotlin_plugins: ["kotlin_plugin"],
559*333d2b36SAndroid Build Coastguard Worker		}
560*333d2b36SAndroid Build Coastguard Worker
561*333d2b36SAndroid Build Coastguard Worker		java_library {
562*333d2b36SAndroid Build Coastguard Worker			name: "no_kotlin_plugin",
563*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.kt"],
564*333d2b36SAndroid Build Coastguard Worker		}
565*333d2b36SAndroid Build Coastguard Worker
566*333d2b36SAndroid Build Coastguard Worker		java_plugin {
567*333d2b36SAndroid Build Coastguard Worker			name: "plugin",
568*333d2b36SAndroid Build Coastguard Worker		}
569*333d2b36SAndroid Build Coastguard Worker	`)
570*333d2b36SAndroid Build Coastguard Worker
571*333d2b36SAndroid Build Coastguard Worker	buildOS := result.Config.BuildOS.String()
572*333d2b36SAndroid Build Coastguard Worker
573*333d2b36SAndroid Build Coastguard Worker	kotlinPlugin := result.ModuleForTests("kotlin_plugin", buildOS+"_common").Rule("combineJar").Output
574*333d2b36SAndroid Build Coastguard Worker	withKotlinPlugin := result.ModuleForTests("with_kotlin_plugin", "android_common")
575*333d2b36SAndroid Build Coastguard Worker	noKotlinPlugin := result.ModuleForTests("no_kotlin_plugin", "android_common")
576*333d2b36SAndroid Build Coastguard Worker
577*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "missing plugin compiler dependency",
578*333d2b36SAndroid Build Coastguard Worker		withKotlinPlugin.Rule("kotlinc").Implicits.Strings(), kotlinPlugin.String())
579*333d2b36SAndroid Build Coastguard Worker
580*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "missing kotlin plugin",
581*333d2b36SAndroid Build Coastguard Worker		withKotlinPlugin.VariablesForTestsRelativeToTop()["kotlincFlags"], "-Xplugin="+kotlinPlugin.String())
582*333d2b36SAndroid Build Coastguard Worker
583*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListContains(t, "missing kapt kotlin plugin dependency",
584*333d2b36SAndroid Build Coastguard Worker		withKotlinPlugin.Rule("kapt").Implicits.Strings(), kotlinPlugin.String())
585*333d2b36SAndroid Build Coastguard Worker
586*333d2b36SAndroid Build Coastguard Worker	android.AssertStringListDoesNotContain(t, "unexpected kotlin plugin dependency",
587*333d2b36SAndroid Build Coastguard Worker		noKotlinPlugin.Rule("kotlinc").Implicits.Strings(), kotlinPlugin.String())
588*333d2b36SAndroid Build Coastguard Worker
589*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "unexpected kotlin plugin",
590*333d2b36SAndroid Build Coastguard Worker		noKotlinPlugin.VariablesForTestsRelativeToTop()["kotlincFlags"], "-Xplugin="+kotlinPlugin.String())
591*333d2b36SAndroid Build Coastguard Worker}
592