summaryrefslogtreecommitdiff
path: root/errorprone/tests
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2021-04-20 12:30:37 -0600
committerJeff Sharkey <jsharkey@android.com>2021-04-21 12:59:38 -0600
commitf459828358a7079d1e3bc67bb39d5d0c8be3e02c (patch)
tree200e96548fff5eb8a6433c09da67f168ff420bbd /errorprone/tests
parent1eb043a982c864ea83081cca500cf948c1cb05ff (diff)
Annotations for Bluetooth broadcast intents.
Recent work has been using Error Prone rules and annotations to reflect the current state of permission enforcement across the Bluetooth stack, and we're now in a position were we can add new permission enforcement that had been missing. We've currently standardized on saying that APIs that return device or Bluetooth state information (without sharing details about any particular remote Bluetooth device) do not need to be permission protected. Bug: 183626724 Test: ./build/soong/soong_ui.bash --make-mode Bluetooth RUN_ERROR_PRONE=true Change-Id: I53ac7a4fe1dea57316048c3cac4fa237b6ba3d38
Diffstat (limited to 'errorprone/tests')
-rw-r--r--errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java4
-rw-r--r--errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java93
-rw-r--r--errorprone/tests/res/android/annotation/SdkConstant.java36
-rw-r--r--errorprone/tests/res/android/content/Context.java15
-rw-r--r--errorprone/tests/res/android/content/Intent.java7
5 files changed, 154 insertions, 1 deletions
diff --git a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java
index c8772306a59b..1679bb6abf9b 100644
--- a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java
+++ b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/ContextUserIdCheckerTest.java
@@ -38,6 +38,7 @@ public class ContextUserIdCheckerTest {
compilationHelper
.addSourceFile("/android/annotation/SystemService.java")
.addSourceFile("/android/content/Context.java")
+ .addSourceFile("/android/content/Intent.java")
.addSourceFile("/android/foo/IFooService.java")
.addSourceFile("/android/os/IInterface.java")
.addSourceFile("/android/os/RemoteException.java")
@@ -68,6 +69,7 @@ public class ContextUserIdCheckerTest {
compilationHelper
.addSourceFile("/android/annotation/SystemService.java")
.addSourceFile("/android/content/Context.java")
+ .addSourceFile("/android/content/Intent.java")
.addSourceFile("/android/foo/IFooService.java")
.addSourceFile("/android/os/IInterface.java")
.addSourceFile("/android/os/UserHandle.java")
@@ -98,6 +100,7 @@ public class ContextUserIdCheckerTest {
compilationHelper
.addSourceFile("/android/annotation/SystemService.java")
.addSourceFile("/android/content/Context.java")
+ .addSourceFile("/android/content/Intent.java")
.addSourceFile("/android/foo/IFooService.java")
.addSourceFile("/android/os/IInterface.java")
.addSourceFile("/android/os/UserHandle.java")
@@ -124,6 +127,7 @@ public class ContextUserIdCheckerTest {
compilationHelper
.addSourceFile("/android/annotation/SystemService.java")
.addSourceFile("/android/content/Context.java")
+ .addSourceFile("/android/content/Intent.java")
.addSourceFile("/android/foo/IFooService.java")
.addSourceFile("/android/os/IInterface.java")
.addSourceFile("/android/os/UserHandle.java")
diff --git a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java
index 771258d7d265..388988e5e9bd 100644
--- a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java
+++ b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java
@@ -81,6 +81,7 @@ public class RequiresPermissionCheckerTest {
compilationHelper
.addSourceFile("/android/annotation/RequiresPermission.java")
.addSourceFile("/android/content/Context.java")
+ .addSourceFile("/android/content/Intent.java")
.addSourceLines("ColorManager.java",
"import android.annotation.RequiresPermission;",
"import android.content.Context;",
@@ -139,6 +140,7 @@ public class RequiresPermissionCheckerTest {
compilationHelper
.addSourceFile("/android/annotation/RequiresPermission.java")
.addSourceFile("/android/content/Context.java")
+ .addSourceFile("/android/content/Intent.java")
.addSourceFile("/android/foo/IColorService.java")
.addSourceFile("/android/os/IInterface.java")
.addSourceLines("ColorService.java",
@@ -322,4 +324,95 @@ public class RequiresPermissionCheckerTest {
"}")
.doTest();
}
+
+ @Test
+ public void testSendBroadcast() {
+ compilationHelper
+ .addSourceFile("/android/annotation/RequiresPermission.java")
+ .addSourceFile("/android/annotation/SdkConstant.java")
+ .addSourceFile("/android/content/Context.java")
+ .addSourceFile("/android/content/Intent.java")
+ .addSourceLines("FooManager.java",
+ "import android.annotation.RequiresPermission;",
+ "import android.annotation.SdkConstant;",
+ "import android.content.Context;",
+ "import android.content.Intent;",
+ "public class FooManager {",
+ " private static final String PERMISSION_RED = \"red\";",
+ " private static final String PERMISSION_BLUE = \"blue\";",
+ " @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)",
+ " private static final String ACTION_NONE = \"none\";",
+ " @RequiresPermission(PERMISSION_RED)",
+ " @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)",
+ " private static final String ACTION_RED = \"red\";",
+ " @RequiresPermission(allOf={PERMISSION_RED,PERMISSION_BLUE})",
+ " @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)",
+ " private static final String ACTION_RED_BLUE = \"red_blue\";",
+ " public void exampleNone(Context context) {",
+ " Intent intent = new Intent(ACTION_NONE);",
+ " context.sendBroadcast(intent);",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcast(intent, PERMISSION_RED);",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcastWithMultiplePermissions(intent,",
+ " new String[] { PERMISSION_RED });",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcastWithMultiplePermissions(intent,",
+ " new String[] { PERMISSION_RED, PERMISSION_BLUE });",
+ " }",
+ " public void exampleRed(Context context) {",
+ " Intent intent = new Intent(FooManager.ACTION_RED);",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcast(intent);",
+ " context.sendBroadcast(intent, FooManager.PERMISSION_RED);",
+ " context.sendBroadcastWithMultiplePermissions(intent,",
+ " new String[] { FooManager.PERMISSION_RED });",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcastWithMultiplePermissions(intent,",
+ " new String[] { FooManager.PERMISSION_RED, PERMISSION_BLUE });",
+ " }",
+ " public void exampleRedBlue(Context context) {",
+ " Intent intent = new Intent(ACTION_RED_BLUE);",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcast(intent);",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcast(intent, PERMISSION_RED);",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcastWithMultiplePermissions(intent,",
+ " new String[] { PERMISSION_RED });",
+ " context.sendBroadcastWithMultiplePermissions(intent,",
+ " new String[] { PERMISSION_RED, PERMISSION_BLUE });",
+ " }",
+ " public void exampleUnknown(Context context, Intent intent) {",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcast(intent);",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcast(intent, PERMISSION_RED);",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcastWithMultiplePermissions(intent,",
+ " new String[] { PERMISSION_RED });",
+ " // BUG: Diagnostic contains:",
+ " context.sendBroadcastWithMultiplePermissions(intent,",
+ " new String[] { PERMISSION_RED, PERMISSION_BLUE });",
+ " }",
+ " public void exampleReuse(Context context) {",
+ " Intent intent = new Intent(ACTION_RED);",
+ " context.sendBroadcast(intent, PERMISSION_RED);",
+ " intent = new Intent(ACTION_NONE);",
+ " context.sendBroadcast(intent);",
+ " intent.setAction(ACTION_RED);",
+ " context.sendBroadcast(intent, PERMISSION_RED);",
+ " }",
+ " public void exampleScoped(Context context) {",
+ " if (true) {",
+ " Intent intent = new Intent(ACTION_RED);",
+ " context.sendBroadcast(intent, PERMISSION_RED);",
+ " } else {",
+ " Intent intent = new Intent(ACTION_NONE);",
+ " context.sendBroadcast(intent);",
+ " }",
+ " }",
+ "}")
+ .doTest();
+ }
}
diff --git a/errorprone/tests/res/android/annotation/SdkConstant.java b/errorprone/tests/res/android/annotation/SdkConstant.java
new file mode 100644
index 000000000000..0a5318609847
--- /dev/null
+++ b/errorprone/tests/res/android/annotation/SdkConstant.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 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 android.annotation;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Indicates a constant field value should be exported to be used in the SDK tools.
+ * @hide
+ */
+@Target({ ElementType.FIELD })
+@Retention(RetentionPolicy.SOURCE)
+public @interface SdkConstant {
+ public static enum SdkConstantType {
+ ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE;
+ }
+
+ SdkConstantType value();
+}
diff --git a/errorprone/tests/res/android/content/Context.java b/errorprone/tests/res/android/content/Context.java
index 323b8dd46e8f..efc4fb122435 100644
--- a/errorprone/tests/res/android/content/Context.java
+++ b/errorprone/tests/res/android/content/Context.java
@@ -18,9 +18,22 @@ package android.content;
public class Context {
public int getUserId() {
- return 0;
+ throw new UnsupportedOperationException();
}
public void enforceCallingOrSelfPermission(String permission, String message) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void sendBroadcast(Intent intent) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void sendBroadcast(Intent intent, String receiverPermission) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void sendBroadcastWithMultiplePermissions(Intent intent, String[] receiverPermissions) {
+ throw new UnsupportedOperationException();
}
}
diff --git a/errorprone/tests/res/android/content/Intent.java b/errorprone/tests/res/android/content/Intent.java
index 9d22d04b8cb8..288396e60577 100644
--- a/errorprone/tests/res/android/content/Intent.java
+++ b/errorprone/tests/res/android/content/Intent.java
@@ -17,4 +17,11 @@
package android.content;
public class Intent {
+ public Intent(String action) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Intent setAction(String action) {
+ throw new UnsupportedOperationException();
+ }
}