Make Http request retry limit a read from flags.

Bug: 322865342
Test: atest FederatedComputeServicesTests[com.google.android.ondevicepersonalization.apex]
Change-Id: I56755168b8715dc1284244758b4f3ab3120daa51
diff --git a/federatedcompute/src/com/android/federatedcompute/services/common/Flags.java b/federatedcompute/src/com/android/federatedcompute/services/common/Flags.java
index b7bcfce..e42ebf0 100644
--- a/federatedcompute/src/com/android/federatedcompute/services/common/Flags.java
+++ b/federatedcompute/src/com/android/federatedcompute/services/common/Flags.java
@@ -178,4 +178,10 @@
     default Long getAuthorizationTokenDeletionPeriodSeconds() {
         return ODP_AUTHORIZATION_TOKEN_DELETION_PERIOD_SECONDs;
     }
+
+    int HTTP_REQUEST_RETRY_LIMIT = 3;
+
+    default int getHttpRequestRetryLimit() {
+        return HTTP_REQUEST_RETRY_LIMIT;
+    }
 }
diff --git a/federatedcompute/src/com/android/federatedcompute/services/common/PhFlags.java b/federatedcompute/src/com/android/federatedcompute/services/common/PhFlags.java
index d0e8cc1..185948d 100644
--- a/federatedcompute/src/com/android/federatedcompute/services/common/PhFlags.java
+++ b/federatedcompute/src/com/android/federatedcompute/services/common/PhFlags.java
@@ -41,6 +41,9 @@
 
     static final String ENABLE_BACKGROUND_ENCRYPTION_KEY_FETCH =
             "enable_background_encryption_key_fetch";
+
+    static final String HTTP_REQUEST_RETRY_LIMIT_CONFIG_NAME =
+            "http_request_retry_limit";
     private static final PhFlags sSingleton = new PhFlags();
 
     /** Returns the singleton instance of the PhFlags. */
@@ -82,4 +85,12 @@
                 /* name= */ ENABLE_BACKGROUND_ENCRYPTION_KEY_FETCH,
                 /* defaultValue= */ USE_BACKGROUND_ENCRYPTION_KEY_FETCH);
     }
+
+    @Override
+    public int getHttpRequestRetryLimit() {
+        return DeviceConfig.getInt(
+                /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                /* name= */ HTTP_REQUEST_RETRY_LIMIT_CONFIG_NAME,
+                /* defaultValue= */ HTTP_REQUEST_RETRY_LIMIT);
+    }
 }
diff --git a/federatedcompute/src/com/android/federatedcompute/services/http/HttpClient.java b/federatedcompute/src/com/android/federatedcompute/services/http/HttpClient.java
index acbd8c0..5bfd162 100644
--- a/federatedcompute/src/com/android/federatedcompute/services/http/HttpClient.java
+++ b/federatedcompute/src/com/android/federatedcompute/services/http/HttpClient.java
@@ -23,6 +23,8 @@
 import android.annotation.Nullable;
 
 import com.android.federatedcompute.internal.util.LogUtil;
