Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 805815a1 authored by Peter Kalauskas's avatar Peter Kalauskas
Browse files

Move API lint stubs to common class

Additionally,

 - Move linters to new directory to match package name. This allows the
   tests to be run at the package level in Android Studio.

 - Use @Suppress("UnstableApiUsage") for all linter classes

 - Add missing copyright headers

Test: manual
Bug: 238923086
Change-Id: I1ee616a34e6e16586847c3a68f751efe40d7f565
parent bc62749f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.tools.lint.detector.api.SourceCodeScanner
import com.intellij.psi.PsiMethod
import org.jetbrains.uast.UCallExpression

@Suppress("UnstableApiUsage")
class RegisterReceiverViaContextDetector : Detector(), SourceCodeScanner {

    override fun getApplicableMethodNames(): List<String> {
+154 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.android.internal.systemui.lint

import com.android.tools.lint.checks.infrastructure.LintDetectorTest.java

/*
 * This file contains stubs of framework APIs and System UI classes for testing purposes only. The
 * stubs are not used in the lint detectors themselves.
 */
@Suppress("UnstableApiUsage")
internal val androidStubs =
    arrayOf(
        java(
            """
package android.app;

public class ActivityManager {
    public static int getCurrentUser() {}
}
"""
        ),
        java(
            """
package android.os;
import android.content.pm.UserInfo;
import android.annotation.UserIdInt;

public class UserManager {
    public UserInfo getUserInfo(@UserIdInt int userId) {}
}
"""
        ),
        java("""
package android.annotation;

public @interface UserIdInt {}
"""),
        java("""
package android.content.pm;

public class UserInfo {}
"""),
        java("""
package android.os;

public class Looper {}
"""),
        java("""
package android.os;

public class Handler {}
"""),
        java("""
package android.content;

public class ServiceConnection {}
"""),
        java("""
package android.os;

public enum UserHandle {
    ALL
}
"""),
        java(
            """
package android.content;
import android.os.UserHandle;
import android.os.Handler;
import android.os.Looper;
import java.util.concurrent.Executor;

public class Context {
    public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {}
    public void registerReceiverAsUser(
            BroadcastReceiver receiver, UserHandle user, IntentFilter filter,
            String broadcastPermission, Handler scheduler) {}
    public void registerReceiverForAllUsers(
            BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission,
            Handler scheduler) {}
    public void sendBroadcast(Intent intent) {}
    public void sendBroadcast(Intent intent, String receiverPermission) {}
    public void sendBroadcastAsUser(Intent intent, UserHandle userHandle, String permission) {}
    public void bindService(Intent intent) {}
    public void bindServiceAsUser(
            Intent intent, ServiceConnection connection, int flags, UserHandle userHandle) {}
    public void unbindService(ServiceConnection connection) {}
    public Looper getMainLooper() { return null; }
    public Executor getMainExecutor() { return null; }
    public Handler getMainThreadHandler() { return null; }
}
"""
        ),
        java(
            """
package android.app;
import android.content.Context;

public class Activity extends Context {}
"""
        ),
        java(
            """
package android.graphics;

public class Bitmap {
    public enum Config {
        ARGB_8888,
        RGB_565,
        HARDWARE
    }
    public static Bitmap createBitmap(int width, int height, Config config) {
        return null;
    }
}
"""
        ),
        java("""
package android.content;

public class BroadcastReceiver {}
"""),
        java("""
package android.content;

public class IntentFilter {}
"""),
        java(
            """
package com.android.systemui.settings;
import android.content.pm.UserInfo;

public interface UserTracker {
    int getUserId();
    UserInfo getUserInfo();
}
"""
        ),
    )
+33 −57
Original line number Diff line number Diff line
@@ -17,26 +17,26 @@
package com.android.internal.systemui.lint

import com.android.tools.lint.checks.infrastructure.LintDetectorTest
import com.android.tools.lint.checks.infrastructure.TestFile
import com.android.tools.lint.checks.infrastructure.TestFiles
import com.android.tools.lint.checks.infrastructure.TestLintTask
import com.android.tools.lint.detector.api.Detector
import com.android.tools.lint.detector.api.Issue
import org.junit.Test

@Suppress("UnstableApiUsage")
class BindServiceViaContextDetectorTest : LintDetectorTest() {

    override fun getDetector(): Detector = BindServiceViaContextDetector()
    override fun lint(): TestLintTask = super.lint().allowMissingSdk(true)

    override fun getIssues(): List<Issue> = listOf(
            BindServiceViaContextDetector.ISSUE)
    override fun getIssues(): List<Issue> = listOf(BindServiceViaContextDetector.ISSUE)

    private val explanation = "Binding or unbinding services are synchronous calls"

    @Test
    fun testBindService() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -49,8 +49,10 @@ class BindServiceViaContextDetectorTest : LintDetectorTest() {
                        }
                    }
                """
                ).indented(),
                *stubs)
                    )
                    .indented(),
                *stubs
            )
            .issues(BindServiceViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
@@ -59,7 +61,8 @@ class BindServiceViaContextDetectorTest : LintDetectorTest() {

    @Test
    fun testBindServiceAsUser() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -73,8 +76,10 @@ class BindServiceViaContextDetectorTest : LintDetectorTest() {
                        }
                    }
                """
                ).indented(),
                *stubs)
                    )
                    .indented(),
                *stubs
            )
            .issues(BindServiceViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
@@ -83,7 +88,8 @@ class BindServiceViaContextDetectorTest : LintDetectorTest() {

    @Test
    fun testUnbindService() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -96,45 +102,15 @@ class BindServiceViaContextDetectorTest : LintDetectorTest() {
                        }
                    }
                """
                ).indented(),
                *stubs)
                    )
                    .indented(),
                *stubs
            )
            .issues(BindServiceViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
            .expectContains(explanation)
    }

    private val contextStub: TestFile = java(
            """
        package android.content;
        import android.os.UserHandle;

        public class Context {
            public void bindService(Intent intent) {};
            public void bindServiceAsUser(Intent intent, ServiceConnection connection, int flags,
                                          UserHandle userHandle) {};
            public void unbindService(ServiceConnection connection) {};
        }
        """
    )

    private val serviceConnectionStub: TestFile = java(
            """
        package android.content;

        public class ServiceConnection {}
        """
    )

    private val userHandleStub: TestFile = java(
            """
        package android.os;

        public enum UserHandle {
            ALL
        }
        """
    )

    private val stubs = arrayOf(contextStub, serviceConnectionStub, userHandleStub)
    private val stubs = androidStubs
}
+64 −63
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.android.internal.systemui.lint

import com.android.tools.lint.checks.infrastructure.LintDetectorTest
import com.android.tools.lint.checks.infrastructure.TestFiles
import com.android.tools.lint.checks.infrastructure.TestFile
import com.android.tools.lint.checks.infrastructure.TestLintTask
import com.android.tools.lint.detector.api.Detector
import com.android.tools.lint.detector.api.Issue
import org.junit.Test

@Suppress("UnstableApiUsage")
class BroadcastSentViaContextDetectorTest : LintDetectorTest() {

    override fun getDetector(): Detector = BroadcastSentViaContextDetector()
    override fun lint(): TestLintTask = super.lint().allowMissingSdk(true)

    override fun getIssues(): List<Issue> = listOf(
        BroadcastSentViaContextDetector.ISSUE)
    override fun getIssues(): List<Issue> = listOf(BroadcastSentViaContextDetector.ISSUE)

    @Test
    fun testSendBroadcast() {
        lint().files(
        println(stubs.size)
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -31,19 +48,23 @@ class BroadcastSentViaContextDetectorTest : LintDetectorTest() {
                        }
                    }
                """
                ).indented(),
                *stubs)
                    )
                    .indented(),
                *stubs
            )
            .issues(BroadcastSentViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
            .expectContains(
                "Please don't call sendBroadcast/sendBroadcastAsUser directly on " +
                    "Context, use com.android.systemui.broadcast.BroadcastSender instead.")
                    "Context, use com.android.systemui.broadcast.BroadcastSender instead."
            )
    }

    @Test
    fun testSendBroadcastAsUser() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -56,19 +77,24 @@ class BroadcastSentViaContextDetectorTest : LintDetectorTest() {
                          context.sendBroadcastAsUser(intent, UserHandle.ALL, "permission");
                        }
                    }
                """).indented(),
                *stubs)
                """
                    )
                    .indented(),
                *stubs
            )
            .issues(BroadcastSentViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
            .expectContains(
                "Please don't call sendBroadcast/sendBroadcastAsUser directly on " +
                    "Context, use com.android.systemui.broadcast.BroadcastSender instead.")
                    "Context, use com.android.systemui.broadcast.BroadcastSender instead."
            )
    }

    @Test
    fun testSendBroadcastInActivity() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -82,19 +108,24 @@ class BroadcastSentViaContextDetectorTest : LintDetectorTest() {
                        }

                    }
                """).indented(),
                *stubs)
                """
                    )
                    .indented(),
                *stubs
            )
            .issues(BroadcastSentViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
            .expectContains(
                "Please don't call sendBroadcast/sendBroadcastAsUser directly on " +
                    "Context, use com.android.systemui.broadcast.BroadcastSender instead.")
                    "Context, use com.android.systemui.broadcast.BroadcastSender instead."
            )
    }

    @Test
    fun testNoopIfNoCall() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -106,45 +137,15 @@ class BroadcastSentViaContextDetectorTest : LintDetectorTest() {
                          context.startActivity(intent);
                        }
                    }
                """).indented(),
                *stubs)
            .issues(BroadcastSentViaContextDetector.ISSUE)
            .run()
            .expectClean()
    }

    private val contextStub: TestFile = java(
        """
        package android.content;
        import android.os.UserHandle;

        public class Context {
            public void sendBroadcast(Intent intent) {};
            public void sendBroadcast(Intent intent, String receiverPermission) {};
            public void sendBroadcastAsUser(Intent intent, UserHandle userHandle,
                                                String permission) {};
        }
                """
                    )

    private val activityStub: TestFile = java(
        """
        package android.app;
        import android.content.Context;

        public class Activity extends Context {}
        """
                    .indented(),
                *stubs
            )

    private val userHandleStub: TestFile = java(
        """
        package android.os;

        public enum UserHandle {
            ALL
            .issues(BroadcastSentViaContextDetector.ISSUE)
            .run()
            .expectClean()
    }
        """
    )

    private val stubs = arrayOf(contextStub, activityStub, userHandleStub)
    private val stubs = androidStubs
}
+32 −52
Original line number Diff line number Diff line
@@ -17,13 +17,13 @@
package com.android.internal.systemui.lint

import com.android.tools.lint.checks.infrastructure.LintDetectorTest
import com.android.tools.lint.checks.infrastructure.TestFile
import com.android.tools.lint.checks.infrastructure.TestFiles
import com.android.tools.lint.checks.infrastructure.TestLintTask
import com.android.tools.lint.detector.api.Detector
import com.android.tools.lint.detector.api.Issue
import org.junit.Test

@Suppress("UnstableApiUsage")
class GetMainLooperViaContextDetectorTest : LintDetectorTest() {

    override fun getDetector(): Detector = GetMainLooperViaContextDetector()
@@ -35,7 +35,8 @@ class GetMainLooperViaContextDetectorTest : LintDetectorTest() {

    @Test
    fun testGetMainThreadHandler() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -48,8 +49,10 @@ class GetMainLooperViaContextDetectorTest : LintDetectorTest() {
                        }
                    }
                """
                ).indented(),
                *stubs)
                    )
                    .indented(),
                *stubs
            )
            .issues(GetMainLooperViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
@@ -58,7 +61,8 @@ class GetMainLooperViaContextDetectorTest : LintDetectorTest() {

    @Test
    fun testGetMainLooper() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -71,8 +75,10 @@ class GetMainLooperViaContextDetectorTest : LintDetectorTest() {
                        }
                    }
                """
                ).indented(),
                *stubs)
                    )
                    .indented(),
                *stubs
            )
            .issues(GetMainLooperViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
@@ -81,7 +87,8 @@ class GetMainLooperViaContextDetectorTest : LintDetectorTest() {

    @Test
    fun testGetMainExecutor() {
        lint().files(
        lint()
            .files(
                TestFiles.java(
                        """
                    package test.pkg;
@@ -94,42 +101,15 @@ class GetMainLooperViaContextDetectorTest : LintDetectorTest() {
                        }
                    }
                """
                ).indented(),
                *stubs)
                    )
                    .indented(),
                *stubs
            )
            .issues(GetMainLooperViaContextDetector.ISSUE)
            .run()
            .expectWarningCount(1)
            .expectContains(explanation)
    }

    private val contextStub: TestFile = java(
            """
        package android.content;
        import android.os.Handler;import android.os.Looper;import java.util.concurrent.Executor;

        public class Context {
            public Looper getMainLooper() { return null; };
            public Executor getMainExecutor() { return null; };
            public Handler getMainThreadHandler() { return null; };
        }
        """
    )

    private val looperStub: TestFile = java(
            """
        package android.os;

        public class Looper {}
        """
    )

    private val handlerStub: TestFile = java(
            """
        package android.os;

        public class Handler {}
        """
    )

    private val stubs = arrayOf(contextStub, looperStub, handlerStub)
    private val stubs = androidStubs
}
Loading