From bce9f378bafa418e556dfb471f01eab4216922c8 Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Mon, 17 Oct 2022 22:18:59 +0000 Subject: [PATCH] Use the correct UID for proc state evaluation. JS policy is primarily based on the source UID, not the calling UID. Update the code and tests to evaluate the source UID state. Bug: 253815639 Bug: 253820921 Test: atest FrameworksMockingServicesTests:FlexibilityControllerTest Change-Id: I193b69e0809f10f38e11fe956f8dbb9c325d993b --- .../controllers/FlexibilityController.java | 6 ++--- .../FlexibilityControllerTest.java | 27 ++++++++++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java index bbd661acca011..547f94badd69a 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java @@ -237,7 +237,7 @@ public final class FlexibilityController extends StateController { @GuardedBy("mLock") boolean isFlexibilitySatisfiedLocked(JobStatus js) { return !mFlexibilityEnabled - || mService.getUidBias(js.getUid()) == JobInfo.BIAS_TOP_APP + || mService.getUidBias(js.getSourceUid()) == JobInfo.BIAS_TOP_APP || mService.isCurrentlyRunningLocked(js) || getNumSatisfiedRequiredConstraintsLocked(js) >= js.getNumRequiredFlexibleConstraints(); @@ -587,7 +587,7 @@ public final class FlexibilityController extends StateController { } if (latest - nowElapsed < mDeadlineProximityLimitMs) { if (DEBUG) { - Slog.d(TAG, "deadline proximity met: " + js.getUid()); + Slog.d(TAG, "deadline proximity met: " + js); } mFlexibilityTracker.adjustJobsRequiredConstraints(js, -js.getNumRequiredFlexibleConstraints(), nowElapsed); @@ -600,7 +600,7 @@ public final class FlexibilityController extends StateController { } if (latest - nextTimeElapsed <= mDeadlineProximityLimitMs) { if (DEBUG) { - Slog.d(TAG, "last alarm set: " + js.getUid()); + Slog.d(TAG, "last alarm set: " + js); } addAlarm(js, latest - mDeadlineProximityLimitMs); return; diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java index c58104a506132..674e500d2e417 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java @@ -48,6 +48,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.app.AlarmManager; +import android.app.AppGlobals; import android.app.job.JobInfo; import android.content.ComponentName; import android.content.Context; @@ -80,11 +81,13 @@ public class FlexibilityControllerTest { private static final String SOURCE_PACKAGE = "com.android.frameworks.mockingservicestests"; private static final int SOURCE_USER_ID = 0; private static final long FROZEN_TIME = 100L; + private MockitoSession mMockingSession; private FlexibilityController mFlexibilityController; private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder; private JobStore mJobStore; private FlexibilityController.FcConfig mFcConfig; + private int mSourceUid; @Mock private AlarmManager mAlarmManager; @@ -98,7 +101,7 @@ public class FlexibilityControllerTest { private PackageManager mPackageManager; @Before - public void setup() { + public void setup() throws Exception { mMockingSession = mockitoSession() .initMocks(this) .strictness(Strictness.LENIENT) @@ -144,6 +147,8 @@ public class FlexibilityControllerTest { mPrefetchController); mFcConfig = mFlexibilityController.getFcConfig(); + mSourceUid = AppGlobals.getPackageManager().getPackageUid(SOURCE_PACKAGE, 0, 0); + setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "50,60,70,80"); setDeviceConfigLong(KEY_DEADLINE_PROXIMITY_LIMIT, 0L); setDeviceConfigBoolean(KEY_FLEXIBILITY_ENABLED, true); @@ -648,20 +653,22 @@ public class FlexibilityControllerTest { public void testTopAppBypass() { JobInfo.Builder jb = createJob(0); JobStatus js = createJobStatus("testTopAppBypass", jb); - js.adjustNumRequiredFlexibleConstraints(100); mJobStore.add(js); // Needed because if before and after Uid bias is the same, nothing happens. - when(mJobSchedulerService.getUidBias(js.getUid())) + when(mJobSchedulerService.getUidBias(mSourceUid)) .thenReturn(JobInfo.BIAS_FOREGROUND_SERVICE); synchronized (mFlexibilityController.mLock) { - setUidBias(js.getUid(), JobInfo.BIAS_TOP_APP); + mFlexibilityController.maybeStartTrackingJobLocked(js, null); + assertFalse(mFlexibilityController.isFlexibilitySatisfiedLocked(js)); + + setUidBias(mSourceUid, JobInfo.BIAS_TOP_APP); assertTrue(mFlexibilityController.isFlexibilitySatisfiedLocked(js)); assertTrue(js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE)); - setUidBias(js.getUid(), JobInfo.BIAS_FOREGROUND_SERVICE); + setUidBias(mSourceUid, JobInfo.BIAS_FOREGROUND_SERVICE); assertFalse(mFlexibilityController.isFlexibilitySatisfiedLocked(js)); assertFalse(js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE)); @@ -858,18 +865,18 @@ public class FlexibilityControllerTest { final ArraySet pkgs = new ArraySet<>(); pkgs.add(js.getSourcePackageName()); - when(mJobSchedulerService.getPackagesForUidLocked(js.getUid())).thenReturn(pkgs); + when(mJobSchedulerService.getPackagesForUidLocked(mSourceUid)).thenReturn(pkgs); - setUidBias(js.getUid(), BIAS_TOP_APP); - setUidBias(js.getUid(), BIAS_FOREGROUND_SERVICE); + setUidBias(mSourceUid, BIAS_TOP_APP); + setUidBias(mSourceUid, BIAS_FOREGROUND_SERVICE); assertEquals(100L, (long) mFlexibilityController.mPrefetchLifeCycleStart .getOrDefault(js.getSourceUserId(), js.getSourcePackageName(), 0L)); JobSchedulerService.sElapsedRealtimeClock = Clock.fixed(Instant.ofEpochMilli(50L), ZoneOffset.UTC); - setUidBias(js.getUid(), BIAS_TOP_APP); - setUidBias(js.getUid(), BIAS_FOREGROUND_SERVICE); + setUidBias(mSourceUid, BIAS_TOP_APP); + setUidBias(mSourceUid, BIAS_FOREGROUND_SERVICE); assertEquals(100L, (long) mFlexibilityController .mPrefetchLifeCycleStart.get(js.getSourceUserId(), js.getSourcePackageName()));