blob: 6b24daa5f24f5c2aa0653ba6ea6dcdf448624386 [file] [log] [blame]
Jaewoong Jung79e6f6b2021-04-21 14:01:55 -07001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
Jaewoong Jung11623b62021-04-21 14:16:57 -070018 "strings"
Jaewoong Jung79e6f6b2021-04-21 14:01:55 -070019 "testing"
20
21 "android/soong/android"
22)
23
Cole Faustb765d6b2024-01-04 10:29:27 -080024func TestJavaLintDoesntUseBaselineImplicitly(t *testing.T) {
Jaewoong Jung11623b62021-04-21 14:16:57 -070025 ctx, _ := testJavaWithFS(t, `
26 java_library {
27 name: "foo",
28 srcs: [
29 "a.java",
30 "b.java",
31 "c.java",
32 ],
33 min_sdk_version: "29",
34 sdk_version: "system_current",
35 }
36 `, map[string][]byte{
37 "lint-baseline.xml": nil,
38 })
39
40 foo := ctx.ModuleForTests("foo", "android_common")
41
Colin Crossf61d03d2023-11-02 16:56:39 -070042 sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, foo.Output("lint.sbox.textproto"))
Cole Faustb765d6b2024-01-04 10:29:27 -080043 if strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml") {
44 t.Error("Passed --baseline flag when baseline_filename was not set")
Jaewoong Jung11623b62021-04-21 14:16:57 -070045 }
46}
47
48func TestJavaLintRequiresCustomLintFileToExist(t *testing.T) {
49 android.GroupFixturePreparers(
50 PrepareForTestWithJavaDefaultModules,
51 android.PrepareForTestDisallowNonExistentPaths,
52 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern([]string{`source path "mybaseline.xml" does not exist`})).
53 RunTestWithBp(t, `
54 java_library {
55 name: "foo",
56 srcs: [
57 ],
58 min_sdk_version: "29",
59 sdk_version: "system_current",
60 lint: {
61 baseline_filename: "mybaseline.xml",
62 },
63 }
64 `)
65}
66
67func TestJavaLintUsesCorrectBpConfig(t *testing.T) {
68 ctx, _ := testJavaWithFS(t, `
69 java_library {
70 name: "foo",
71 srcs: [
72 "a.java",
73 "b.java",
74 "c.java",
75 ],
76 min_sdk_version: "29",
77 sdk_version: "system_current",
78 lint: {
79 error_checks: ["SomeCheck"],
80 baseline_filename: "mybaseline.xml",
81 },
82 }
83 `, map[string][]byte{
84 "mybaseline.xml": nil,
85 })
86
87 foo := ctx.ModuleForTests("foo", "android_common")
88
Colin Crossf61d03d2023-11-02 16:56:39 -070089 sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, foo.Output("lint.sbox.textproto"))
Jaewoong Jung11623b62021-04-21 14:16:57 -070090 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline mybaseline.xml") {
91 t.Error("did not use the correct file for baseline")
92 }
93
Cole Faust028b94c2024-01-16 17:17:11 -080094 if !strings.Contains(*sboxProto.Commands[0].Command, "--error_check NewApi") {
95 t.Error("should check NewApi errors")
Jaewoong Jung11623b62021-04-21 14:16:57 -070096 }
97
98 if !strings.Contains(*sboxProto.Commands[0].Command, "--error_check SomeCheck") {
99 t.Error("should combine NewApi errors with SomeCheck errors")
100 }
101}
102
Jaewoong Jung79e6f6b2021-04-21 14:01:55 -0700103func TestJavaLintBypassUpdatableChecks(t *testing.T) {
104 testCases := []struct {
105 name string
106 bp string
107 error string
108 }{
109 {
110 name: "warning_checks",
111 bp: `
112 java_library {
113 name: "foo",
114 srcs: [
115 "a.java",
116 ],
117 min_sdk_version: "29",
118 sdk_version: "current",
119 lint: {
120 warning_checks: ["NewApi"],
121 },
122 }
123 `,
124 error: "lint.warning_checks: Can't treat \\[NewApi\\] checks as warnings if min_sdk_version is different from sdk_version.",
125 },
126 {
127 name: "disable_checks",
128 bp: `
129 java_library {
130 name: "foo",
131 srcs: [
132 "a.java",
133 ],
134 min_sdk_version: "29",
135 sdk_version: "current",
136 lint: {
137 disabled_checks: ["NewApi"],
138 },
139 }
140 `,
141 error: "lint.disabled_checks: Can't disable \\[NewApi\\] checks if min_sdk_version is different from sdk_version.",
142 },
143 }
144
145 for _, testCase := range testCases {
146 t.Run(testCase.name, func(t *testing.T) {
147 errorHandler := android.FixtureExpectsAtLeastOneErrorMatchingPattern(testCase.error)
148 android.GroupFixturePreparers(PrepareForTestWithJavaDefaultModules).
149 ExtendWithErrorHandler(errorHandler).
150 RunTestWithBp(t, testCase.bp)
151 })
152 }
153}
Jaewoong Jung48de8832021-04-21 16:17:25 -0700154
Cole Faust24e25c02024-01-19 14:12:17 -0800155func TestJavaLintStrictUpdatabilityLinting(t *testing.T) {
156 bp := `
157 java_library {
158 name: "foo",
159 srcs: [
160 "a.java",
161 ],
162 static_libs: ["bar"],
163 min_sdk_version: "29",
164 sdk_version: "current",
165 lint: {
166 strict_updatability_linting: true,
167 baseline_filename: "lint-baseline.xml",
168 },
169 }
170
171 java_library {
172 name: "bar",
173 srcs: [
174 "a.java",
175 ],
176 min_sdk_version: "29",
177 sdk_version: "current",
178 lint: {
179 baseline_filename: "lint-baseline.xml",
180 }
181 }
182 `
183 fs := android.MockFS{
184 "lint-baseline.xml": nil,
185 }
186
187 result := android.GroupFixturePreparers(PrepareForTestWithJavaDefaultModules, fs.AddToFixture()).
188 RunTestWithBp(t, bp)
189
190 foo := result.ModuleForTests("foo", "android_common")
191 sboxProto := android.RuleBuilderSboxProtoForTests(t, result.TestContext, foo.Output("lint.sbox.textproto"))
192 if !strings.Contains(*sboxProto.Commands[0].Command,
193 "--baseline lint-baseline.xml --disallowed_issues NewApi") {
194 t.Error("did not restrict baselining NewApi")
195 }
196
197 bar := result.ModuleForTests("bar", "android_common")
198 sboxProto = android.RuleBuilderSboxProtoForTests(t, result.TestContext, bar.Output("lint.sbox.textproto"))
199 if !strings.Contains(*sboxProto.Commands[0].Command,
200 "--baseline lint-baseline.xml --disallowed_issues NewApi") {
201 t.Error("did not restrict baselining NewApi")
202 }
203}
Pedro Loureiro18233a22021-06-08 18:11:21 +0000204
Cole Faustada543e2024-02-01 17:36:57 -0800205func TestJavaLintStrictUpdatabilityLintingMultipleParents(t *testing.T) {
206 bp := `
207 java_library {
208 name: "a",
209 srcs: ["a.java"],
210 static_libs: ["b"],
211 min_sdk_version: "29",
212 sdk_version: "current",
213 lint: {
214 strict_updatability_linting: true,
215 baseline_filename: "lint-baseline.xml",
216 },
217 }
218
219 java_library {
220 name: "b",
221 srcs: ["b.java"],
222 static_libs: ["c"],
223 min_sdk_version: "29",
224 sdk_version: "current",
225 lint: {
226 strict_updatability_linting: true,
227 },
228 }
229
230 java_library {
231 name: "d",
232 srcs: ["d.java"],
233 static_libs: ["c"],
234 min_sdk_version: "29",
235 sdk_version: "current",
236 lint: {
237 strict_updatability_linting: true,
238 },
239 }
240
241 java_library {
242 name: "c",
243 srcs: ["c.java"],
244 min_sdk_version: "29",
245 sdk_version: "current",
246 lint: {
247 baseline_filename: "lint-baseline.xml",
248 }
249 }
250 `
251 fs := android.MockFS{
252 "lint-baseline.xml": nil,
253 }
254
255 result := android.GroupFixturePreparers(PrepareForTestWithJavaDefaultModules, fs.AddToFixture()).
256 RunTestWithBp(t, bp)
257
258 c := result.ModuleForTests("c", "android_common")
259 sboxProto := android.RuleBuilderSboxProtoForTests(t, result.TestContext, c.Output("lint.sbox.textproto"))
260 if !strings.Contains(*sboxProto.Commands[0].Command,
261 "--baseline lint-baseline.xml --disallowed_issues NewApi") {
262 t.Error("did not restrict baselining NewApi")
263 }
264 if !strings.Contains(*sboxProto.Commands[0].Command,
265 "--strict_updatability_parents a,b,d") {
266 t.Errorf("Did not find correct strict_updatability_parents in command %q", *sboxProto.Commands[0].Command)
267 }
268}
269
Pedro Loureiro18233a22021-06-08 18:11:21 +0000270func TestJavaLintDatabaseSelectionFull(t *testing.T) {
Cole Faust69861aa2023-01-31 15:49:07 -0800271 testCases := []struct {
272 sdk_version string
273 expected_file string
274 }{
275 {
276 "current",
277 "api_versions_public.xml",
278 }, {
279 "core_platform",
280 "api_versions_public.xml",
281 }, {
282 "system_current",
283 "api_versions_system.xml",
284 }, {
285 "module_current",
286 "api_versions_module_lib.xml",
287 }, {
288 "system_server_current",
289 "api_versions_system_server.xml",
290 }, {
291 "S",
292 "api_versions_public.xml",
293 }, {
294 "30",
295 "api_versions_public.xml",
296 }, {
297 "10000",
298 "api_versions_public.xml",
299 },
Pedro Loureiro18233a22021-06-08 18:11:21 +0000300 }
301 bp := `
302 java_library {
303 name: "foo",
304 srcs: [
305 "a.java",
306 ],
307 min_sdk_version: "29",
308 sdk_version: "XXX",
309 lint: {
310 strict_updatability_linting: true,
311 },
312 }
313`
314 for _, testCase := range testCases {
Cole Faust69861aa2023-01-31 15:49:07 -0800315 thisBp := strings.Replace(bp, "XXX", testCase.sdk_version, 1)
Pedro Loureiro18233a22021-06-08 18:11:21 +0000316
317 result := android.GroupFixturePreparers(PrepareForTestWithJavaDefaultModules, FixtureWithPrebuiltApis(map[string][]string{
318 "30": {"foo"},
319 "10000": {"foo"},
320 })).
321 RunTestWithBp(t, thisBp)
322
323 foo := result.ModuleForTests("foo", "android_common")
Colin Crossf61d03d2023-11-02 16:56:39 -0700324 sboxProto := android.RuleBuilderSboxProtoForTests(t, result.TestContext, foo.Output("lint.sbox.textproto"))
Cole Faust69861aa2023-01-31 15:49:07 -0800325 if !strings.Contains(*sboxProto.Commands[0].Command, "/"+testCase.expected_file) {
Pedro Loureiro18233a22021-06-08 18:11:21 +0000326 t.Error("did not use full api database for case", testCase)
327 }
328 }
Pedro Loureiro18233a22021-06-08 18:11:21 +0000329}
Cole Faust5d0aaf42024-01-29 13:49:14 -0800330
331func TestCantControlCheckSeverityWithFlags(t *testing.T) {
332 bp := `
333 java_library {
334 name: "foo",
335 srcs: [
336 "a.java",
337 ],
338 min_sdk_version: "29",
339 sdk_version: "current",
340 lint: {
341 flags: ["--disabled", "NewApi"],
342 },
343 }
344 `
345 PrepareForTestWithJavaDefaultModules.
346 ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("Don't use --disable, --enable, or --check in the flags field, instead use the dedicated disabled_checks, warning_checks, error_checks, or fatal_checks fields")).
347 RunTestWithBp(t, bp)
348}