+import com.android.federatedcompute.services.common.Flags;
+import com.android.federatedcompute.services.common.PhFlags;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.util.concurrent.Futures;
@@ -45,11 +47,13 @@
  */
 public class HttpClient {
     private static final String TAG = HttpClient.class.getSimpleName();
-    private static final int RETRY_LIMIT = 3;
     private static final int NETWORK_CONNECT_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(5);
     private static final int NETWORK_READ_TIMEOUT_MS = (int) TimeUnit.SECONDS.toMillis(30);
+    private final Flags mFlags;
 
-    public HttpClient() {}
+    public HttpClient() {
+        mFlags = PhFlags.getInstance();
+    }
 
     @NonNull
     @VisibleForTesting
@@ -81,7 +85,8 @@
             throws IOException {
         int count = 0;
         FederatedComputeHttpResponse response = null;
-        while (count < RETRY_LIMIT) {
+        int retryLimit = mFlags.getHttpRequestRetryLimit();
+        while (count < retryLimit) {
             try {
                 response = performRequest(request);
                 if (HTTP_OK_STATUS.contains(response.getStatusCode())) {
@@ -90,7 +95,7 @@
                 // we want to continue retry in case it is IO exception.
             } catch (IOException e) {
                 // propagate IO exception after RETRY_LIMIT times attempt.
-                if (count >= RETRY_LIMIT - 1) {
+                if (count >= retryLimit - 1) {
                     throw e;
                 }
             } finally {
diff --git a/tests/federatedcomputetests/src/com/android/federatedcompute/services/common/PhFlagsTest.java b/tests/federatedcomputetests/src/com/android/federatedcompute/services/common/PhFlagsTest.java
index 9765124..92900d8 100644
--- a/tests/federatedcomputetests/src/com/android/federatedcompute/services/common/PhFlagsTest.java
+++ b/tests/federatedcomputetests/src/com/android/federatedcompute/services/common/PhFlagsTest.java
@@ -17,15 +17,18 @@
 package com.android.federatedcompute.services.common;
 
 import static com.android.federatedcompute.services.common.Flags.FEDERATED_COMPUTE_GLOBAL_KILL_SWITCH;
+import static com.android.federatedcompute.services.common.Flags.HTTP_REQUEST_RETRY_LIMIT;
 import static com.android.federatedcompute.services.common.Flags.USE_BACKGROUND_ENCRYPTION_KEY_FETCH;
 import static com.android.federatedcompute.services.common.PhFlags.ENABLE_BACKGROUND_ENCRYPTION_KEY_FETCH;
 import static com.android.federatedcompute.services.common.PhFlags.FEDERATED_COMPUTATION_ENCRYPTION_KEY_DOWNLOAD_URL;
+import static com.android.federatedcompute.services.common.PhFlags.HTTP_REQUEST_RETRY_LIMIT_CONFIG_NAME;
 import static com.android.federatedcompute.services.common.PhFlags.KEY_FEDERATED_COMPUTE_KILL_SWITCH;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import android.provider.DeviceConfig;
 
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -40,6 +43,24 @@
         PhFlagsTestUtil.setUpDeviceConfigPermissions();
     }
 
+    /**
+     * Roll flags back to their default values.
+     */
+    @AfterClass
+    public static void tearDown() {
+        // roll back to default value.
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                HTTP_REQUEST_RETRY_LIMIT_CONFIG_NAME,
+                Integer.toString(HTTP_REQUEST_RETRY_LIMIT),
+                /* makeDefault= */ false);
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                ENABLE_BACKGROUND_ENCRYPTION_KEY_FETCH,
+                Boolean.toString(USE_BACKGROUND_ENCRYPTION_KEY_FETCH),
+                /* makeDefault= */ false);
+    }
+
     @Test
     public void testGetGlobalKillSwitch() {
         // Without any overriding, the value is the hard coded constant.
@@ -52,7 +73,7 @@
                 .isEqualTo(FEDERATED_COMPUTE_GLOBAL_KILL_SWITCH);
 
         // Now overriding with the value from PH.
-        final boolean phOverridingValue = true;
+        final boolean phOverridingValue = !FEDERATED_COMPUTE_GLOBAL_KILL_SWITCH;
         DeviceConfig.setProperty(
                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
                 KEY_FEDERATED_COMPUTE_KILL_SWITCH,
@@ -89,7 +110,7 @@
                 .isEqualTo(USE_BACKGROUND_ENCRYPTION_KEY_FETCH);
 
         // Now overriding the value from PH.
-        boolean overrideEnableBackgroundKeyFetch = false;
+        boolean overrideEnableBackgroundKeyFetch = !USE_BACKGROUND_ENCRYPTION_KEY_FETCH;
         DeviceConfig.setProperty(
                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
                 ENABLE_BACKGROUND_ENCRYPTION_KEY_FETCH,
@@ -101,4 +122,28 @@
                 .isEqualTo(overrideEnableBackgroundKeyFetch);
 
     }
+
+    @Test
+    public void testGetHttpRequestRetryLimit() {
+        // Without Overriding
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                HTTP_REQUEST_RETRY_LIMIT_CONFIG_NAME,
+                Integer.toString(HTTP_REQUEST_RETRY_LIMIT),
+                /* makeDefault= */ false);
+        assertThat(FlagsFactory.getFlags().getHttpRequestRetryLimit())
+                .isEqualTo(HTTP_REQUEST_RETRY_LIMIT);
+
+        // Now overriding the value from PH.
+        int overrideHttpRequestRetryLimit = 4;
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
+                HTTP_REQUEST_RETRY_LIMIT_CONFIG_NAME,
+                Integer.toString(overrideHttpRequestRetryLimit),
+                /* makeDefault= */ false);
+
+        Flags phFlags = FlagsFactory.getFlags();
+        assertThat(phFlags.getHttpRequestRetryLimit())
+                .isEqualTo(overrideHttpRequestRetryLimit);
+    }
 }