DO NOT MERGE - Add test of fg service notification policy
Bug: 128649910
Bug: 140108616
Test: atest OsHostTests#testForegroundServiceBadNotification
Change-Id: Iec73f1b50e108d0499da2afb06a8d9dd79e7b2cd
Merged-In: Iec73f1b50e108d0499da2afb06a8d9dd79e7b2cd
diff --git a/hostsidetests/os/app/AndroidManifest.xml b/hostsidetests/os/app/AndroidManifest.xml
index fa9d9ae..88791ea 100755
--- a/hostsidetests/os/app/AndroidManifest.xml
+++ b/hostsidetests/os/app/AndroidManifest.xml
@@ -19,9 +19,16 @@
package="android.os.app"
android:targetSandboxVersion="2">
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+
<application>
<activity android:name=".TestNonExported"
android:exported="false" />
+
+ <service android:name=".TestFgService"
+ android:exported="true" />
+
</application>
+
</manifest>
diff --git a/hostsidetests/os/app/src/android/os/app/TestFgService.java b/hostsidetests/os/app/src/android/os/app/TestFgService.java
new file mode 100644
index 0000000..3548105
--- /dev/null
+++ b/hostsidetests/os/app/src/android/os/app/TestFgService.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2019 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.os.app;
+
+import android.app.Notification;
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import android.os.Process;
+import android.util.Log;
+
+public class TestFgService extends Service {
+ private static final String TAG = "TestFgService";
+
+ // intentionally invalid resource configuration
+ private static final int NOTIFICATION_ID = 5038;
+ private static final String CHANNEL = "fgservice";
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ Log.i(TAG, "onStartCommand() called");
+ Notification notification = new Notification.Builder(this, CHANNEL)
+ .setContentTitle("Foreground service")
+ .setContentText("Ongoing test app foreground service is live")
+ .setSmallIcon(NOTIFICATION_ID)
+ .build();
+
+ Log.i(TAG, "TestFgService starting foreground: pid=" + Process.myPid());
+ startForeground(NOTIFICATION_ID, notification);
+
+ return START_NOT_STICKY;
+ }
+}
\ No newline at end of file
diff --git a/hostsidetests/os/src/android/os/cts/OsHostTests.java b/hostsidetests/os/src/android/os/cts/OsHostTests.java
index c557c9e..8e3f5c5 100644
--- a/hostsidetests/os/src/android/os/cts/OsHostTests.java
+++ b/hostsidetests/os/src/android/os/cts/OsHostTests.java
@@ -22,14 +22,17 @@
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.CollectingOutputReceiver;
import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.result.InputStreamSource;
import com.android.tradefed.testtype.DeviceTestCase;
import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.util.AbiUtils;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
+import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
@@ -38,12 +41,19 @@
public class OsHostTests extends DeviceTestCase implements IBuildReceiver, IAbiReceiver {
private static final String TEST_APP_PACKAGE = "android.os.app";
- private static final String TEST_NON_EXPORTED_ACTIVITY_CLASS = "TestNonExported";
+ private static final String TEST_NON_EXPORTED_ACTIVITY_CLASS = "TestNonExported";
private static final String START_NON_EXPORTED_ACTIVITY_COMMAND = String.format(
"am start -n %s/%s.%s",
TEST_APP_PACKAGE, TEST_APP_PACKAGE, TEST_NON_EXPORTED_ACTIVITY_CLASS);
+ private static final String TEST_FG_SERVICE_CLASS = "TestFgService";
+ private static final String START_FG_SERVICE_COMMAND = String.format(
+ "am start-foreground-service -n %s/%s.%s",
+ TEST_APP_PACKAGE, TEST_APP_PACKAGE, TEST_FG_SERVICE_CLASS);
+ private static final String FILTER_FG_SERVICE_REGEXP =
+ "TestFgService starting foreground: pid=([0-9]*)";
+
// Testing the intent filter verification mechanism
private static final String HOST_VERIFICATION_APK = "CtsHostLinkVerificationApp.apk";
private static final String HOST_VERIFICATION_PKG = "com.android.cts.openlinksskeleton";
@@ -104,6 +114,40 @@
}
}
+ /**
+ * Test behavior of malformed Notifications w.r.t. foreground services
+ * @throws Exception
+ */
+ @AppModeFull(reason = "Instant apps may not start foreground services")
+ public void testForegroundServiceBadNotification() throws Exception {
+ final Pattern pattern = Pattern.compile(FILTER_FG_SERVICE_REGEXP);
+
+ mDevice.clearLogcat();
+ mDevice.executeShellCommand(START_FG_SERVICE_COMMAND);
+ Thread.sleep(2500);
+
+ String pid = null;
+ try (InputStreamSource logSource = mDevice.getLogcat()) {
+ InputStreamReader streamReader = new InputStreamReader(logSource.createInputStream());
+ BufferedReader logReader = new BufferedReader(streamReader);
+
+ String line;
+ while ((line = logReader.readLine()) != null) {
+ Matcher matcher = pattern.matcher(line);
+ if (matcher.find()) {
+ pid = matcher.group(1);
+ break;
+ }
+ }
+ }
+ assertTrue("Didn't find test service statement in logcat", pid != null);
+
+ final String procStr = "/proc/" + pid;
+ final String lsOut = mDevice.executeShellCommand("ls -d " + procStr).trim();
+ assertTrue("Looking for nonexistence of service process " + pid,
+ lsOut.contains("No such file"));
+ }
+
public void testIntentFilterHostValidation() throws Exception {
String line = null;
try {