summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Joanne Chung <joannechung@google.com> 2023-06-20 12:25:35 +0000
committer Joanne Chung <joannechung@google.com> 2023-06-27 15:53:45 +0000
commit30e18b395f2774735dcfeb95cd8058724ec4cc95 (patch)
tree3aff27401c997360feaa22803af566017498ee02
parentafd043c8bd8f3da0409c920a4a77e04fc7f99168 (diff)
Add unit tests for PackageMonitor
Bug: 29385425 Test: atest PackageMonitorTest Change-Id: Ia5c2c5ef2cdf4e29346ac6ec5f6545a3a15fd298
-rw-r--r--core/java/com/android/internal/content/PackageMonitor.java8
-rw-r--r--core/tests/coretests/src/com/android/internal/content/PackageMonitorTest.java350
2 files changed, 357 insertions, 1 deletions
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index 2b2cda564438..d78689e9955b 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -34,6 +34,7 @@ import android.os.UserHandle;
import android.util.Log;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import java.util.Objects;
@@ -348,7 +349,12 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
doHandlePackageEvent(intent);
}
- private void doHandlePackageEvent(Intent intent) {
+ /**
+ * Handle the package related event
+ * @param intent the intent that contains package related event information
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ public void doHandlePackageEvent(Intent intent) {
mChangeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
UserHandle.USER_NULL);
if (mChangeUserId == UserHandle.USER_NULL) {
diff --git a/core/tests/coretests/src/com/android/internal/content/PackageMonitorTest.java b/core/tests/coretests/src/com/android/internal/content/PackageMonitorTest.java
new file mode 100644
index 000000000000..5290478dfbd3
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/content/PackageMonitorTest.java
@@ -0,0 +1,350 @@
+/*
+ * 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.android.internal.content;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.UserHandle;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * A unit test for PackageMonitor implementation.
+ */
+@RunWith(AndroidJUnit4.class)
+public class PackageMonitorTest {
+
+ private static final String FAKE_PACKAGE_NAME = "com.android.internal.content.fakeapp";
+ private static final int FAKE_PACKAGE_UID = 123;
+ private static final int FAKE_USER_ID = 0;
+
+ @Mock
+ Context mMockContext;
+ @Mock
+ Handler mMockHandler;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testPackageMonitorMultipleRegisterThrowsException() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ spyPackageMonitor.register(mMockContext, UserHandle.ALL, false /* externalStorage */,
+ mMockHandler);
+ assertThat(spyPackageMonitor.getRegisteredHandler()).isEqualTo(mMockHandler);
+ verify(mMockContext, times(2)).registerReceiverAsUser(any(), eq(UserHandle.ALL), any(),
+ eq(null), eq(mMockHandler));
+
+ assertThrows(IllegalStateException.class,
+ () -> spyPackageMonitor.register(mMockContext, UserHandle.ALL,
+ false /* externalStorage */, mMockHandler));
+ }
+
+ @Test
+ public void testPackageMonitorRegisterMultipleUnRegisterThrowsException() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ spyPackageMonitor.register(mMockContext, UserHandle.ALL, false /* externalStorage */,
+ mMockHandler);
+ spyPackageMonitor.unregister();
+
+ assertThrows(IllegalStateException.class, spyPackageMonitor::unregister);
+ }
+
+ @Test
+ public void testPackageMonitorNotRegisterUnRegisterThrowsException() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ assertThrows(IllegalStateException.class, spyPackageMonitor::unregister);
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventUidRemoved() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_UID_REMOVED);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1)).onUidRemoved(eq(FAKE_PACKAGE_UID));
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageSuspended() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGES_SUSPENDED);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ String [] packageList = new String[]{FAKE_PACKAGE_NAME};
+ intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, packageList);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1)).onPackagesSuspended(eq(packageList));
+ verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageUnSuspended() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGES_UNSUSPENDED);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ String [] packageList = new String[]{FAKE_PACKAGE_NAME};
+ intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, packageList);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1)).onPackagesUnsuspended(eq(packageList));
+ verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventUserStop() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_USER_STOPPED);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1)).onHandleUserStop(eq(intent), eq(FAKE_USER_ID));
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventExternalApplicationAvailable()
+ throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ String [] packageList = new String[]{FAKE_PACKAGE_NAME};
+ intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, packageList);
+ intent.putExtra(Intent.EXTRA_REPLACING, true);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1)).onPackagesAvailable(eq(packageList));
+ verify(spyPackageMonitor, times(1)).onPackageAppeared(eq(FAKE_PACKAGE_NAME),
+ eq(PackageMonitor.PACKAGE_UPDATING));
+ verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventExternalApplicationUnavailable()
+ throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ String [] packageList = new String[]{FAKE_PACKAGE_NAME};
+ intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, packageList);
+ intent.putExtra(Intent.EXTRA_REPLACING, true);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1)).onPackagesUnavailable(eq(packageList));
+ verify(spyPackageMonitor, times(1)).onPackageDisappeared(eq(FAKE_PACKAGE_NAME),
+ eq(PackageMonitor.PACKAGE_UPDATING));
+ verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageRestarted() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGE_RESTARTED);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1)).onHandleForceStop(eq(intent),
+ eq(new String[]{FAKE_PACKAGE_NAME}), eq(FAKE_PACKAGE_UID), eq(true));
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageQueryRestarted() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ String [] packageList = new String[]{FAKE_PACKAGE_NAME};
+ intent.putExtra(Intent.EXTRA_PACKAGES, packageList);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1)).onHandleForceStop(eq(intent),
+ eq(packageList), eq(FAKE_PACKAGE_UID), eq(false));
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageDataClear() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED);
+ intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1))
+ .onPackageDataCleared(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageChanged() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGE_CHANGED);
+ intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ String [] packageList = new String[]{FAKE_PACKAGE_NAME};
+ intent.putExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST, packageList);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1))
+ .onPackageChanged(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID), eq(packageList));
+ verify(spyPackageMonitor, times(1)).onPackageModified(eq(FAKE_PACKAGE_NAME));
+ verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageRemovedReplacing() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
+ intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ intent.putExtra(Intent.EXTRA_REPLACING, true);
+ intent.putExtra(Intent.EXTRA_REMOVED_FOR_ALL_USERS, true);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1))
+ .onPackageUpdateStarted(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
+ verify(spyPackageMonitor, times(1))
+ .onPackageDisappeared(eq(FAKE_PACKAGE_NAME), eq(PackageMonitor.PACKAGE_UPDATING));
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageRemovedNotReplacing()
+ throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
+ intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ intent.putExtra(Intent.EXTRA_REPLACING, false);
+ intent.putExtra(Intent.EXTRA_REMOVED_FOR_ALL_USERS, true);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1))
+ .onPackageRemoved(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
+ verify(spyPackageMonitor, times(1))
+ .onPackageRemovedAllUsers(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
+ verify(spyPackageMonitor, times(1)).onPackageDisappeared(eq(FAKE_PACKAGE_NAME),
+ eq(PackageMonitor.PACKAGE_PERMANENT_CHANGE));
+ verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageAddReplacing() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGE_ADDED);
+ intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ intent.putExtra(Intent.EXTRA_REPLACING, true);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1))
+ .onPackageUpdateFinished(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
+ verify(spyPackageMonitor, times(1)).onPackageModified(eq(FAKE_PACKAGE_NAME));
+ verify(spyPackageMonitor, times(1))
+ .onPackageAppeared(eq(FAKE_PACKAGE_NAME), eq(PackageMonitor.PACKAGE_UPDATING));
+ verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ @Test
+ public void testPackageMonitorDoHandlePackageEventPackageAddNotReplacing() throws Exception {
+ PackageMonitor spyPackageMonitor = spy(new TestPackageMonitor());
+
+ Intent intent = new Intent(Intent.ACTION_PACKAGE_ADDED);
+ intent.setData(Uri.fromParts("package", FAKE_PACKAGE_NAME, null));
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, FAKE_USER_ID);
+ intent.putExtra(Intent.EXTRA_UID, FAKE_PACKAGE_UID);
+ intent.putExtra(Intent.EXTRA_REPLACING, false);
+ spyPackageMonitor.doHandlePackageEvent(intent);
+
+ verify(spyPackageMonitor, times(1)).onBeginPackageChanges();
+ verify(spyPackageMonitor, times(1))
+ .onPackageAdded(eq(FAKE_PACKAGE_NAME), eq(FAKE_PACKAGE_UID));
+ verify(spyPackageMonitor, times(1)).onPackageAppeared(eq(FAKE_PACKAGE_NAME),
+ eq(PackageMonitor.PACKAGE_PERMANENT_CHANGE));
+ verify(spyPackageMonitor, times(1)).onSomePackagesChanged();
+ verify(spyPackageMonitor, times(1)).onFinishPackageChanges();
+ }
+
+ public static class TestPackageMonitor extends PackageMonitor {
+ }
+}