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

Commit bf3ed522 authored by Sanath Kumar's avatar Sanath Kumar Committed by Android (Google) Code Review
Browse files

Merge "JobScheduler: Use quota parameters for testing" into main

parents cf484b23 4752eab2
Loading
Loading
Loading
Loading
+49 −35
Original line number Diff line number Diff line
@@ -945,19 +945,22 @@ public class QuotaControllerTest {
    public void testGetExecutionStatsLocked_Values() {
        final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
        mQuotaController.saveTimingSession(0, "com.android.test",
                createTimingSession(now - (23 * HOUR_IN_MILLIS), 10 * MINUTE_IN_MILLIS, 5), false);
                createTimingSession(now - (mQcConstants.WINDOW_SIZE_RARE_MS - HOUR_IN_MILLIS),
                        10 * MINUTE_IN_MILLIS, 5), false);
        mQuotaController.saveTimingSession(0, "com.android.test",
                createTimingSession(now - (7 * HOUR_IN_MILLIS), 10 * MINUTE_IN_MILLIS, 5), false);
                createTimingSession(now - (mQcConstants.WINDOW_SIZE_FREQUENT_MS - HOUR_IN_MILLIS),
                        10 * MINUTE_IN_MILLIS, 5), false);
        mQuotaController.saveTimingSession(0, "com.android.test",
                createTimingSession(now - (2 * HOUR_IN_MILLIS), 10 * MINUTE_IN_MILLIS, 5), false);
                createTimingSession(now - mQcConstants.WINDOW_SIZE_WORKING_MS,
                        10 * MINUTE_IN_MILLIS, 5), false);
        mQuotaController.saveTimingSession(0, "com.android.test",
                createTimingSession(now - (6 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5), false);

        ExecutionStats expectedStats = new ExecutionStats();

        // Active
        expectedStats.allowedTimePerPeriodMs = 10 * MINUTE_IN_MILLIS;
        expectedStats.windowSizeMs = 10 * MINUTE_IN_MILLIS;
        expectedStats.allowedTimePerPeriodMs = mQcConstants.ALLOWED_TIME_PER_PERIOD_ACTIVE_MS;
        expectedStats.windowSizeMs = mQcConstants.WINDOW_SIZE_ACTIVE_MS;
        expectedStats.jobCountLimit = mQcConstants.MAX_JOB_COUNT_ACTIVE;
        expectedStats.sessionCountLimit = mQcConstants.MAX_SESSION_COUNT_ACTIVE;
        expectedStats.expirationTimeElapsed = now + 4 * MINUTE_IN_MILLIS;
@@ -972,7 +975,7 @@ public class QuotaControllerTest {
        }

        // Working
        expectedStats.windowSizeMs = 2 * HOUR_IN_MILLIS;
        expectedStats.windowSizeMs = mQcConstants.WINDOW_SIZE_WORKING_MS;
        expectedStats.jobCountLimit = mQcConstants.MAX_JOB_COUNT_WORKING;
        expectedStats.sessionCountLimit = mQcConstants.MAX_SESSION_COUNT_WORKING;
        expectedStats.expirationTimeElapsed = now;
@@ -989,7 +992,7 @@ public class QuotaControllerTest {
        }

        // Frequent
        expectedStats.windowSizeMs = 8 * HOUR_IN_MILLIS;
        expectedStats.windowSizeMs = mQcConstants.WINDOW_SIZE_FREQUENT_MS;
        expectedStats.jobCountLimit = mQcConstants.MAX_JOB_COUNT_FREQUENT;
        expectedStats.sessionCountLimit = mQcConstants.MAX_SESSION_COUNT_FREQUENT;
        expectedStats.expirationTimeElapsed = now + HOUR_IN_MILLIS;
@@ -1007,7 +1010,7 @@ public class QuotaControllerTest {
        }

        // Rare
        expectedStats.windowSizeMs = 24 * HOUR_IN_MILLIS;
        expectedStats.windowSizeMs = mQcConstants.WINDOW_SIZE_RARE_MS;
        expectedStats.jobCountLimit = mQcConstants.MAX_JOB_COUNT_RARE;
        expectedStats.sessionCountLimit = mQcConstants.MAX_SESSION_COUNT_RARE;
        expectedStats.expirationTimeElapsed = now + HOUR_IN_MILLIS;
@@ -1252,7 +1255,8 @@ public class QuotaControllerTest {
        mQuotaController.saveTimingSession(0, "com.android.test",
                createTimingSession(now - (7 * HOUR_IN_MILLIS), 10 * MINUTE_IN_MILLIS, 5), false);
        mQuotaController.saveTimingSession(0, "com.android.test",
                createTimingSession(now - (2 * HOUR_IN_MILLIS), 10 * MINUTE_IN_MILLIS, 5), false);
                createTimingSession(now - mQcConstants.WINDOW_SIZE_WORKING_MS,
                        10 * MINUTE_IN_MILLIS, 5), false);
        mQuotaController.saveTimingSession(0, "com.android.test",
                createTimingSession(now - (6 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5), false);
        final ExecutionStats originalStatsActive;
@@ -1658,7 +1662,7 @@ public class QuotaControllerTest {
        // Close to boundary.
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - (24 * HOUR_IN_MILLIS - MINUTE_IN_MILLIS),
                        4 * HOUR_IN_MILLIS - 5 * MINUTE_IN_MILLIS, 5), false);
                        mQcConstants.MAX_EXECUTION_TIME_MS - 5 * MINUTE_IN_MILLIS, 5), false);

        setStandbyBucket(WORKING_INDEX);
        synchronized (mQuotaController.mLock) {
@@ -1674,7 +1678,8 @@ public class QuotaControllerTest {
        // Far from boundary.
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(
                        now - (20 * HOUR_IN_MILLIS), 4 * HOUR_IN_MILLIS - 3 * MINUTE_IN_MILLIS, 5),
                        now - (20 * HOUR_IN_MILLIS),
                        mQcConstants.MAX_EXECUTION_TIME_MS - 3 * MINUTE_IN_MILLIS, 5),
                false);

        setStandbyBucket(WORKING_INDEX);
