From 9cf77d320c850fc118508b82c845a0e59c5eaf4f Mon Sep 17 00:00:00 2001 From: jeffrey-signal Date: Wed, 7 Jan 2026 17:59:05 -0500 Subject: [PATCH] Fix lint checks. --- .../lint/AlertDialogBuilderDetectorTest.kt | 10 ++++ .../org/signal/lint/CardViewDetectorTest.kt | 3 ++ .../lint/RecipientIdDatabaseDetectorTest.kt | 2 + .../org/signal/lint/SignalLogDetectorTest.kt | 13 +++++ .../lint/ThreadIdDatabaseDetectorTest.kt | 2 + .../signal/lint/VersionCodeDetectorTest.kt | 14 ++++++ .../test/resources/AndroidAlertDialogStub.kt | 13 +++++ .../test/resources/AndroidAnnotationStub.kt | 5 ++ .../src/test/resources/AndroidBuildStub.kt | 14 ++++++ .../src/test/resources/AndroidLogStub.kt | 47 +++++++++++++++++++ 10 files changed, 123 insertions(+) create mode 100644 lintchecks/src/test/resources/AndroidAlertDialogStub.kt create mode 100644 lintchecks/src/test/resources/AndroidAnnotationStub.kt create mode 100644 lintchecks/src/test/resources/AndroidBuildStub.kt create mode 100644 lintchecks/src/test/resources/AndroidLogStub.kt diff --git a/lintchecks/src/test/java/org/signal/lint/AlertDialogBuilderDetectorTest.kt b/lintchecks/src/test/java/org/signal/lint/AlertDialogBuilderDetectorTest.kt index 0e8afce793..c304fc5280 100644 --- a/lintchecks/src/test/java/org/signal/lint/AlertDialogBuilderDetectorTest.kt +++ b/lintchecks/src/test/java/org/signal/lint/AlertDialogBuilderDetectorTest.kt @@ -13,6 +13,7 @@ class AlertDialogBuilderDetectorTest { fun androidAlertDialogBuilderUsed_LogAlertDialogBuilderUsage_1_arg() { TestLintTask.lint() .files( + androidAlertDialogStub, java( """ package foo; @@ -26,6 +27,7 @@ class AlertDialogBuilderDetectorTest { ) ) .issues(AlertDialogBuilderDetector.ALERT_DIALOG_BUILDER_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -49,6 +51,7 @@ class AlertDialogBuilderDetectorTest { fun androidAlertDialogBuilderUsed_LogAlertDialogBuilderUsage_2_arg() { TestLintTask.lint() .files( + androidAlertDialogStub, java( """ package foo; @@ -62,6 +65,7 @@ class AlertDialogBuilderDetectorTest { ) ) .issues(AlertDialogBuilderDetector.ALERT_DIALOG_BUILDER_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -85,6 +89,7 @@ class AlertDialogBuilderDetectorTest { fun androidAlertDialogBuilderUsed_withAssignment_LogAlertDialogBuilderUsage_1_arg() { TestLintTask.lint() .files( + androidAlertDialogStub, java( """ package foo; @@ -99,6 +104,7 @@ class AlertDialogBuilderDetectorTest { ) ) .issues(AlertDialogBuilderDetector.ALERT_DIALOG_BUILDER_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -136,6 +142,7 @@ class AlertDialogBuilderDetectorTest { ) ) .issues(AlertDialogBuilderDetector.ALERT_DIALOG_BUILDER_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -173,6 +180,7 @@ class AlertDialogBuilderDetectorTest { ) ) .issues(AlertDialogBuilderDetector.ALERT_DIALOG_BUILDER_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -211,6 +219,7 @@ class AlertDialogBuilderDetectorTest { ) ) .issues(AlertDialogBuilderDetector.ALERT_DIALOG_BUILDER_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -231,6 +240,7 @@ class AlertDialogBuilderDetectorTest { } companion object { + private val androidAlertDialogStub = kotlin(readResourceAsString("AndroidAlertDialogStub.kt")) private val appCompatAlertDialogStub = kotlin(readResourceAsString("AppCompatAlertDialogStub.kt")) private fun readResourceAsString(@Suppress("SameParameterValue") resourceName: String): String { diff --git a/lintchecks/src/test/java/org/signal/lint/CardViewDetectorTest.kt b/lintchecks/src/test/java/org/signal/lint/CardViewDetectorTest.kt index 1f2a6c0938..3a931b3acd 100644 --- a/lintchecks/src/test/java/org/signal/lint/CardViewDetectorTest.kt +++ b/lintchecks/src/test/java/org/signal/lint/CardViewDetectorTest.kt @@ -27,6 +27,7 @@ class CardViewDetectorTest { ) ) .issues(CardViewDetector.CARD_VIEW_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -64,6 +65,7 @@ class CardViewDetectorTest { ) ) .issues(CardViewDetector.CARD_VIEW_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -102,6 +104,7 @@ class CardViewDetectorTest { ) ) .issues(CardViewDetector.CARD_VIEW_USAGE) + .allowMissingSdk() .run() .expect( """ diff --git a/lintchecks/src/test/java/org/signal/lint/RecipientIdDatabaseDetectorTest.kt b/lintchecks/src/test/java/org/signal/lint/RecipientIdDatabaseDetectorTest.kt index 13a1dfdab4..58b8859006 100644 --- a/lintchecks/src/test/java/org/signal/lint/RecipientIdDatabaseDetectorTest.kt +++ b/lintchecks/src/test/java/org/signal/lint/RecipientIdDatabaseDetectorTest.kt @@ -23,6 +23,7 @@ class RecipientIdDatabaseDetectorTest { ) ) .issues(RecipientIdDatabaseDetector.RECIPIENT_ID_DATABASE_REFERENCE_ISSUE) + .allowMissingSdk() .run() .expect( """ @@ -52,6 +53,7 @@ class RecipientIdDatabaseDetectorTest { ) ) .issues(RecipientIdDatabaseDetector.RECIPIENT_ID_DATABASE_REFERENCE_ISSUE) + .allowMissingSdk() .run() .expectClean() } diff --git a/lintchecks/src/test/java/org/signal/lint/SignalLogDetectorTest.kt b/lintchecks/src/test/java/org/signal/lint/SignalLogDetectorTest.kt index 2cd44dca1a..36ed6e3ce2 100644 --- a/lintchecks/src/test/java/org/signal/lint/SignalLogDetectorTest.kt +++ b/lintchecks/src/test/java/org/signal/lint/SignalLogDetectorTest.kt @@ -14,6 +14,7 @@ class SignalLogDetectorTest { fun androidLogUsed_LogNotSignal_2_args() { TestLintTask.lint() .files( + androidLogStub, java( """ package foo; @@ -27,6 +28,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.LOG_NOT_SIGNAL) + .allowMissingSdk() .run() .expect( """ @@ -50,6 +52,7 @@ class SignalLogDetectorTest { fun androidLogUsed_LogNotSignal_3_args() { TestLintTask.lint() .files( + androidLogStub, java( """ package foo; @@ -63,6 +66,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.LOG_NOT_SIGNAL) + .allowMissingSdk() .run() .expect( """ @@ -100,6 +104,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.LOG_NOT_APP) + .allowMissingSdk() .run() .expect( """ @@ -137,6 +142,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.LOG_NOT_APP) + .allowMissingSdk() .run() .expect( """ @@ -175,6 +181,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.INLINE_TAG) + .allowMissingSdk() .run() .expectClean() } @@ -198,6 +205,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.INLINE_TAG) + .allowMissingSdk() .skipTestModes(TestMode.REORDER_ARGUMENTS) .run() .expectClean() @@ -225,6 +233,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.INLINE_TAG) + .allowMissingSdk() .skipTestModes(TestMode.REORDER_ARGUMENTS) .run() .expectClean() @@ -248,6 +257,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.INLINE_TAG) + .allowMissingSdk() .run() .expect( """ @@ -278,6 +288,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.INLINE_TAG) + .allowMissingSdk() .run() .expect( """ @@ -308,6 +319,7 @@ class SignalLogDetectorTest { ) ) .issues(SignalLogDetector.LOG_NOT_SIGNAL) + .allowMissingSdk() .run() .expect( """ @@ -328,6 +340,7 @@ class SignalLogDetectorTest { } companion object { + private val androidLogStub = kotlin(readResourceAsString("AndroidLogStub.kt")) private val serviceLogStub = kotlin(readResourceAsString("ServiceLogStub.kt")) private val appLogStub = kotlin(readResourceAsString("AppLogStub.kt")) private val glideLogStub = kotlin(readResourceAsString("GlideLogStub.kt")) diff --git a/lintchecks/src/test/java/org/signal/lint/ThreadIdDatabaseDetectorTest.kt b/lintchecks/src/test/java/org/signal/lint/ThreadIdDatabaseDetectorTest.kt index 43e7915b02..a57137d64f 100644 --- a/lintchecks/src/test/java/org/signal/lint/ThreadIdDatabaseDetectorTest.kt +++ b/lintchecks/src/test/java/org/signal/lint/ThreadIdDatabaseDetectorTest.kt @@ -23,6 +23,7 @@ class ThreadIdDatabaseDetectorTest { ) ) .issues(ThreadIdDatabaseDetector.THREAD_ID_DATABASE_REFERENCE_ISSUE) + .allowMissingSdk() .run() .expect( """ @@ -52,6 +53,7 @@ class ThreadIdDatabaseDetectorTest { ) ) .issues(ThreadIdDatabaseDetector.THREAD_ID_DATABASE_REFERENCE_ISSUE) + .allowMissingSdk() .run() .expectClean() } diff --git a/lintchecks/src/test/java/org/signal/lint/VersionCodeDetectorTest.kt b/lintchecks/src/test/java/org/signal/lint/VersionCodeDetectorTest.kt index 83f2ac5c96..e7b3fe2de1 100644 --- a/lintchecks/src/test/java/org/signal/lint/VersionCodeDetectorTest.kt +++ b/lintchecks/src/test/java/org/signal/lint/VersionCodeDetectorTest.kt @@ -13,6 +13,7 @@ class VersionCodeDetectorTest { fun version_code_constant_referenced_in_code() { TestLintTask.lint() .files( + androidBuildStub, java( """ package foo; @@ -28,6 +29,7 @@ class VersionCodeDetectorTest { ) ) .issues(VersionCodeDetector.VERSION_CODE_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -51,6 +53,7 @@ class VersionCodeDetectorTest { fun numeric_value_referenced_in_code() { TestLintTask.lint() .files( + androidBuildStub, java( """ package foo; @@ -66,6 +69,7 @@ class VersionCodeDetectorTest { ) ) .issues(VersionCodeDetector.VERSION_CODE_USAGE) + .allowMissingSdk() .run() .expectClean() } @@ -74,6 +78,7 @@ class VersionCodeDetectorTest { fun non_version_code_constant_referenced_in_code() { TestLintTask.lint() .files( + androidBuildStub, java( """ package foo; @@ -90,6 +95,7 @@ class VersionCodeDetectorTest { ) ) .issues(VersionCodeDetector.VERSION_CODE_USAGE) + .allowMissingSdk() .run() .expectClean() } @@ -98,6 +104,8 @@ class VersionCodeDetectorTest { fun version_code_constant_referenced_in_TargetApi_attribute_and_inner_class_import() { TestLintTask.lint() .files( + androidBuildStub, + androidAnnotationStub, java( """ package foo; @@ -112,6 +120,7 @@ class VersionCodeDetectorTest { ) ) .issues(VersionCodeDetector.VERSION_CODE_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -135,6 +144,8 @@ class VersionCodeDetectorTest { fun version_code_constant_referenced_in_RequiresApi_attribute_with_named_parameter() { TestLintTask.lint() .files( + androidBuildStub, + androidAnnotationStub, requiresApiStub, java( """ @@ -150,6 +161,7 @@ class VersionCodeDetectorTest { ) ) .issues(VersionCodeDetector.VERSION_CODE_USAGE) + .allowMissingSdk() .run() .expect( """ @@ -170,6 +182,8 @@ class VersionCodeDetectorTest { } companion object { + private val androidBuildStub = kotlin(readResourceAsString("AndroidBuildStub.kt")) + private val androidAnnotationStub = kotlin(readResourceAsString("AndroidAnnotationStub.kt")) private val requiresApiStub = kotlin(readResourceAsString("RequiresApiStub.kt")) private fun readResourceAsString(@Suppress("SameParameterValue") resourceName: String): String { diff --git a/lintchecks/src/test/resources/AndroidAlertDialogStub.kt b/lintchecks/src/test/resources/AndroidAlertDialogStub.kt new file mode 100644 index 0000000000..d8c0e29ba9 --- /dev/null +++ b/lintchecks/src/test/resources/AndroidAlertDialogStub.kt @@ -0,0 +1,13 @@ +package android.app + +class AlertDialog { + class Builder { + constructor(context: Context?) + constructor(context: Context?, themeOverrideId: Int) + fun show(): AlertDialog? { + return null + } + } +} + +class Context diff --git a/lintchecks/src/test/resources/AndroidAnnotationStub.kt b/lintchecks/src/test/resources/AndroidAnnotationStub.kt new file mode 100644 index 0000000000..1435244033 --- /dev/null +++ b/lintchecks/src/test/resources/AndroidAnnotationStub.kt @@ -0,0 +1,5 @@ +package android.annotation + +annotation class TargetApi(val value: Int) + +annotation class RequiresApi(val app: Int = 1) diff --git a/lintchecks/src/test/resources/AndroidBuildStub.kt b/lintchecks/src/test/resources/AndroidBuildStub.kt new file mode 100644 index 0000000000..5cd4b8f2c1 --- /dev/null +++ b/lintchecks/src/test/resources/AndroidBuildStub.kt @@ -0,0 +1,14 @@ +package android.os + +class Build { + object VERSION { + const val SDK_INT = 0 + } + + object VERSION_CODES { + const val LOLLIPOP = 21 + const val LOLLIPOP_MR1 = 22 + const val M = 23 + const val N = 24 + } +} diff --git a/lintchecks/src/test/resources/AndroidLogStub.kt b/lintchecks/src/test/resources/AndroidLogStub.kt new file mode 100644 index 0000000000..b81e9ef9a2 --- /dev/null +++ b/lintchecks/src/test/resources/AndroidLogStub.kt @@ -0,0 +1,47 @@ +package android.util + +object Log { + fun v(tag: String?, msg: String?): Int { + return 0 + } + + fun v(tag: String?, msg: String?, tr: Throwable?): Int { + return 0 + } + + fun d(tag: String?, msg: String?): Int { + return 0 + } + + fun d(tag: String?, msg: String?, tr: Throwable?): Int { + return 0 + } + + fun i(tag: String?, msg: String?): Int { + return 0 + } + + fun i(tag: String?, msg: String?, tr: Throwable?): Int { + return 0 + } + + fun w(tag: String?, msg: String?): Int { + return 0 + } + + fun w(tag: String?, msg: String?, tr: Throwable?): Int { + return 0 + } + + fun w(tag: String?, tr: Throwable?): Int { + return 0 + } + + fun e(tag: String?, msg: String?): Int { + return 0 + } + + fun e(tag: String?, msg: String?, tr: Throwable?): Int { + return 0 + } +}