diff --git a/tools/lint/global/integration_tests/Android.bp b/tools/lint/global/integration_tests/Android.bp index ca96559ac016e292c1f14f2c1375c642a05581dc..40281d263a4c7060052d72b576ff57c6e28e38d3 100644 --- a/tools/lint/global/integration_tests/Android.bp +++ b/tools/lint/global/integration_tests/Android.bp @@ -12,25 +12,58 @@ // See the License for the specific language governing permissions and // limitations under the License. -java_library { - name: "AndroidGlobalLintTestNoAidl", - srcs: ["TestNoAidl/**/*.java"], +// Integration tests for @EnforcePermission linters. +// Each test defines its own java_library. The XML lint report from this +// java_library is wrapped under a Python library with a unique pkg_path (this +// is to avoid a name conflict for the report file). All the tests are +// referenced and executed by AndroidGlobalLintCheckerIntegrationTest. + +java_defaults { + name: "AndroidGlobalLintIntegrationTestDefault", libs: [ "framework-annotations-lib", ], lint: { - // It is expected that lint returns an error when processing this + // It is expected that lint returns an error when processing the // library. Silence it here, the lint output is verified in tests.py. suppress_exit_code: true, }, } +java_library { + name: "AndroidGlobalLintTestNoAidl", + srcs: ["TestNoAidl/**/*.java"], + defaults: ["AndroidGlobalLintIntegrationTestDefault"], +} + +python_library_host { + name: "AndroidGlobalLintTestNoAidl_py", + data: [":AndroidGlobalLintTestNoAidl{.lint}"], + pkg_path: "no_aidl", +} + +java_library { + name: "AndroidGlobalLintTestMissingAnnotation", + srcs: [ + "TestMissingAnnotation/**/*.java", + "TestMissingAnnotation/**/*.aidl", + ], + defaults: ["AndroidGlobalLintIntegrationTestDefault"], +} + +python_library_host { + name: "AndroidGlobalLintTestMissingAnnotation_py", + data: [":AndroidGlobalLintTestMissingAnnotation{.lint}"], + pkg_path: "missing_annotation", +} + python_test_host { name: "AndroidGlobalLintCheckerIntegrationTest", srcs: ["tests.py"], main: "tests.py", - data: [ - ":AndroidGlobalLintTestNoAidl{.lint}", + libs: [ + "AndroidGlobalLintTestNoAidl_py", + "AndroidGlobalLintTestMissingAnnotation_py", ], version: { py3: { diff --git a/tools/lint/global/integration_tests/TestMissingAnnotation/TestMissingAnnotation.java b/tools/lint/global/integration_tests/TestMissingAnnotation/TestMissingAnnotation.java new file mode 100644 index 0000000000000000000000000000000000000000..9e4854c61f966a8ad8f4eb13665665166a4b624c --- /dev/null +++ b/tools/lint/global/integration_tests/TestMissingAnnotation/TestMissingAnnotation.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.lint.integration_tests; + +/** + * A class that implements an AIDL interface, but is missing the @EnforcePermission annotation. + */ +class TestMissingAnnotation extends IFoo.Stub { + + @Override + public void Method() { + } + +} diff --git a/tools/lint/global/integration_tests/TestMissingAnnotation/com/google/android/lint/integration_tests/IFoo.aidl b/tools/lint/global/integration_tests/TestMissingAnnotation/com/google/android/lint/integration_tests/IFoo.aidl new file mode 100644 index 0000000000000000000000000000000000000000..95ec2c230599ead4882f9ab127b663fbcebee805 --- /dev/null +++ b/tools/lint/global/integration_tests/TestMissingAnnotation/com/google/android/lint/integration_tests/IFoo.aidl @@ -0,0 +1,7 @@ +package com.google.android.lint.integration_tests; + +interface IFoo { + + @EnforcePermission("INTERNET") + void Method(); +} diff --git a/tools/lint/global/integration_tests/tests.py b/tools/lint/global/integration_tests/tests.py index fc3eeb4f8ed928357c49bcd2502811f262a3075c..cdb16b8ba25fd723d6b5f9eb64f50d9138949594 100644 --- a/tools/lint/global/integration_tests/tests.py +++ b/tools/lint/global/integration_tests/tests.py @@ -19,16 +19,28 @@ import xml.etree.ElementTree class TestLinterReports(unittest.TestCase): """Integration tests for the linters used by @EnforcePermission.""" - def test_no_aidl(self): - report = pkgutil.get_data("lint", "lint-report.xml").decode() + def _read_report(self, pkg_path): + report = pkgutil.get_data(pkg_path, "lint/lint-report.xml").decode() issues = xml.etree.ElementTree.fromstring(report) self.assertEqual(issues.tag, "issues") + return issues + + def test_no_aidl(self): + issues = self._read_report("no_aidl") self.assertEqual(len(issues), 1) issue = issues[0] self.assertEqual(issue.attrib["id"], "MisusingEnforcePermissionAnnotation") self.assertEqual(issue.attrib["severity"], "Error") + def test_missing_annotation(self): + issues = self._read_report("missing_annotation") + self.assertEqual(len(issues), 1) + + issue = issues[0] + self.assertEqual(issue.attrib["id"], "MissingEnforcePermissionAnnotation") + self.assertEqual(issue.attrib["severity"], "Error") + if __name__ == '__main__': unittest.main(verbosity=2)