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

Commit 5720f225 authored by Pavel Grafov's avatar Pavel Grafov
Browse files

Make PM unit tests work with trunk stable flags

Currently DeviceConfig is fully mocked out, so annotations like
@RequiresFlagsEnabled don't work. This CL makes DeviceConfig mock
fall back to the real instance.
One side effect of it is that a flag, SYSTEM_EXEMPT_FROM_SUSPENSION,
that defaulted to `true` is now also considered `true` in tests,
causing a failure, so I also cleaned up the flag and updated the
test code to provide AppOpsManager mock.

Bug: 309671525
Bug: 263464464
Test: atest com.android.server.pm.PackageManagerServiceBootTest \
      com.android.server.pm.PackageManagerServiceHibernationTests \
      com.android.server.pm.ApexManagerTest \
      com.android.server.pm.DeletePackageHelperTest \
      com.android.server.pm.PackageFreezerTest \
      com.android.server.pm.PackageArchiverTest \
      com.android.server.pm.PackageMonitorCallbackHelperTest \
      com.android.server.pm.InitAppsHelperTest \
      com.android.server.pm.SharedLibrariesImplTest \
      com.android.server.pm.SuspendPackageHelperTest \
      com.android.server.pm.DistractingPackageHelperTest
Change-Id: I17bdfc498d86c43faf257ef64b6b0d20069e5cc8
parent 933f3ee9
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ import android.os.PersistableBundle;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.IntArray;
@@ -504,10 +503,6 @@ public final class SuspendPackageHelper {
            final String requiredPermissionControllerPackage =
                    getKnownPackageName(snapshot, KnownPackages.PACKAGE_PERMISSION_CONTROLLER,
                            userId);
            final AppOpsManager appOpsManager = mInjector.getSystemService(AppOpsManager.class);
            final boolean isSystemExemptFlagEnabled = DeviceConfig.getBoolean(
                    DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE,
                    SYSTEM_EXEMPT_FROM_SUSPENSION, /* defaultValue= */ true);
            for (int i = 0; i < packageNames.length; i++) {
                canSuspend[i] = false;
                final String packageName = packageNames[i];
@@ -581,9 +576,7 @@ public final class SuspendPackageHelper {
                                + pkg.getStaticSharedLibraryName());
                        continue;
                    }
                    if (isSystemExemptFlagEnabled && appOpsManager.checkOpNoThrow(
                            AppOpsManager.OP_SYSTEM_EXEMPT_FROM_SUSPENSION, uid, packageName)
                            == AppOpsManager.MODE_ALLOWED) {
                    if (exemptFromSuspensionByAppOp(uid, packageName)) {
                        Slog.w(TAG, "Cannot suspend package \"" + packageName
                                + "\": has OP_SYSTEM_EXEMPT_FROM_SUSPENSION set");
                        continue;
@@ -601,6 +594,13 @@ public final class SuspendPackageHelper {
        return canSuspend;
    }

    private boolean exemptFromSuspensionByAppOp(int uid, String packageName) {
        final AppOpsManager appOpsManager = mInjector.getSystemService(AppOpsManager.class);
        return appOpsManager.checkOpNoThrow(
                AppOpsManager.OP_SYSTEM_EXEMPT_FROM_SUSPENSION, uid, packageName)
                        == AppOpsManager.MODE_ALLOWED;
    }

    /**
     * Suspends packages on behalf of an admin.
     *
+6 −0
Original line number Diff line number Diff line
@@ -16,12 +16,14 @@

package com.android.server.pm

import android.app.AppOpsManager
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Binder
import com.android.server.testutils.any
import com.android.server.testutils.eq
import com.android.server.testutils.nullable
import com.android.server.testutils.whenever
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@@ -31,6 +33,7 @@ import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.never
import org.mockito.Mockito.verify


@RunWith(JUnit4::class)
class DistractingPackageHelperTest : PackageHelperTestBase() {

@@ -40,6 +43,9 @@ class DistractingPackageHelperTest : PackageHelperTestBase() {
        super.setup()
        distractingPackageHelper = DistractingPackageHelper(
                pms, broadcastHelper, suspendPackageHelper)
        whenever(rule.mocks().appOpsManager.checkOpNoThrow(
                eq(AppOpsManager.OP_SYSTEM_EXEMPT_FROM_SUSPENSION), any(), any()))
                .thenReturn(AppOpsManager.MODE_DEFAULT)
    }

    @Test
+4 −1
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */
package com.android.server.pm

import android.app.AppOpsManager
import android.app.PropertyInvalidatedCache
import android.content.Context
import android.content.Intent
@@ -151,7 +152,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) {
                .mockStatic(EventLog::class.java)
                .mockStatic(LocalServices::class.java)
                .mockStatic(LocalManagerRegistry::class.java)
                .mockStatic(DeviceConfig::class.java)
                .mockStatic(DeviceConfig::class.java, Mockito.CALLS_REAL_METHODS)
                .mockStatic(HexEncoding::class.java)
                .apply(withSession)
        session = apply.startMocking()
@@ -192,6 +193,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) {
        val userManagerService: UserManagerService = mock()
        val componentResolver: ComponentResolver = mock()
        val permissionManagerInternal: PermissionManagerServiceInternal = mock()
        val appOpsManager: AppOpsManager = mock()
        val incrementalManager: IncrementalManager = mock()
        val platformCompat: PlatformCompat = mock()
        val settings: Settings = mock()
@@ -304,6 +306,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) {
        whenever(mocks.injector.defaultAppProvider) { mocks.defaultAppProvider }
        whenever(mocks.injector.backgroundHandler) { mocks.backgroundHandler }
        whenever(mocks.injector.updateOwnershipHelper) { mocks.updateOwnershipHelper }
        whenever(mocks.injector.getSystemService(AppOpsManager::class.java)) { mocks.appOpsManager }
        wheneverStatic { SystemConfig.getInstance() }.thenReturn(mocks.systemConfig)
        whenever(mocks.systemConfig.availableFeatures).thenReturn(DEFAULT_AVAILABLE_FEATURES_MAP)
        whenever(mocks.systemConfig.sharedLibraries).thenReturn(DEFAULT_SHARED_LIBRARIES_LIST)
+8 −0
Original line number Diff line number Diff line
@@ -16,12 +16,14 @@

package com.android.server.pm

import android.app.AppOpsManager
import android.content.Intent
import android.content.pm.SuspendDialogInfo
import android.os.Binder
import android.os.PersistableBundle
import com.android.server.testutils.any
import com.android.server.testutils.eq
import com.android.server.testutils.whenever
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@@ -32,6 +34,12 @@ import org.mockito.Mockito.verify

@RunWith(JUnit4::class)
class SuspendPackageHelperTest : PackageHelperTestBase() {
    override fun setup() {
        super.setup()
        whenever(rule.mocks().appOpsManager.checkOpNoThrow(
                eq(AppOpsManager.OP_SYSTEM_EXEMPT_FROM_SUSPENSION), any(), any()))
                .thenReturn(AppOpsManager.MODE_DEFAULT)
    }

    @Test
    fun setPackagesSuspended() {