blob: 11c999cea49dc6225e03fdde983723b12bd01c8f [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 Faust1021ccd2023-02-26 21:15:25 -0800155// TODO(b/193460475): Re-enable this test
156//func TestJavaLintStrictUpdatabilityLinting(t *testing.T) {
157// bp := `
158// java_library {
159// name: "foo",
160// srcs: [
161// "a.java",
162// ],
163// static_libs: ["bar"],
164// min_sdk_version: "29",
165// sdk_version: "current",
166// lint: {
167// strict_updatability_linting: true,
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// }
179// `
180// fs := android.MockFS{
181// "lint-baseline.xml": nil,
182// }
183//
184// result := android.GroupFixturePreparers(PrepareForTestWithJavaDefaultModules, fs.AddToFixture()).
185// RunTestWithBp(t, bp)
186//
187// foo := result.ModuleForTests("foo", "android_common")
188// sboxProto := android.RuleBuilderSboxProtoForTests(t, foo.Output("lint.sbox.textproto"))
189// if !strings.Contains(*sboxProto.Commands[0].Command,
190// "--baseline lint-baseline.xml --disallowed_issues NewApi") {
191// t.Error("did not restrict baselining NewApi")
192// }
193//
194// bar := result.ModuleForTests("bar", "android_common")
195// sboxProto = android.RuleBuilderSboxProtoForTests(t, bar.Output("lint.sbox.textproto"))
196// if !strings.Contains(*sboxProto.Commands[0].Command,
197// "--baseline lint-baseline.xml --disallowed_issues NewApi") {
198// t.Error("did not restrict baselining NewApi")
199// }
200//}
Pedro Loureiro18233a22021-06-08 18:11:21 +0000201
202func TestJavaLintDatabaseSelectionFull(t *testing.T) {
Cole Faust69861aa2023-01-31 15:49:07 -0800203 testCases := []struct {
204 sdk_version string
205 expected_file string
206 }{
207 {
208 "current",
209 "api_versions_public.xml",
210 }, {
211 "core_platform",
212 "api_versions_public.xml",
213 }, {
214 "system_current",
215 "api_versions_system.xml",
216 }, {
217 "module_current",
218 "api_versions_module_lib.xml",
219 }, {
220 "system_server_current",
221 "api_versions_system_server.xml",
222 }, {
223 "S",
224 "api_versions_public.xml",
225 }, {
226 "30",
227 "api_versions_public.xml",
228 }, {
229 "10000",
230 "api_versions_public.xml",
231 },
Pedro Loureiro18233a22021-06-08 18:11:21 +0000232 }
233 bp := `
234 java_library {
235 name: "foo",
236 srcs: [
237 "a.java",
238 ],
239 min_sdk_version: "29",
240 sdk_version: "XXX",
241 lint: {
242 strict_updatability_linting: true,
243 },
244 }
245`
246 for _, testCase := range testCases {
Cole Faust69861aa2023-01-31 15:49:07 -0800247 thisBp := strings.Replace(bp, "XXX", testCase.sdk_version, 1)
Pedro Loureiro18233a22021-06-08 18:11:21 +0000248
249 result := android.GroupFixturePreparers(PrepareForTestWithJavaDefaultModules, FixtureWithPrebuiltApis(map[string][]string{
250 "30": {"foo"},
251 "10000": {"foo"},
252 })).
253 RunTestWithBp(t, thisBp)
254
255 foo := result.ModuleForTests("foo", "android_common")
Colin Crossf61d03d2023-11-02 16:56:39 -0700256 sboxProto := android.RuleBuilderSboxProtoForTests(t, result.TestContext, foo.Output("lint.sbox.textproto"))
Cole Faust69861aa2023-01-31 15:49:07 -0800257 if !strings.Contains(*sboxProto.Commands[0].Command, "/"+testCase.expected_file) {
Pedro Loureiro18233a22021-06-08 18:11:21 +0000258 t.Error("did not use full api database for case", testCase)
259 }
260 }
Pedro Loureiro18233a22021-06-08 18:11:21 +0000261}