@@ -1701,11 +1706,12 @@ public class QuotaControllerTest {
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(
                        now - (24 * HOUR_IN_MILLIS + 11 * MINUTE_IN_MILLIS),
                        4 * HOUR_IN_MILLIS,
                        mQcConstants.MAX_EXECUTION_TIME_MS,
                        5), false);
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(
                        now - (8 * HOUR_IN_MILLIS + MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5),
                        now - (mQcConstants.WINDOW_SIZE_FREQUENT_MS + MINUTE_IN_MILLIS),
                        3 * MINUTE_IN_MILLIS, 5),
                false);

        synchronized (mQuotaController.mLock) {
@@ -1729,11 +1735,12 @@ public class QuotaControllerTest {
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(
                        now - (20 * HOUR_IN_MILLIS),
                        3 * HOUR_IN_MILLIS + 48 * MINUTE_IN_MILLIS,
                        mQcConstants.MAX_EXECUTION_TIME_MS - 12 * MINUTE_IN_MILLIS,
                        5), false);
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(
                        now - (8 * HOUR_IN_MILLIS + MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5),
                        now - (mQcConstants.WINDOW_SIZE_FREQUENT_MS + MINUTE_IN_MILLIS),
                        3 * MINUTE_IN_MILLIS, 5),
                false);

        synchronized (mQuotaController.mLock) {
@@ -2413,7 +2420,8 @@ public class QuotaControllerTest {

        long now = JobSchedulerService.sElapsedRealtimeClock.millis();
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - (HOUR_IN_MILLIS), 5 * MINUTE_IN_MILLIS, 10), false);
                createTimingSession(now - (mQcConstants.WINDOW_SIZE_WORKING_MS - HOUR_IN_MILLIS),
                        5 * MINUTE_IN_MILLIS, 10), false);
        final ExecutionStats stats;
        synchronized (mQuotaController.mLock) {
            stats = mQuotaController.getExecutionStatsLocked(
@@ -2499,7 +2507,8 @@ public class QuotaControllerTest {

        long now = JobSchedulerService.sElapsedRealtimeClock.millis();
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - (HOUR_IN_MILLIS), 5 * MINUTE_IN_MILLIS, 1), false);
                createTimingSession(now - (mQcConstants.WINDOW_SIZE_WORKING_MS - HOUR_IN_MILLIS),
                        5 * MINUTE_IN_MILLIS, 1), false);
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - (30 * MINUTE_IN_MILLIS), MINUTE_IN_MILLIS, 1), false);
        final ExecutionStats stats;
