Per-Job Policy SPE Migration for ODP/FCP

Flag: EXEMPT (bug 337358613)
PS_FLAG: FcpBackgroundJobs__enable_per_job_policy
Bug: 405397835
Test: atest MddJobTest OnDevicePersonalizationDownloadProcessingJobTests OnDevicePersonalizationDownloadProcessingJobTests ResetDataJobTest UserDataCollectionJobTest AggregateErrorDataReportingJobTest DeleteExpiredJobTest BackgroundKeyFetchJobTest

Change-Id: I2febd4bdd1e5b4bcf8ffdd2359e0e7fe9c17911c
diff --git a/federatedcompute/src/com/android/federatedcompute/services/encryption/BackgroundKeyFetchJob.java b/federatedcompute/src/com/android/federatedcompute/services/encryption/BackgroundKeyFetchJob.java
index 5a643de..b246304 100644
--- a/federatedcompute/src/com/android/federatedcompute/services/encryption/BackgroundKeyFetchJob.java
+++ b/federatedcompute/src/com/android/federatedcompute/services/encryption/BackgroundKeyFetchJob.java
@@ -128,15 +128,22 @@
         return new BackoffPolicy.Builder().setShouldRetryOnExecutionStop(true).build();
     }
 
+    @Override
+    public String getJobPolicyString(int jobId) {
+        return FlagsFactory.getFlags().getBackgroundKeyFetchJobPolicy();
+    }
+
     /** Schedules a unique instance of {@link BackgroundKeyFetchJobService}. */
     public static void schedule(Context context) {
         // If SPE is not enabled, force to schedule the job with the old JobService.
         if (!FlagsFactory.getFlags().getSpeOnBackgroundKeyFetchJobEnabled()) {
-            LogUtil.d(TAG, "SPE is not enabled. Schedule the job with "
-                    + "BackgroundKeyFetchJobService.");
+            LogUtil.d(
+                    TAG,
+                    "SPE is not enabled. Schedule the job with " + "BackgroundKeyFetchJobService.");
 
-            int resultCode = BackgroundKeyFetchJobService.scheduleJobIfNeeded(
-                    context, FlagsFactory.getFlags(), /* forceSchedule */ false);
+            int resultCode =
+                    BackgroundKeyFetchJobService.scheduleJobIfNeeded(
+                            context, FlagsFactory.getFlags(), /* forceSchedule */ false);
             FederatedComputeJobServiceFactory.getInstance(context)
                     .getJobSchedulingLogger()
                     .recordOnSchedulingLegacy(ENCRYPTION_KEY_FETCH_JOB_ID, resultCode);
diff --git a/federatedcompute/src/com/android/federatedcompute/services/scheduling/DeleteExpiredJob.java b/federatedcompute/src/com/android/federatedcompute/services/scheduling/DeleteExpiredJob.java
index c8696ad..395a7c2 100644
--- a/federatedcompute/src/com/android/federatedcompute/services/scheduling/DeleteExpiredJob.java
+++ b/federatedcompute/src/com/android/federatedcompute/services/scheduling/DeleteExpiredJob.java
@@ -135,6 +135,11 @@
         return JOB_ENABLED_STATUS_ENABLED;
     }
 
+    @Override
+    public String getJobPolicyString(int jobId) {
+        return FlagsFactory.getFlags().getDeleteExpiredDataJobPolicy();
+    }
+
     /** Schedule the periodic {@link DeleteExpiredJob}. */
     public static void schedule(Context context, Flags flags) {
         // If SPE is not enabled, force to schedule the job with the old JobService.
diff --git a/src/com/android/ondevicepersonalization/services/data/errors/AggregateErrorDataReportingJob.java b/src/com/android/ondevicepersonalization/services/data/errors/AggregateErrorDataReportingJob.java
index 847075a..fee34f5 100644
--- a/src/com/android/ondevicepersonalization/services/data/errors/AggregateErrorDataReportingJob.java
+++ b/src/com/android/ondevicepersonalization/services/data/errors/AggregateErrorDataReportingJob.java
@@ -132,15 +132,22 @@
         return new BackoffPolicy.Builder().setShouldRetryOnExecutionStop(true).build();
     }
 
+    @Override
+    public String getJobPolicyString(int jobId) {
+        return FlagsFactory.getFlags().getAggregateErrorDataReportingJobPolicy();
+    }
+
     /** Schedules a unique instance of {@link AggregateErrorDataReportingJob}. */
     public static void schedule(Context context) {
         // If SPE is not enabled, force to schedule the job with the old JobService.
         if (!FlagsFactory.getFlags().getSpeOnAggregateErrorDataReportingJobEnabled()) {
-            sLogger.d("SPE is not enabled. Schedule the job with"
-                    + " AggregateErrorDataReportingService.");
+            sLogger.d(
+                    "SPE is not enabled. Schedule the job with"
+                            + " AggregateErrorDataReportingService.");
 
-            int resultCode = AggregateErrorDataReportingService
-                    .scheduleIfNeeded(context, /* forceSchedule */ false);
+            int resultCode =
+                    AggregateErrorDataReportingService.scheduleIfNeeded(
+                            context, /* forceSchedule */ false);
             OdpJobServiceFactory.getInstance(context)
                     .getJobSchedulingLogger()
                     .recordOnSchedulingLegacy(AGGREGATE_ERROR_DATA_REPORTING_JOB_ID, resultCode);
diff --git a/src/com/android/ondevicepersonalization/services/data/user/UserDataCollectionJob.java b/src/com/android/ondevicepersonalization/services/data/user/UserDataCollectionJob.java
index 3d7a6b2..e20b22a 100644
--- a/src/com/android/ondevicepersonalization/services/data/user/UserDataCollectionJob.java
+++ b/src/com/android/ondevicepersonalization/services/data/user/UserDataCollectionJob.java
@@ -107,6 +107,11 @@
         return new BackoffPolicy.Builder().setShouldRetryOnExecutionStop(true).build();
     }
 
+    @Override
+    public String getJobPolicyString(int jobId) {
+        return FlagsFactory.getFlags().getUserDataCollectionJobPolicy();
+    }
+
     /** Schedules a unique instance of {@link UserDataCollectionJob}. */
     public static void schedule(Context context) {
         // If SPE is not enabled, force to schedule the job with the old JobService.
diff --git a/src/com/android/ondevicepersonalization/services/download/OnDevicePersonalizationDownloadProcessingJob.java b/src/com/android/ondevicepersonalization/services/download/OnDevicePersonalizationDownloadProcessingJob.java
index d07e8ae..6cbdf24 100644
--- a/src/com/android/ondevicepersonalization/services/download/OnDevicePersonalizationDownloadProcessingJob.java
+++ b/src/com/android/ondevicepersonalization/services/download/OnDevicePersonalizationDownloadProcessingJob.java
@@ -122,15 +122,22 @@
         return new BackoffPolicy.Builder().setShouldRetryOnExecutionStop(true).build();
     }
 
+    @Override
+    public String getJobPolicyString(int jobId) {
+        return FlagsFactory.getFlags().getDownloadProcessingJobPolicy();
+    }
+
     /** Schedules a unique instance of {@link OnDevicePersonalizationDownloadProcessingJob}. */
     public static void schedule(Context context) {
         // If SPE is not enabled, force to schedule the job with the old JobService.
         if (!FlagsFactory.getFlags().getSpeOnOdpDownloadProcessingJobEnabled()) {
-            sLogger.d("SPE is not enabled. Schedule the job with "
-                    + "OnDevicePersonalizationDownloadProcessingJobService.");
+            sLogger.d(
+                    "SPE is not enabled. Schedule the job with "
+                            + "OnDevicePersonalizationDownloadProcessingJobService.");
 
-            int resultCode = OnDevicePersonalizationDownloadProcessingJobService.schedule(
-                    context, /* forceSchedule */ false);
+            int resultCode =
+                    OnDevicePersonalizationDownloadProcessingJobService.schedule(
+                            context, /* forceSchedule */ false);
             OdpJobServiceFactory.getInstance(context)
                     .getJobSchedulingLogger()
                     .recordOnSchedulingLegacy(DOWNLOAD_PROCESSING_TASK_JOB_ID, resultCode);
diff --git a/src/com/android/ondevicepersonalization/services/download/mdd/MddJob.java b/src/com/android/ondevicepersonalization/services/download/mdd/MddJob.java
index 62d12dc..3c1cd6a 100644
--- a/src/com/android/ondevicepersonalization/services/download/mdd/MddJob.java
+++ b/src/com/android/ondevicepersonalization/services/download/mdd/MddJob.java
@@ -16,13 +16,17 @@
 
 package com.android.ondevicepersonalization.services.download.mdd;
 
-
 import static com.android.adservices.shared.spe.JobServiceConstants.JOB_ENABLED_STATUS_DISABLED_FOR_KILL_SWITCH_ON;
 import static com.android.adservices.shared.spe.JobServiceConstants.JOB_ENABLED_STATUS_DISABLED_FOR_USER_CONSENT_REVOKED;
 import static com.android.adservices.shared.spe.JobServiceConstants.JOB_ENABLED_STATUS_ENABLED;
+import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.MDD_CELLULAR_CHARGING_PERIODIC_TASK_JOB_ID;
+import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.MDD_CHARGING_PERIODIC_TASK_JOB_ID;
+import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.MDD_MAINTENANCE_PERIODIC_TASK_JOB_ID;
+import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.MDD_WIFI_CHARGING_PERIODIC_TASK_JOB_ID;
 
 import static com.google.android.libraries.mobiledatadownload.TaskScheduler.WIFI_CHARGING_PERIODIC_TASK;
 
+import android.annotation.Nullable;
 import android.content.Context;
 
 import com.android.adservices.shared.spe.framework.ExecutionResult;
@@ -121,4 +125,22 @@
     public BackoffPolicy getBackoffPolicy() {
         return new BackoffPolicy.Builder().setShouldRetryOnExecutionStop(true).build();
     }
+
+    @Override
+    @Nullable
+    public String getJobPolicyString(int jobId) {
+        Flags flags = FlagsFactory.getFlags();
+
+        if (jobId == MDD_MAINTENANCE_PERIODIC_TASK_JOB_ID) {
+            return flags.getMddMaintenanceJobPolicy();
+        } else if (jobId == MDD_CHARGING_PERIODIC_TASK_JOB_ID) {
+            return flags.getMddChargingJobPolicy();
+        } else if (jobId == MDD_CELLULAR_CHARGING_PERIODIC_TASK_JOB_ID) {
+            return flags.getMddCellularChargingJobPolicy();
+        } else if (jobId == MDD_WIFI_CHARGING_PERIODIC_TASK_JOB_ID) {
+            return flags.getMddWifiChargingJobPolicy();
+        }
+
+        return null;
+    }
 }
diff --git a/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJob.java b/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJob.java
index e83315c..c2aac9a 100644
--- a/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJob.java
+++ b/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJob.java
@@ -88,6 +88,11 @@
         return new BackoffPolicy.Builder().setShouldRetryOnExecutionStop(true).build();
     }
 
+    @Override
+    public String getJobPolicyString(int jobId) {
+        return FlagsFactory.getFlags().getMaintenanceJobPolicy();
+    }
+
     /** Schedules a unique instance of {@link OnDevicePersonalizationMaintenanceJob}. */
     public static void schedule(Context context) {
         // If SPE is not enabled, force to schedule the job with the old JobService.
diff --git a/src/com/android/ondevicepersonalization/services/reset/ResetDataJob.java b/src/com/android/ondevicepersonalization/services/reset/ResetDataJob.java
index 02452cf..9a09624 100644
--- a/src/com/android/ondevicepersonalization/services/reset/ResetDataJob.java
+++ b/src/com/android/ondevicepersonalization/services/reset/ResetDataJob.java
@@ -110,6 +110,11 @@
         return new BackoffPolicy.Builder().setShouldRetryOnExecutionStop(true).build();
     }
 
+    @Override
+    public String getJobPolicyString(int jobId) {
+        return FlagsFactory.getFlags().getResetDataJobPolicy();
+    }
+
     @VisibleForTesting
     void deleteMeasurementData() {
         ResetDataTask.deleteMeasurementData();
diff --git a/tests/federatedcomputetests/src/com/android/federatedcompute/services/encryption/BackgroundKeyFetchJobTest.java b/tests/federatedcomputetests/src/com/android/federatedcompute/services/encryption/BackgroundKeyFetchJobTest.java
index 03ac6b3..13b5669 100644
--- a/tests/federatedcomputetests/src/com/android/federatedcompute/services/encryption/BackgroundKeyFetchJobTest.java
+++ b/tests/federatedcomputetests/src/com/android/federatedcompute/services/encryption/BackgroundKeyFetchJobTest.java
@@ -25,6 +25,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
 import static com.android.federatedcompute.services.common.FederatedComputeJobInfo.ENCRYPTION_KEY_FETCH_JOB_ID;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.junit.Assert.assertThrows;
@@ -238,6 +239,16 @@
                 .isEqualTo(expectedBackoffPolicy);
     }
 
+    @Test
+    public void testGetJobPolicyString() {
+        String testPolicyString = "test_string";
+
+        when(mMockFlags.getBackgroundKeyFetchJobPolicy()).thenReturn(testPolicyString);
+
+        assertThat(mBackgroundKeyFetchJob.getJobPolicyString(/* jobId= */ 0))
+                .isEqualTo(testPolicyString);
+    }
+
     public class TestInjector extends BackgroundKeyFetchJob.Injector {
         @Override
         ListeningExecutorService getLightWeightExecutor() {
diff --git a/tests/federatedcomputetests/src/com/android/federatedcompute/services/scheduling/DeleteExpiredJobTest.java b/tests/federatedcomputetests/src/com/android/federatedcompute/services/scheduling/DeleteExpiredJobTest.java
index 4067e76..a70e4b1 100644
--- a/tests/federatedcomputetests/src/com/android/federatedcompute/services/scheduling/DeleteExpiredJobTest.java
+++ b/tests/federatedcomputetests/src/com/android/federatedcompute/services/scheduling/DeleteExpiredJobTest.java
@@ -27,6 +27,7 @@
 import static com.android.federatedcompute.services.common.Flags.DEFAULT_TASK_HISTORY_TTL_MILLIS;
 import static com.android.federatedcompute.services.common.Flags.ODP_AUTHORIZATION_TOKEN_DELETION_PERIOD_SECONDs;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -195,6 +196,16 @@
                 .isEqualTo(new JobSpec.Builder(expectedJobPolicy).build());
     }
 
+    @Test
+    public void testGetJobPolicyString() {
+        String testPolicyString = "test_string";
+
+        when(mMockFlags.getDeleteExpiredDataJobPolicy()).thenReturn(testPolicyString);
+
+        assertThat(mDeleteExpiredJob.getJobPolicyString(/* jobId= */ 0))
+                .isEqualTo(testPolicyString);
+    }
+
     private class TestInjector extends Injector {
         @Override
         ListeningExecutorService getExecutor() {
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/errors/AggregateErrorDataReportingJobTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/errors/AggregateErrorDataReportingJobTest.java
index 40eb693..7656b38 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/errors/AggregateErrorDataReportingJobTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/errors/AggregateErrorDataReportingJobTest.java
@@ -26,6 +26,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
 import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.AGGREGATE_ERROR_DATA_REPORTING_JOB_ID;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -81,18 +82,12 @@
     private static final Context sContext = ApplicationProvider.getApplicationContext();
 
     private AggregateErrorDataReportingJob mSpyAggregateErrorDataReportingJob;
-    @Mock
-    private Flags mMockFlags;
-    @Mock
-    private ExecutionRuntimeParameters mMockParams;
-    @Mock
-    private OdpJobScheduler mMockOdpJobScheduler;
-    @Mock
-    private OdpJobServiceFactory mMockOdpJobServiceFactory;
-    @Mock
-    private AggregatedErrorReportingWorker mMockReportingWorker;
-    @Mock
-    private OdpEncryptionKeyManager mMockEncryptionKeyManager;
+    @Mock private Flags mMockFlags;
+    @Mock private ExecutionRuntimeParameters mMockParams;
+    @Mock private OdpJobScheduler mMockOdpJobScheduler;
+    @Mock private OdpJobServiceFactory mMockOdpJobServiceFactory;
+    @Mock private AggregatedErrorReportingWorker mMockReportingWorker;
+    @Mock private OdpEncryptionKeyManager mMockEncryptionKeyManager;
 
     @Before
     public void setup() throws Exception {
@@ -121,8 +116,7 @@
 
     @Test
     public void testGetExecutionFuture_encryptedFlow() throws Exception {
-        when(mMockFlags.getAllowUnencryptedAggregatedErrorReportingPayload())
-                .thenReturn(false);
+        when(mMockFlags.getAllowUnencryptedAggregatedErrorReportingPayload()).thenReturn(false);
         when(mMockReportingWorker.reportAggregateErrors(any(), any()))
                 .thenReturn(Futures.immediateVoidFuture());
         when(mMockEncryptionKeyManager.fetchAndPersistActiveKeys(anyInt(), anyBoolean(), any()))
@@ -184,16 +178,21 @@
 
         JobSchedulingLogger loggerMock = mock(JobSchedulingLogger.class);
         when(mMockOdpJobServiceFactory.getJobSchedulingLogger()).thenReturn(loggerMock);
-        doReturn(resultCode).when(() -> AggregateErrorDataReportingService
-                .scheduleIfNeeded(any(), /* forceSchedule */ eq(false)));
+        doReturn(resultCode)
+                .when(
+                        () ->
+                                AggregateErrorDataReportingService.scheduleIfNeeded(
+                                        any(), /* forceSchedule */ eq(false)));
 
         AggregateErrorDataReportingJob.schedule(sContext);
 
         verify(mMockOdpJobScheduler, never()).schedule(eq(sContext), any());
-        verify(() -> AggregateErrorDataReportingService
-                .scheduleIfNeeded(any(), /* forceSchedule */ eq(false)));
-        verify(loggerMock).recordOnSchedulingLegacy(AGGREGATE_ERROR_DATA_REPORTING_JOB_ID,
-                resultCode);
+        verify(
+                () ->
+                        AggregateErrorDataReportingService.scheduleIfNeeded(
+                                any(), /* forceSchedule */ eq(false)));
+        verify(loggerMock)
+                .recordOnSchedulingLegacy(AGGREGATE_ERROR_DATA_REPORTING_JOB_ID, resultCode);
     }
 
     @Test
@@ -206,10 +205,13 @@
                         .setRequireStorageNotLow(true)
                         .setNetworkType(NETWORK_TYPE_UNMETERED)
                         .setPeriodicJobParams(
-                                JobPolicy.PeriodicJobParams.newBuilder().setPeriodicIntervalMs(
-                                        mMockFlags.getAggregatedErrorReportingIntervalInHours()
-                                                * 1000L * 3600L
-                                        ).build())
+                                JobPolicy.PeriodicJobParams.newBuilder()
+                                        .setPeriodicIntervalMs(
+                                                mMockFlags
+                                                                .getAggregatedErrorReportingIntervalInHours()
+                                                        * 1000L
+                                                        * 3600L)
+                                        .build())
                         .setIsPersisted(true)
                         .build();
 
@@ -228,6 +230,16 @@
                 .isEqualTo(expectedBackoffPolicy);
     }
 
+    @Test
+    public void testGetJobPolicyString() {
+        String testPolicyString = "test_string";
+
+        when(mMockFlags.getAggregateErrorDataReportingJobPolicy()).thenReturn(testPolicyString);
+
+        assertThat(mSpyAggregateErrorDataReportingJob.getJobPolicyString(/* jobId= */ 0))
+                .isEqualTo(testPolicyString);
+    }
+
     public class TestInjector extends AggregateErrorDataReportingJob.Injector {
         @Override
         ListeningExecutorService getExecutor() {
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/user/UserDataCollectionJobTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/user/UserDataCollectionJobTest.java
index e1145d2..e0135ef 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/user/UserDataCollectionJobTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/user/UserDataCollectionJobTest.java
@@ -27,6 +27,7 @@
 import static com.android.modules.utils.testing.ExtendedMockitoRule.MockStatic;
 import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.USER_DATA_COLLECTION_ID;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -217,11 +218,22 @@
                 .isEqualTo(expectedBackoffPolicy);
     }
 
+    @Test
+    public void testGetJobPolicyString() {
+        String testPolicyString = "test_string";
+
+        when(mMockFlags.getUserDataCollectionJobPolicy()).thenReturn(testPolicyString);
+
+        assertThat(mSpyUserDataCollectionJob.getJobPolicyString(/* jobId= */ 0))
+                .isEqualTo(testPolicyString);
+    }
+
     public class TestInjector extends UserDataCollectionJob.Injector {
         @Override
         ListeningExecutorService getExecutor() {
             return MoreExecutors.newDirectExecutorService();
         }
+
         @Override
         Flags getFlags() {
             return mMockFlags;
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/download/OnDevicePersonalizationDownloadProcessingJobTests.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/download/OnDevicePersonalizationDownloadProcessingJobTests.java
index 779c548..2236431 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/download/OnDevicePersonalizationDownloadProcessingJobTests.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/download/OnDevicePersonalizationDownloadProcessingJobTests.java
@@ -25,6 +25,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
 import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.DOWNLOAD_PROCESSING_TASK_JOB_ID;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -202,4 +203,14 @@
                 .that(new OnDevicePersonalizationDownloadProcessingJob().getBackoffPolicy())
                 .isEqualTo(expectedBackoffPolicy);
     }
+
+    @Test
+    public void testGetJobPolicyString() {
+        String testPolicyString = "test_string";
+
+        when(mMockFlags.getDownloadProcessingJobPolicy()).thenReturn(testPolicyString);
+
+        assertThat(mSpyOdpDownloadProcessingJob.getJobPolicyString(/* jobId= */ 0))
+                .isEqualTo(testPolicyString);
+    }
 }
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/download/mdd/MddJobTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/download/mdd/MddJobTest.java
index ac7736f..50b73f4 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/download/mdd/MddJobTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/download/mdd/MddJobTest.java
@@ -21,9 +21,14 @@
 import static com.android.adservices.shared.spe.JobServiceConstants.JOB_ENABLED_STATUS_ENABLED;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.MDD_CELLULAR_CHARGING_PERIODIC_TASK_JOB_ID;
+import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.MDD_CHARGING_PERIODIC_TASK_JOB_ID;
+import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.MDD_MAINTENANCE_PERIODIC_TASK_JOB_ID;
+import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.MDD_WIFI_CHARGING_PERIODIC_TASK_JOB_ID;
 
 import static com.google.android.libraries.mobiledatadownload.TaskScheduler.CHARGING_PERIODIC_TASK;
 import static com.google.android.libraries.mobiledatadownload.TaskScheduler.WIFI_CHARGING_PERIODIC_TASK;
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.common.util.concurrent.Futures.immediateVoidFuture;
 
@@ -73,18 +78,12 @@
     private static final Context sContext = ApplicationProvider.getApplicationContext();
 
     private MddJob mMddJobChargingPeriodic;
-    @Mock
-    private Flags mMockFlags;
-    @Mock
-    private UserPrivacyStatus mMockUserPrivacyStatus;
-    @Mock
-    private MobileDataDownload mMockMobileDataDownload;
-    @Mock
-    private ExecutionRuntimeParameters mMockParams;
-    @Mock
-    private OdpJobScheduler mMockOdpJobScheduler;
-    @Mock
-    private OdpJobServiceFactory mMockOdpJobServiceFactory;
+    @Mock private Flags mMockFlags;
+    @Mock private UserPrivacyStatus mMockUserPrivacyStatus;
+    @Mock private MobileDataDownload mMockMobileDataDownload;
+    @Mock private ExecutionRuntimeParameters mMockParams;
+    @Mock private OdpJobScheduler mMockOdpJobScheduler;
+    @Mock private OdpJobServiceFactory mMockOdpJobServiceFactory;
 
     @Before
     public void setup() throws Exception {
@@ -102,8 +101,7 @@
         ListenableFuture<ExecutionResult> executionFuture =
                 mMddJobChargingPeriodic.getExecutionFuture(sContext, mMockParams);
 
-        assertWithMessage(
-                "testGetExecutionFuture_executionSuccess()")
+        assertWithMessage("testGetExecutionFuture_executionSuccess()")
                 .that(executionFuture.get())
                 .isEqualTo(ExecutionResult.SUCCESS);
         verify(() -> OnDevicePersonalizationDownloadProcessingJob.schedule(any()), never());
@@ -115,8 +113,7 @@
         ListenableFuture<ExecutionResult> executionFuture =
                 mddWifiChargingPeriodicJob.getExecutionFuture(sContext, mMockParams);
 
-        assertWithMessage(
-                "testGetExecutionFuture_wifiChargingPeriodic_scheduleDownloadJob()")
+        assertWithMessage("testGetExecutionFuture_wifiChargingPeriodic_scheduleDownloadJob()")
                 .that(executionFuture.get())
                 .isEqualTo(ExecutionResult.SUCCESS);
         verify(() -> OnDevicePersonalizationDownloadProcessingJob.schedule(any()));
@@ -129,7 +126,7 @@
                 mMddJobChargingPeriodic.getExecutionStopFuture(sContext, mMockParams);
 
         assertWithMessage(
-                "testGetExecutionStopFuture_notWifiChargingPeriodic_dontScheduleDownloadJob()")
+                        "testGetExecutionStopFuture_notWifiChargingPeriodic_dontScheduleDownloadJob()")
                 .that(executionFuture.get())
                 .isNull();
         verify(() -> OnDevicePersonalizationDownloadProcessingJob.schedule(any()), never());
@@ -142,8 +139,7 @@
         ListenableFuture<Void> executionFuture =
                 mddWifiChargingPeriodicJob.getExecutionStopFuture(sContext, mMockParams);
 
-        assertWithMessage(
-                "testGetExecutionStopFuture_wifiChargingPeriodic_scheduleDownloadJob()")
+        assertWithMessage("testGetExecutionStopFuture_wifiChargingPeriodic_scheduleDownloadJob()")
                 .that(executionFuture.get())
                 .isNull();
         verify(() -> OnDevicePersonalizationDownloadProcessingJob.schedule(any()));
@@ -153,8 +149,8 @@
     public void testGetJobEnablementStatus_enabled() {
         when(mMockFlags.getGlobalKillSwitch()).thenReturn(false);
         when(mMockFlags.getSpeOnMddJobEnabled()).thenReturn(true);
-        when(mMockUserPrivacyStatus
-                .isProtectedAudienceAndMeasurementBothDisabled()).thenReturn(false);
+        when(mMockUserPrivacyStatus.isProtectedAudienceAndMeasurementBothDisabled())
+                .thenReturn(false);
 
         assertWithMessage("testGetJobEnablementStatus_enabled()")
                 .that(mMddJobChargingPeriodic.getJobEnablementStatus())
@@ -165,8 +161,8 @@
     public void testGetJobEnablementStatus_disabled_globalKillSwitch() {
         when(mMockFlags.getGlobalKillSwitch()).thenReturn(true);
         when(mMockFlags.getSpeOnMddJobEnabled()).thenReturn(true);
-        when(mMockUserPrivacyStatus
-                .isProtectedAudienceAndMeasurementBothDisabled()).thenReturn(false);
+        when(mMockUserPrivacyStatus.isProtectedAudienceAndMeasurementBothDisabled())
+                .thenReturn(false);
 
         assertWithMessage("testGetJobEnablementStatus_disabled_globalKillSwitch()")
                 .that(mMddJobChargingPeriodic.getJobEnablementStatus())
@@ -177,8 +173,8 @@
     public void testGetJobEnablementStatus_disabled_speOff() {
         when(mMockFlags.getGlobalKillSwitch()).thenReturn(false);
         when(mMockFlags.getSpeOnMddJobEnabled()).thenReturn(false);
-        when(mMockUserPrivacyStatus
-                .isProtectedAudienceAndMeasurementBothDisabled()).thenReturn(false);
+        when(mMockUserPrivacyStatus.isProtectedAudienceAndMeasurementBothDisabled())
+                .thenReturn(false);
 
         assertWithMessage("testGetJobEnablementStatus_disabled_speOff()")
                 .that(mMddJobChargingPeriodic.getJobEnablementStatus())
@@ -189,11 +185,11 @@
     public void testGetJobEnablementStatus_disabled_noMeasurementNorProtectedAudienceConsent() {
         when(mMockFlags.getGlobalKillSwitch()).thenReturn(false);
         when(mMockFlags.getSpeOnMddJobEnabled()).thenReturn(true);
-        when(mMockUserPrivacyStatus
-                .isProtectedAudienceAndMeasurementBothDisabled()).thenReturn(true);
+        when(mMockUserPrivacyStatus.isProtectedAudienceAndMeasurementBothDisabled())
+                .thenReturn(true);
 
         assertWithMessage(
-                "testGetJobEnablementStatus_disabled_noMeasurementNorProtectedAudienceConsent()")
+                        "testGetJobEnablementStatus_disabled_noMeasurementNorProtectedAudienceConsent()")
                 .that(mMddJobChargingPeriodic.getJobEnablementStatus())
                 .isEqualTo(JOB_ENABLED_STATUS_DISABLED_FOR_USER_CONSENT_REVOKED);
     }
@@ -208,6 +204,36 @@
                 .isEqualTo(expectedBackoffPolicy);
     }
 
+    @Test
+    public void testGetJobPolicyString() {
+        String testMddMaintenanceJobPolicyString = "mdd_maintenance_job_policy_string";
+        String testMddChargingJobPolicyString = "mdd_charging_job_policy_string";
+        String testMddCellularChargingJobPolicyString = "mdd_cellular_charging_job_policy_string";
+        String testMddWifiChargingJobPolicyString = "mdd_wifi_charging_job_policy_string";
+
+        when(mMockFlags.getMddMaintenanceJobPolicy()).thenReturn(testMddMaintenanceJobPolicyString);
+        when(mMockFlags.getMddChargingJobPolicy()).thenReturn(testMddChargingJobPolicyString);
+        when(mMockFlags.getMddCellularChargingJobPolicy())
+                .thenReturn(testMddCellularChargingJobPolicyString);
+        when(mMockFlags.getMddWifiChargingJobPolicy())
+                .thenReturn(testMddWifiChargingJobPolicyString);
+
+        assertThat(mMddJobChargingPeriodic.getJobPolicyString(MDD_MAINTENANCE_PERIODIC_TASK_JOB_ID))
+                .isEqualTo(testMddMaintenanceJobPolicyString);
+        assertThat(mMddJobChargingPeriodic.getJobPolicyString(MDD_CHARGING_PERIODIC_TASK_JOB_ID))
+                .isEqualTo(testMddChargingJobPolicyString);
+        assertThat(
+                        mMddJobChargingPeriodic.getJobPolicyString(
+                                MDD_CELLULAR_CHARGING_PERIODIC_TASK_JOB_ID))
+                .isEqualTo(testMddCellularChargingJobPolicyString);
+        assertThat(
+                        mMddJobChargingPeriodic.getJobPolicyString(
+                                MDD_WIFI_CHARGING_PERIODIC_TASK_JOB_ID))
+                .isEqualTo(testMddWifiChargingJobPolicyString);
+
+        assertThat(mMddJobChargingPeriodic.getJobPolicyString(/* jobId= */ 0)).isNull();
+    }
+
     private MddJob createWifiChargingPeriodicMddJob() {
         return new MddJob(WIFI_CHARGING_PERIODIC_TASK);
     }
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobTest.java
index d0019a3..c6c2a8a 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobTest.java
@@ -371,6 +371,16 @@
         assertThat(localDir.listFiles()).hasLength(1);
     }
 
+    @Test
+    public void testGetJobPolicyString() {
+        String testPolicyString = "test_string";
+
+        when(mMockFlags.getMaintenanceJobPolicy()).thenReturn(testPolicyString);
+
+        assertThat(mSpyOnDevicePersonalizationMaintenanceJob.getJobPolicyString(/* jobId= */ 0))
+                .isEqualTo(testPolicyString);
+    }
+
     private static void addTestData(long timestamp, OnDevicePersonalizationVendorDataDao dao) {
         String key1 = "key1";
         String key2 = "key2";
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/reset/ResetDataJobTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/reset/ResetDataJobTest.java
index 3adbe5c..f69a8de 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/reset/ResetDataJobTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/reset/ResetDataJobTest.java
@@ -26,6 +26,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
 import static com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig.RESET_DATA_JOB_ID;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -185,4 +186,13 @@
                 .that(new ResetDataJob().getBackoffPolicy())
                 .isEqualTo(expectedBackoffPolicy);
     }
+
+    @Test
+    public void testGetJobPolicyString() {
+        String testPolicyString = "test_string";
+
+        when(mMockFlags.getResetDataJobPolicy()).thenReturn(testPolicyString);
+
+        assertThat(mSpyResetDataJob.getJobPolicyString(/* jobId= */ 0)).isEqualTo(testPolicyString);
+    }
 }