@@ -2935,12 +2944,12 @@ public class QuotaControllerTest {
                anyInt(), anyLong(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any(Handler.class));

        // Test with timing sessions in window but still in quota.
        final long end = now - (2 * HOUR_IN_MILLIS - 5 * MINUTE_IN_MILLIS);
        final long end = now - (mQcConstants.WINDOW_SIZE_WORKING_MS - 5 * MINUTE_IN_MILLIS);
        // Counting backwards, the quota will come back one minute before the end.
        final long expectedAlarmTime =
                end - MINUTE_IN_MILLIS + 2 * HOUR_IN_MILLIS + mQcConstants.IN_QUOTA_BUFFER_MS;
        final long expectedAlarmTime = end - MINUTE_IN_MILLIS + mQcConstants.WINDOW_SIZE_WORKING_MS
                + mQcConstants.IN_QUOTA_BUFFER_MS;
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                new TimingSession(now - 2 * HOUR_IN_MILLIS, end, 1), false);
                new TimingSession(now - mQcConstants.WINDOW_SIZE_WORKING_MS, end, 1), false);
        synchronized (mQuotaController.mLock) {
            mQuotaController.maybeScheduleStartAlarmLocked(
                    SOURCE_USER_ID, SOURCE_PACKAGE, standbyBucket);
@@ -3007,7 +3016,8 @@ public class QuotaControllerTest {
        // Test with timing sessions out of window.
        final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - 10 * HOUR_IN_MILLIS, 5 * MINUTE_IN_MILLIS, 1), false);
                createTimingSession(now - mQcConstants.WINDOW_SIZE_FREQUENT_MS
                        - 2 * HOUR_IN_MILLIS, 5 * MINUTE_IN_MILLIS, 1), false);
        synchronized (mQuotaController.mLock) {
            mQuotaController.maybeScheduleStartAlarmLocked(
                    SOURCE_USER_ID, SOURCE_PACKAGE, standbyBucket);
@@ -3016,8 +3026,9 @@ public class QuotaControllerTest {
                anyInt(), anyLong(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any(Handler.class));

        // Test with timing sessions in window but still in quota.
        final long start = now - (6 * HOUR_IN_MILLIS);
        final long expectedAlarmTime = start + 8 * HOUR_IN_MILLIS + mQcConstants.IN_QUOTA_BUFFER_MS;
        final long start = now - (mQcConstants.WINDOW_SIZE_FREQUENT_MS - 2 * HOUR_IN_MILLIS);
        final long expectedAlarmTime = start + mQcConstants.WINDOW_SIZE_FREQUENT_MS
                + mQcConstants.IN_QUOTA_BUFFER_MS;
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(start, 5 * MINUTE_IN_MILLIS, 1), false);
        synchronized (mQuotaController.mLock) {
@@ -3091,7 +3102,8 @@ public class QuotaControllerTest {
        // Test with timing sessions out of window.
        final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - 10 * HOUR_IN_MILLIS, 5 * MINUTE_IN_MILLIS, 1), false);
                createTimingSession(now - mQcConstants.WINDOW_SIZE_FREQUENT_MS
                                - 2 * HOUR_IN_MILLIS, 5 * MINUTE_IN_MILLIS, 1), false);
        synchronized (mQuotaController.mLock) {
            mQuotaController.maybeScheduleStartAlarmLocked(
                    SOURCE_USER_ID, SOURCE_PACKAGE, effectiveStandbyBucket);
@@ -3100,8 +3112,9 @@ public class QuotaControllerTest {
                anyInt(), anyLong(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any(Handler.class));

        // Test with timing sessions in window but still in quota.
        final long start = now - (6 * HOUR_IN_MILLIS);
        final long expectedAlarmTime = start + 8 * HOUR_IN_MILLIS + mQcConstants.IN_QUOTA_BUFFER_MS;
        final long start = now - (mQcConstants.WINDOW_SIZE_FREQUENT_MS - 2 * HOUR_IN_MILLIS);
        final long expectedAlarmTime = start + mQcConstants.WINDOW_SIZE_FREQUENT_MS
                + mQcConstants.IN_QUOTA_BUFFER_MS;
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(start, 5 * MINUTE_IN_MILLIS, 1), false);
        synchronized (mQuotaController.mLock) {
@@ -3273,7 +3286,7 @@ public class QuotaControllerTest {

        // And down from there.
        final long expectedWorkingAlarmTime =
                outOfQuotaTime + (2 * HOUR_IN_MILLIS)
                outOfQuotaTime + mQcConstants.WINDOW_SIZE_WORKING_MS
                        + mQcConstants.IN_QUOTA_BUFFER_MS;
        setStandbyBucket(WORKING_INDEX, jobStatus);
        synchronized (mQuotaController.mLock) {
@@ -3285,7 +3298,7 @@ public class QuotaControllerTest {
                eq(TAG_QUOTA_CHECK), any(), any(Handler.class));

        final long expectedFrequentAlarmTime =
                outOfQuotaTime + (8 * HOUR_IN_MILLIS)
                outOfQuotaTime + mQcConstants.WINDOW_SIZE_FREQUENT_MS
                        + mQcConstants.IN_QUOTA_BUFFER_MS;
        setStandbyBucket(FREQUENT_INDEX, jobStatus);
        synchronized (mQuotaController.mLock) {
@@ -3297,7 +3310,7 @@ public class QuotaControllerTest {
                eq(TAG_QUOTA_CHECK), any(), any(Handler.class));

        final long expectedRareAlarmTime =
                outOfQuotaTime + (24 * HOUR_IN_MILLIS)
                outOfQuotaTime + mQcConstants.WINDOW_SIZE_RARE_MS
                        + mQcConstants.IN_QUOTA_BUFFER_MS;
        setStandbyBucket(RARE_INDEX, jobStatus);
        synchronized (mQuotaController.mLock) {
@@ -3457,7 +3470,7 @@ public class QuotaControllerTest {
        }

        final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
        // Working set window size is 2 hours.
        // Working set window size is configured with QcConstants.WINDOW_SIZE_WORKING_MS.
        final int standbyBucket = WORKING_INDEX;
        final long contributionMs = mQcConstants.IN_QUOTA_BUFFER_MS / 2;
        final long remainingTimeMs =
@@ -3466,13 +3479,14 @@ public class QuotaControllerTest {
        // Session straddles edge of bucket window. Only the contribution should be counted towards
        // the quota.
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - (2 * HOUR_IN_MILLIS + 3 * MINUTE_IN_MILLIS),
                        3 * MINUTE_IN_MILLIS + contributionMs, 3), false);
                createTimingSession(now - mQcConstants.WINDOW_SIZE_WORKING_MS
                        - 3 * MINUTE_IN_MILLIS, 3 * MINUTE_IN_MILLIS + contributionMs,
                        3), false);
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - HOUR_IN_MILLIS, remainingTimeMs, 2), false);
        // Expected alarm time should be when the app will have QUOTA_BUFFER_MS time of quota, which
        // is 2 hours + (QUOTA_BUFFER_MS - contributionMs) after the start of the second session.
        final long expectedAlarmTime = now - HOUR_IN_MILLIS + 2 * HOUR_IN_MILLIS
        final long expectedAlarmTime = now - HOUR_IN_MILLIS + mQcConstants.WINDOW_SIZE_WORKING_MS
                + (mQcConstants.IN_QUOTA_BUFFER_MS - contributionMs);
        synchronized (mQuotaController.mLock) {
            mQuotaController.maybeScheduleStartAlarmLocked(
@@ -4734,7 +4748,7 @@ public class QuotaControllerTest {
        // The package only has one second to run, but this session is at the edge of the rolling
        // window, so as the package "reaches its quota" it will have more to keep running.
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - 2 * HOUR_IN_MILLIS,
                createTimingSession(now - mQcConstants.WINDOW_SIZE_WORKING_MS,
                        10 * SECOND_IN_MILLIS - remainingTimeMs, 1), false);
        mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
                createTimingSession(now - HOUR_IN_MILLIS,