• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.ondevicepersonalization.services;
18 
19 import static com.android.adservices.shared.common.flags.ModuleSharedFlags.BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
20 import static com.android.adservices.shared.common.flags.ModuleSharedFlags.DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
21 import static com.android.ondevicepersonalization.services.Flags.APP_REQUEST_FLOW_DEADLINE_SECONDS;
22 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ADSERVICES_IPC_CALL_TIMEOUT_IN_MILLIS;
23 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_AGGREGATED_ERROR_REPORTING_ENABLED;
24 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_AGGREGATED_ERROR_REPORTING_INTERVAL_HOURS;
25 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_AGGREGATED_ERROR_REPORTING_THRESHOLD;
26 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_AGGREGATED_ERROR_REPORTING_URL_PATH;
27 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_AGGREGATED_ERROR_REPORT_HTTP_RETRY_LIMIT;
28 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_AGGREGATED_ERROR_REPORT_HTTP_TIMEOUT_SECONDS;
29 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_AGGREGATED_ERROR_REPORT_TTL_DAYS;
30 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ALLOW_UNENCRYPTED_AGGREGATED_ERROR_REPORTING_PAYLOAD;
31 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_APP_INSTALL_HISTORY_TTL_MILLIS;
32 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_CALLER_APP_ALLOW_LIST;
33 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_CLIENT_ERROR_LOGGING_ENABLED;
34 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ENCRYPTION_KEY_MAX_AGE_SECONDS;
35 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ENCRYPTION_KEY_URL;
36 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ISOLATED_SERVICE_ALLOW_LIST;
37 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_IS_FEATURE_ENABLED_API_ENABLED;
38 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_AGGREGATE_ERROR_DATA_REPORTING_JOB;
39 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ODP_MODULE_JOB_POLICY;
40 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_OUTPUT_DATA_ALLOW_LIST;
41 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_PLUGIN_PROCESS_RUNNER_ENABLED;
42 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED;
43 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_MDD_JOB;
44 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_ODP_DOWNLOAD_PROCESSING_JOB;
45 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_RESET_DATA_JOB;
46 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_USER_DATA_COLLECTION_JOB;
47 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_SPE_PILOT_JOB_ENABLED;
48 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_TRUSTED_PARTNER_APPS_LIST;
49 import static com.android.ondevicepersonalization.services.Flags.DOWNLOAD_FLOW_DEADLINE_SECONDS;
50 import static com.android.ondevicepersonalization.services.Flags.ENABLE_PERSONALIZATION_STATUS_OVERRIDE;
51 import static com.android.ondevicepersonalization.services.Flags.EXAMPLE_STORE_FLOW_DEADLINE_SECONDS;
52 import static com.android.ondevicepersonalization.services.Flags.GLOBAL_KILL_SWITCH;
53 import static com.android.ondevicepersonalization.services.Flags.IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED;
54 import static com.android.ondevicepersonalization.services.Flags.PERSONALIZATION_STATUS_OVERRIDE_VALUE;
55 import static com.android.ondevicepersonalization.services.Flags.RENDER_FLOW_DEADLINE_SECONDS;
56 import static com.android.ondevicepersonalization.services.Flags.WEB_TRIGGER_FLOW_DEADLINE_SECONDS;
57 import static com.android.ondevicepersonalization.services.Flags.WEB_VIEW_FLOW_DEADLINE_SECONDS;
58 import static com.android.ondevicepersonalization.services.FlagsConstants.APP_INSTALL_HISTORY_TTL;
59 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ADSERVICES_IPC_CALL_TIMEOUT_IN_MILLIS;
60 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_AGGREGATED_ERROR_REPORTING_HTTP_RETRY_LIMIT;
61 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_AGGREGATED_ERROR_REPORTING_HTTP_TIMEOUT_SECONDS;
62 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_AGGREGATED_ERROR_REPORTING_INTERVAL_HOURS;
63 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_AGGREGATED_ERROR_REPORTING_PATH;
64 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_AGGREGATED_ERROR_REPORTING_THRESHOLD;
65 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_AGGREGATED_ERROR_REPORT_TTL_DAYS;
66 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ALLOW_UNENCRYPTED_AGGREGATED_ERROR_REPORTING;
67 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_APP_REQUEST_FLOW_DEADLINE_SECONDS;
68 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_CALLER_APP_ALLOW_LIST;
69 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_DOWNLOAD_FLOW_DEADLINE_SECONDS;
70 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ENABLE_AGGREGATED_ERROR_REPORTING;
71 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ENABLE_PERSONALIZATION_STATUS_OVERRIDE;
72 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ENCRYPTION_KEY_MAX_AGE_SECONDS;
73 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ENCRYPTION_KEY_URL;
74 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_EXAMPLE_STORE_FLOW_DEADLINE_SECONDS;
75 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_GLOBAL_KILL_SWITCH;
76 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ISOLATED_SERVICE_ALLOW_LIST;
77 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ISOLATED_SERVICE_DEBUGGING_ENABLED;
78 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED;
79 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_IS_FEATURE_ENABLED_API_ENABLED;
80 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
81 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_ENABLE_CLIENT_ERROR_LOGGING;
82 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_JOB_SCHEDULING_LOGGING_ENABLED;
83 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
84 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_MODULE_JOB_POLICY;
85 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_SPE_PILOT_JOB_ENABLED;
86 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_OUTPUT_DATA_ALLOW_LIST;
87 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_PERSONALIZATION_STATUS_OVERRIDE_VALUE;
88 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_PLUGIN_PROCESS_RUNNER_ENABLED;
89 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_RENDER_FLOW_DEADLINE_SECONDS;
90 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED;
91 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_AGGREGATE_ERROR_DATA_REPORTING_JOB;
92 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_MDD_JOB;
93 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_ODP_DOWNLOAD_PROCESSING_JOB;
94 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_RESET_DATA_JOB;
95 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_USER_DATA_COLLECTION_JOB;
96 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_TRUSTED_PARTNER_APPS_LIST;
97 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_WEB_TRIGGER_FLOW_DEADLINE_SECONDS;
98 import static com.android.ondevicepersonalization.services.FlagsConstants.KEY_WEB_VIEW_FLOW_DEADLINE_SECONDS;
99 
100 import static com.google.common.truth.Truth.assertThat;
101 
102 import android.provider.DeviceConfig;
103 
104 import androidx.test.ext.junit.runners.AndroidJUnit4;
105 
106 import com.android.modules.utils.build.SdkLevel;
107 import com.android.modules.utils.testing.TestableDeviceConfig;
108 
109 import org.junit.Before;
110 import org.junit.Ignore;
111 import org.junit.Rule;
112 import org.junit.Test;
113 import org.junit.runner.RunWith;
114 
115 import java.util.function.Supplier;
116 
117 /** Unit tests for {@link com.android.ondevicepersonalization.services.PhFlags} */
118 @RunWith(AndroidJUnit4.class)
119 @Ignore("b/375661140")
120 public class PhFlagsTest {
121     @Rule
122     public final TestableDeviceConfig.TestableDeviceConfigRule mDeviceConfigRule =
123             new TestableDeviceConfig.TestableDeviceConfigRule();
124 
125     /**
126      * Get necessary permissions to access Setting.Config API and set up context
127      */
128     @Before
setUpContext()129     public void setUpContext() throws Exception {
130         PhFlagsTestUtil.setUpDeviceConfigPermissions();
131     }
132 
133     @Test
testGetGlobalKillSwitch()134     public void testGetGlobalKillSwitch() {
135         // Without any overriding, the value is the hard coded constant.
136         DeviceConfig.setProperty(
137                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
138                 KEY_GLOBAL_KILL_SWITCH,
139                 Boolean.toString(GLOBAL_KILL_SWITCH),
140                 /* makeDefault */ false);
141         assertThat(FlagsFactory.getFlags().getGlobalKillSwitch()).isEqualTo(GLOBAL_KILL_SWITCH);
142 
143         // Now overriding with the value from PH.
144         final boolean phOverridingValue = true;
145         DeviceConfig.setProperty(
146                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
147                 KEY_GLOBAL_KILL_SWITCH,
148                 Boolean.toString(phOverridingValue),
149                 /* makeDefault */ false);
150 
151         Flags phFlags = FlagsFactory.getFlags();
152         assertThat(phFlags.getGlobalKillSwitch()).isEqualTo(phOverridingValue);
153     }
154 
155     @Test
testIsPersonalizationStatusOverrideEnabled()156     public void testIsPersonalizationStatusOverrideEnabled() {
157         PhFlagsTestUtil.disableGlobalKillSwitch();
158         DeviceConfig.setProperty(
159                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
160                 KEY_ENABLE_PERSONALIZATION_STATUS_OVERRIDE,
161                 Boolean.toString(ENABLE_PERSONALIZATION_STATUS_OVERRIDE),
162                 /* makeDefault */ false);
163         assertThat(FlagsFactory.getFlags().isPersonalizationStatusOverrideEnabled()).isEqualTo(
164                 ENABLE_PERSONALIZATION_STATUS_OVERRIDE);
165 
166         final boolean phOverridingValue = true;
167         DeviceConfig.setProperty(
168                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
169                 KEY_ENABLE_PERSONALIZATION_STATUS_OVERRIDE,
170                 Boolean.toString(phOverridingValue),
171                 /* makeDefault */ false);
172 
173         Flags phFlags = FlagsFactory.getFlags();
174         assertThat(phFlags.isPersonalizationStatusOverrideEnabled()).isEqualTo(phOverridingValue);
175     }
176 
177     @Test
testGetPersonalizationStatusOverrideValue()178     public void testGetPersonalizationStatusOverrideValue() {
179         PhFlagsTestUtil.disableGlobalKillSwitch();
180         DeviceConfig.setProperty(
181                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
182                 KEY_PERSONALIZATION_STATUS_OVERRIDE_VALUE,
183                 Boolean.toString(PERSONALIZATION_STATUS_OVERRIDE_VALUE),
184                 /* makeDefault */ false);
185         assertThat(FlagsFactory.getFlags().getPersonalizationStatusOverrideValue()).isEqualTo(
186                 PERSONALIZATION_STATUS_OVERRIDE_VALUE);
187 
188         final boolean phOverridingValue = true;
189         DeviceConfig.setProperty(
190                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
191                 KEY_PERSONALIZATION_STATUS_OVERRIDE_VALUE,
192                 Boolean.toString(phOverridingValue),
193                 /* makeDefault */ false);
194 
195         Flags phFlags = FlagsFactory.getFlags();
196         assertThat(phFlags.getPersonalizationStatusOverrideValue()).isEqualTo(phOverridingValue);
197     }
198 
199     @Test
testWebTriggerFlowDeadlineSeconds()200     public void testWebTriggerFlowDeadlineSeconds() {
201         assertThat(FlagsFactory.getFlags().getWebTriggerFlowDeadlineSeconds())
202                 .isEqualTo(WEB_TRIGGER_FLOW_DEADLINE_SECONDS);
203 
204         final int test_deadline = 10;
205 
206         DeviceConfig.setProperty(
207                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
208                 KEY_WEB_TRIGGER_FLOW_DEADLINE_SECONDS,
209                 String.valueOf(test_deadline),
210                 /* makeDefault */ false);
211 
212         assertThat(FlagsFactory.getFlags().getWebTriggerFlowDeadlineSeconds())
213                 .isEqualTo(test_deadline);
214 
215         DeviceConfig.setProperty(
216                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
217                 KEY_WEB_TRIGGER_FLOW_DEADLINE_SECONDS,
218                 String.valueOf(WEB_TRIGGER_FLOW_DEADLINE_SECONDS),
219                 /* makeDefault */ false);
220     }
221 
222     @Test
testWebViewFlowDeadlineSeconds()223     public void testWebViewFlowDeadlineSeconds() {
224         assertThat(FlagsFactory.getFlags().getWebViewFlowDeadlineSeconds())
225                 .isEqualTo(WEB_VIEW_FLOW_DEADLINE_SECONDS);
226 
227         final int test_deadline = 10;
228 
229         DeviceConfig.setProperty(
230                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
231                 KEY_WEB_VIEW_FLOW_DEADLINE_SECONDS,
232                 String.valueOf(test_deadline),
233                 /* makeDefault */ false);
234 
235         assertThat(FlagsFactory.getFlags().getWebViewFlowDeadlineSeconds())
236                 .isEqualTo(test_deadline);
237 
238         DeviceConfig.setProperty(
239                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
240                 KEY_WEB_VIEW_FLOW_DEADLINE_SECONDS,
241                 String.valueOf(WEB_VIEW_FLOW_DEADLINE_SECONDS),
242                 /* makeDefault */ false);
243     }
244 
245     @Test
testRenderFlowDeadlineSeconds()246     public void testRenderFlowDeadlineSeconds() {
247         assertThat(FlagsFactory.getFlags().getRenderFlowDeadlineSeconds())
248                 .isEqualTo(RENDER_FLOW_DEADLINE_SECONDS);
249 
250         final int test_deadline = 10;
251 
252         DeviceConfig.setProperty(
253                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
254                 KEY_RENDER_FLOW_DEADLINE_SECONDS,
255                 String.valueOf(test_deadline),
256                 /* makeDefault */ false);
257 
258         assertThat(FlagsFactory.getFlags().getRenderFlowDeadlineSeconds())
259                 .isEqualTo(test_deadline);
260 
261         DeviceConfig.setProperty(
262                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
263                 KEY_RENDER_FLOW_DEADLINE_SECONDS,
264                 String.valueOf(RENDER_FLOW_DEADLINE_SECONDS),
265                 /* makeDefault */ false);
266     }
267 
268     @Test
testAppRequestFlowDeadlineSeconds()269     public void testAppRequestFlowDeadlineSeconds() {
270         assertThat(FlagsFactory.getFlags().getAppRequestFlowDeadlineSeconds())
271                 .isEqualTo(APP_REQUEST_FLOW_DEADLINE_SECONDS);
272 
273         final int test_deadline = 10;
274 
275         DeviceConfig.setProperty(
276                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
277                 KEY_APP_REQUEST_FLOW_DEADLINE_SECONDS,
278                 String.valueOf(test_deadline),
279                 /* makeDefault */ false);
280 
281         assertThat(FlagsFactory.getFlags().getAppRequestFlowDeadlineSeconds())
282                 .isEqualTo(test_deadline);
283 
284         DeviceConfig.setProperty(
285                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
286                 KEY_APP_REQUEST_FLOW_DEADLINE_SECONDS,
287                 String.valueOf(APP_REQUEST_FLOW_DEADLINE_SECONDS),
288                 /* makeDefault */ false);
289     }
290 
291     @Test
testExampleStoreFlowDeadlineSeconds()292     public void testExampleStoreFlowDeadlineSeconds() {
293         assertThat(FlagsFactory.getFlags().getExampleStoreFlowDeadlineSeconds())
294                 .isEqualTo(EXAMPLE_STORE_FLOW_DEADLINE_SECONDS);
295 
296         final int test_deadline = 10;
297 
298         DeviceConfig.setProperty(
299                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
300                 KEY_EXAMPLE_STORE_FLOW_DEADLINE_SECONDS,
301                 String.valueOf(test_deadline),
302                 /* makeDefault */ false);
303 
304         assertThat(FlagsFactory.getFlags().getExampleStoreFlowDeadlineSeconds())
305                 .isEqualTo(test_deadline);
306 
307         DeviceConfig.setProperty(
308                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
309                 KEY_EXAMPLE_STORE_FLOW_DEADLINE_SECONDS,
310                 String.valueOf(EXAMPLE_STORE_FLOW_DEADLINE_SECONDS),
311                 /* makeDefault */ false);
312     }
313 
314     @Test
testDownloadFlowDeadlineSeconds()315     public void testDownloadFlowDeadlineSeconds() {
316         assertThat(FlagsFactory.getFlags().getExampleStoreFlowDeadlineSeconds())
317                 .isEqualTo(DOWNLOAD_FLOW_DEADLINE_SECONDS);
318 
319         final int test_deadline = 10;
320 
321         DeviceConfig.setProperty(
322                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
323                 KEY_DOWNLOAD_FLOW_DEADLINE_SECONDS,
324                 String.valueOf(test_deadline),
325                 /* makeDefault */ false);
326 
327         assertThat(FlagsFactory.getFlags().getDownloadFlowDeadlineSeconds())
328                 .isEqualTo(test_deadline);
329 
330         DeviceConfig.setProperty(
331                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
332                 KEY_DOWNLOAD_FLOW_DEADLINE_SECONDS,
333                 String.valueOf(DOWNLOAD_FLOW_DEADLINE_SECONDS),
334                 /* makeDefault */ false);
335     }
336 
337     @Test
testGetTrustedPartnerAppsList()338     public void testGetTrustedPartnerAppsList() {
339         DeviceConfig.setProperty(
340                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
341                 KEY_TRUSTED_PARTNER_APPS_LIST,
342                 DEFAULT_TRUSTED_PARTNER_APPS_LIST,
343                 /* makeDefault */ false);
344 
345         if (SdkLevel.isAtLeastU()) {
346             assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList())
347                     .isEqualTo(DEFAULT_TRUSTED_PARTNER_APPS_LIST);
348         } else {
349             assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList())
350                     .isEqualTo("");
351         }
352 
353         final String testTrustedPartnerAppsList =
354                 "trusted_test_app_1, trusted_test_app_2, trusted_test_app_3";
355 
356         DeviceConfig.setProperty(
357                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
358                 KEY_TRUSTED_PARTNER_APPS_LIST,
359                 testTrustedPartnerAppsList,
360                 /* makeDefault */ false);
361 
362         if (SdkLevel.isAtLeastU()) {
363             assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList())
364                     .isEqualTo(testTrustedPartnerAppsList);
365         } else {
366             assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList())
367                     .isEqualTo("");
368         }
369     }
370 
371     @Test
testSharedIsolatedProcessFeature()372     public void testSharedIsolatedProcessFeature() {
373         DeviceConfig.setProperty(
374                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
375                 KEY_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED,
376                 Boolean.toString(DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED),
377                 /* makeDefault */ false);
378 
379         if (SdkLevel.isAtLeastU()) {
380             assertThat(FlagsFactory.getFlags().isSharedIsolatedProcessFeatureEnabled())
381                     .isEqualTo(DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED);
382         } else {
383             assertThat(FlagsFactory.getFlags().isSharedIsolatedProcessFeatureEnabled())
384                     .isFalse();
385         }
386 
387         final boolean testIsolatedProcessFeatureEnabled =
388                 !DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED;
389 
390         DeviceConfig.setProperty(
391                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
392                 KEY_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED,
393                 Boolean.toString(testIsolatedProcessFeatureEnabled),
394                 /* makeDefault */ false);
395 
396         if (SdkLevel.isAtLeastU()) {
397             assertThat(FlagsFactory.getFlags().isSharedIsolatedProcessFeatureEnabled())
398                     .isEqualTo(testIsolatedProcessFeatureEnabled);
399         } else {
400             assertThat(FlagsFactory.getFlags().isSharedIsolatedProcessFeatureEnabled())
401                     .isFalse();
402         }
403     }
404 
405     @Test
testGetCallerAppAllowList()406     public void testGetCallerAppAllowList() {
407         DeviceConfig.setProperty(
408                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
409                 KEY_CALLER_APP_ALLOW_LIST,
410                 DEFAULT_CALLER_APP_ALLOW_LIST,
411                 /* makeDefault */ false);
412 
413         assertThat(FlagsFactory.getFlags().getCallerAppAllowList())
414                 .isEqualTo(DEFAULT_CALLER_APP_ALLOW_LIST);
415 
416         final String testCallerAppAllowList =
417                 "com.example.odpclient";
418 
419         DeviceConfig.setProperty(
420                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
421                 KEY_CALLER_APP_ALLOW_LIST,
422                 testCallerAppAllowList,
423                 /* makeDefault */ false);
424 
425         assertThat(FlagsFactory.getFlags().getCallerAppAllowList())
426                 .isEqualTo(testCallerAppAllowList);
427     }
428 
429     @Test
testIsolatedServiceDebuggingEnabled()430     public void testIsolatedServiceDebuggingEnabled() {
431         DeviceConfig.setProperty(
432                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
433                 KEY_ISOLATED_SERVICE_DEBUGGING_ENABLED,
434                 Boolean.toString(false),
435                 /* makeDefault */ false);
436 
437         assertThat(FlagsFactory.getFlags().isIsolatedServiceDebuggingEnabled())
438                 .isEqualTo(false);
439 
440         DeviceConfig.setProperty(
441                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
442                 KEY_ISOLATED_SERVICE_DEBUGGING_ENABLED,
443                 Boolean.toString(true),
444                 /* makeDefault */ false);
445 
446         assertThat(FlagsFactory.getFlags().isIsolatedServiceDebuggingEnabled())
447                 .isEqualTo(true);
448     }
449 
450     @Test
testIsArtImageLoadingOptimizationEnabled()451     public void testIsArtImageLoadingOptimizationEnabled() {
452         assertThat(FlagsFactory.getFlags().isArtImageLoadingOptimizationEnabled())
453                 .isEqualTo(IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED);
454 
455         boolean testValue = !IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED;
456 
457         DeviceConfig.setProperty(
458                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
459                 KEY_IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED,
460                 String.valueOf(testValue),
461                 /* makeDefault */ false);
462 
463         assertThat(FlagsFactory.getFlags().isArtImageLoadingOptimizationEnabled())
464                 .isEqualTo(testValue);
465 
466         DeviceConfig.setProperty(
467                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
468                 KEY_IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED,
469                 String.valueOf(IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED),
470                 /* makeDefault */ false);
471     }
472 
473     @Test
testGetIsolatedServiceAllowList()474     public void testGetIsolatedServiceAllowList() {
475         DeviceConfig.setProperty(
476                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
477                 KEY_ISOLATED_SERVICE_ALLOW_LIST,
478                 DEFAULT_ISOLATED_SERVICE_ALLOW_LIST,
479                 /* makeDefault */ false);
480 
481         assertThat(FlagsFactory.getFlags().getIsolatedServiceAllowList())
482                 .isEqualTo(DEFAULT_ISOLATED_SERVICE_ALLOW_LIST);
483 
484         final String testIsolatedServiceAllowList =
485                 "com.example.odpsamplenetwork";
486 
487         DeviceConfig.setProperty(
488                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
489                 KEY_ISOLATED_SERVICE_ALLOW_LIST,
490                 testIsolatedServiceAllowList,
491                 /* makeDefault */ false);
492 
493         assertThat(FlagsFactory.getFlags().getIsolatedServiceAllowList())
494                 .isEqualTo(testIsolatedServiceAllowList);
495     }
496 
497     @Test
testGetOutputDataAllowList()498     public void testGetOutputDataAllowList() {
499         DeviceConfig.setProperty(
500                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
501                 KEY_OUTPUT_DATA_ALLOW_LIST,
502                 DEFAULT_OUTPUT_DATA_ALLOW_LIST,
503                 /* makeDefault */ false);
504 
505         assertThat(FlagsFactory.getFlags().getOutputDataAllowList())
506                 .isEqualTo(DEFAULT_OUTPUT_DATA_ALLOW_LIST);
507 
508         final String testOutputDataAllowList =
509                 "com.example.odpclient;com.example.odpsamplenetwork";
510 
511         DeviceConfig.setProperty(
512                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
513                 KEY_OUTPUT_DATA_ALLOW_LIST,
514                 testOutputDataAllowList,
515                 /* makeDefault */ false);
516 
517         assertThat(FlagsFactory.getFlags().getOutputDataAllowList())
518                 .isEqualTo(testOutputDataAllowList);
519     }
520 
521     @Test
testGetEnableClientErrorLogging()522     public void testGetEnableClientErrorLogging() {
523         DeviceConfig.setProperty(
524                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
525                 KEY_ODP_ENABLE_CLIENT_ERROR_LOGGING,
526                 Boolean.toString(DEFAULT_CLIENT_ERROR_LOGGING_ENABLED),
527                 /* makeDefault= */ false);
528         assertThat(FlagsFactory.getFlags().getEnableClientErrorLogging())
529                 .isEqualTo(DEFAULT_CLIENT_ERROR_LOGGING_ENABLED);
530 
531         // Overriding the value in device config.
532         boolean overrideEnable = !DEFAULT_CLIENT_ERROR_LOGGING_ENABLED;
533         DeviceConfig.setProperty(
534                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
535                 KEY_ODP_ENABLE_CLIENT_ERROR_LOGGING,
536                 Boolean.toString(overrideEnable),
537                 /* makeDefault= */ false);
538         assertThat(FlagsFactory.getFlags().getEnableClientErrorLogging())
539                 .isEqualTo(overrideEnable);
540     }
541 
542     @Test
testGetBackgroundJobsLoggingEnabled()543     public void testGetBackgroundJobsLoggingEnabled() {
544         assertThat(FlagsFactory.getFlags().getBackgroundJobsLoggingEnabled())
545                 .isEqualTo(true);
546     }
547 
548     @Test
testGetBackgroundJobSamplingLoggingRate()549     public void testGetBackgroundJobSamplingLoggingRate() {
550         int defaultValue = BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
551 
552         // Override the value in device config.
553         int overrideRate = defaultValue + 1;
554         DeviceConfig.setProperty(
555                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
556                 KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE,
557                 Integer.toString(overrideRate),
558                 /* makeDefault= */ false);
559         assertThat(FlagsFactory.getFlags().getBackgroundJobSamplingLoggingRate())
560                 .isEqualTo(overrideRate);
561     }
562 
563     @Test
testGetJobSchedulingLoggingEnabled()564     public void testGetJobSchedulingLoggingEnabled() {
565         // read a stable flag value and verify it's equal to the default value.
566         boolean stableValue = FlagsFactory.getFlags().getJobSchedulingLoggingEnabled();
567 
568         // override the value in device config.
569         boolean overrideEnabled = !stableValue;
570         DeviceConfig.setProperty(
571                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
572                 KEY_ODP_JOB_SCHEDULING_LOGGING_ENABLED,
573                 Boolean.toString(overrideEnabled),
574                 /* makeDefault= */ false);
575 
576         // the flag value remains stable
577         assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingEnabled())
578                 .isEqualTo(overrideEnabled);
579     }
580 
581     @Test
testGetJobSchedulingLoggingSamplingRate()582     public void testGetJobSchedulingLoggingSamplingRate() {
583         int defaultValue = DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
584 
585         // Override the value in device config.
586         int overrideRate = defaultValue + 1;
587         DeviceConfig.setProperty(
588                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
589                 KEY_ODP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE,
590                 Integer.toString(overrideRate),
591                 /* makeDefault= */ false);
592         assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingSamplingRate())
593                 .isEqualTo(overrideRate);
594     }
595 
596     @Test
testGetOdpModuleJobPolicy()597     public void testGetOdpModuleJobPolicy() {
598         assertThat(FlagsFactory.getFlags().getOdpModuleJobPolicy())
599                 .isEqualTo(DEFAULT_ODP_MODULE_JOB_POLICY);
600 
601         String overrideValue = "Something";
602         DeviceConfig.setProperty(
603                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
604                 KEY_ODP_MODULE_JOB_POLICY,
605                 overrideValue,
606                 /* makeDefault= */ false);
607         assertThat(FlagsFactory.getFlags().getOdpModuleJobPolicy()).isEqualTo(overrideValue);
608     }
609 
610     @Test
testGetSpePilotJobEnabled()611     public void testGetSpePilotJobEnabled() {
612         assertSpeFeatureFlags(
613                 () -> FlagsFactory.getFlags().getSpePilotJobEnabled(),
614                 KEY_ODP_SPE_PILOT_JOB_ENABLED,
615                 DEFAULT_SPE_PILOT_JOB_ENABLED
616         );
617     }
618 
619     @Test
testGetSpeOnAggregateErrorDataReportingJobEnabled()620     public void testGetSpeOnAggregateErrorDataReportingJobEnabled() {
621         assertSpeFeatureFlags(
622                 () -> FlagsFactory.getFlags().getSpeOnAggregateErrorDataReportingJobEnabled(),
623                 KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_AGGREGATE_ERROR_DATA_REPORTING_JOB,
624                 DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_AGGREGATE_ERROR_DATA_REPORTING_JOB
625         );
626     }
627 
628     @Test
testGetSpeOnMddJobEnabled()629     public void testGetSpeOnMddJobEnabled() {
630         assertSpeFeatureFlags(
631                 () -> FlagsFactory.getFlags().getSpeOnMddJobEnabled(),
632                 KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_MDD_JOB,
633                 DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_MDD_JOB
634         );
635     }
636 
637     @Test
testGetSpeOnOdpDownloadProcessingJobEnabled()638     public void testGetSpeOnOdpDownloadProcessingJobEnabled() {
639         assertSpeFeatureFlags(
640                 () -> FlagsFactory.getFlags().getSpeOnOdpDownloadProcessingJobEnabled(),
641                 KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_ODP_DOWNLOAD_PROCESSING_JOB,
642                 DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_ODP_DOWNLOAD_PROCESSING_JOB
643         );
644     }
645 
646     @Test
testGetSpeOnResetDataJobEnabled()647     public void testGetSpeOnResetDataJobEnabled() {
648         assertSpeFeatureFlags(
649                 () -> FlagsFactory.getFlags().getSpeOnResetDataJobEnabled(),
650                 KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_RESET_DATA_JOB,
651                 DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_RESET_DATA_JOB
652         );
653     }
654 
655     @Test
testGetSpeOnUserDataCollectionJobEnabled()656     public void testGetSpeOnUserDataCollectionJobEnabled() {
657         assertSpeFeatureFlags(
658                 () -> FlagsFactory.getFlags().getSpeOnUserDataCollectionJobEnabled(),
659                 KEY_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_USER_DATA_COLLECTION_JOB,
660                 DEFAULT_ODP_BACKGROUND_JOBS__ENABLE_SPE_ON_USER_DATA_COLLECTION_JOB
661         );
662     }
663 
664     @Test
testAppInstallHistoryTtl()665     public void testAppInstallHistoryTtl() {
666         // read a stable flag value and verify it's equal to the default value.
667         long stableValue = FlagsFactory.getFlags().getAppInstallHistoryTtlInMillis();
668         assertThat(stableValue).isEqualTo(DEFAULT_APP_INSTALL_HISTORY_TTL_MILLIS);
669 
670         // override the value in device config.
671         long overrideEnabled = 1000L;
672         DeviceConfig.setProperty(
673                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
674                 APP_INSTALL_HISTORY_TTL,
675                 Long.toString(overrideEnabled),
676                 /* makeDefault= */ false);
677 
678         // the flag value remains stable
679         assertThat(FlagsFactory.getFlags().getAppInstallHistoryTtlInMillis())
680                 .isEqualTo(overrideEnabled);
681     }
682 
683     @Test
testAggregateErrorReportingEnabled()684     public void testAggregateErrorReportingEnabled() {
685         boolean testValue = !DEFAULT_AGGREGATED_ERROR_REPORTING_ENABLED;
686 
687         DeviceConfig.setProperty(
688                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
689                 KEY_ENABLE_AGGREGATED_ERROR_REPORTING,
690                 Boolean.toString(testValue),
691                 /* makeDefault */ false);
692 
693         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingEnabled())
694                 .isEqualTo(testValue);
695 
696         DeviceConfig.setProperty(
697                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
698                 KEY_ENABLE_AGGREGATED_ERROR_REPORTING,
699                 Boolean.toString(DEFAULT_AGGREGATED_ERROR_REPORTING_ENABLED),
700                 /* makeDefault */ false);
701         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingEnabled())
702                 .isEqualTo(DEFAULT_AGGREGATED_ERROR_REPORTING_ENABLED);
703     }
704 
705     @Test
testAggregateErrorReportingTtlDays()706     public void testAggregateErrorReportingTtlDays() {
707         int testValue = 4;
708 
709         DeviceConfig.setProperty(
710                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
711                 KEY_AGGREGATED_ERROR_REPORT_TTL_DAYS,
712                 Integer.toString(testValue),
713                 /* makeDefault */ false);
714 
715         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingTtlInDays())
716                 .isEqualTo(testValue);
717 
718         DeviceConfig.setProperty(
719                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
720                 KEY_AGGREGATED_ERROR_REPORT_TTL_DAYS,
721                 Integer.toString(DEFAULT_AGGREGATED_ERROR_REPORT_TTL_DAYS),
722                 /* makeDefault */ false);
723         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingTtlInDays())
724                 .isEqualTo(DEFAULT_AGGREGATED_ERROR_REPORT_TTL_DAYS);
725     }
726 
727     @Test
testAggregateErrorReportingUrlPath()728     public void testAggregateErrorReportingUrlPath() {
729         String testValue = "foo/bar";
730 
731         DeviceConfig.setProperty(
732                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
733                 KEY_AGGREGATED_ERROR_REPORTING_PATH,
734                 testValue,
735                 /* makeDefault */ false);
736 
737         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingServerPath())
738                 .isEqualTo(testValue);
739 
740         DeviceConfig.setProperty(
741                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
742                 KEY_AGGREGATED_ERROR_REPORTING_PATH,
743                 DEFAULT_AGGREGATED_ERROR_REPORTING_URL_PATH,
744                 /* makeDefault */ false);
745         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingServerPath())
746                 .isEqualTo(DEFAULT_AGGREGATED_ERROR_REPORTING_URL_PATH);
747     }
748 
749     @Test
testAggregateErrorReportingThreshold()750     public void testAggregateErrorReportingThreshold() {
751         int testValue = 5;
752 
753         DeviceConfig.setProperty(
754                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
755                 KEY_AGGREGATED_ERROR_REPORTING_THRESHOLD,
756                 Integer.toString(testValue),
757                 /* makeDefault */ false);
758 
759         assertThat(FlagsFactory.getFlags().getAggregatedErrorMinThreshold()).isEqualTo(testValue);
760 
761         DeviceConfig.setProperty(
762                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
763                 KEY_AGGREGATED_ERROR_REPORTING_THRESHOLD,
764                 Integer.toString(DEFAULT_AGGREGATED_ERROR_REPORTING_THRESHOLD),
765                 /* makeDefault */ false);
766         assertThat(FlagsFactory.getFlags().getAggregatedErrorMinThreshold())
767                 .isEqualTo(DEFAULT_AGGREGATED_ERROR_REPORTING_THRESHOLD);
768     }
769 
770     @Test
testAggregateErrorReportingIntervalInHours()771     public void testAggregateErrorReportingIntervalInHours() {
772         int testValue = 4;
773 
774         DeviceConfig.setProperty(
775                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
776                 KEY_AGGREGATED_ERROR_REPORTING_INTERVAL_HOURS,
777                 Integer.toString(testValue),
778                 /* makeDefault */ false);
779 
780         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingIntervalInHours())
781                 .isEqualTo(testValue);
782 
783         DeviceConfig.setProperty(
784                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
785                 KEY_AGGREGATED_ERROR_REPORTING_INTERVAL_HOURS,
786                 Integer.toString(DEFAULT_AGGREGATED_ERROR_REPORTING_INTERVAL_HOURS),
787                 /* makeDefault */ false);
788         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingIntervalInHours())
789                 .isEqualTo(DEFAULT_AGGREGATED_ERROR_REPORTING_INTERVAL_HOURS);
790     }
791 
792     @Test
testAllowUnencryptedAggregatedErrorReportingPayload()793     public void testAllowUnencryptedAggregatedErrorReportingPayload() {
794         boolean testValue = !DEFAULT_ALLOW_UNENCRYPTED_AGGREGATED_ERROR_REPORTING_PAYLOAD;
795 
796         DeviceConfig.setProperty(
797                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
798                 KEY_ALLOW_UNENCRYPTED_AGGREGATED_ERROR_REPORTING,
799                 Boolean.toString(testValue),
800                 /* makeDefault */ false);
801 
802         assertThat(FlagsFactory.getFlags().getAllowUnencryptedAggregatedErrorReportingPayload())
803                 .isEqualTo(testValue);
804 
805         DeviceConfig.setProperty(
806                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
807                 KEY_ALLOW_UNENCRYPTED_AGGREGATED_ERROR_REPORTING,
808                 Boolean.toString(DEFAULT_ALLOW_UNENCRYPTED_AGGREGATED_ERROR_REPORTING_PAYLOAD),
809                 /* makeDefault */ false);
810         assertThat(FlagsFactory.getFlags().getAllowUnencryptedAggregatedErrorReportingPayload())
811                 .isEqualTo(DEFAULT_ALLOW_UNENCRYPTED_AGGREGATED_ERROR_REPORTING_PAYLOAD);
812     }
813 
814     @Test
testAggregatedErrorReportingHttpTimeoutSeconds()815     public void testAggregatedErrorReportingHttpTimeoutSeconds() {
816         int testValue = 10;
817 
818         DeviceConfig.setProperty(
819                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
820                 KEY_AGGREGATED_ERROR_REPORTING_HTTP_TIMEOUT_SECONDS,
821                 Integer.toString(testValue),
822                 /* makeDefault */ false);
823 
824         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingHttpTimeoutSeconds())
825                 .isEqualTo(testValue);
826 
827         DeviceConfig.setProperty(
828                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
829                 KEY_AGGREGATED_ERROR_REPORTING_HTTP_TIMEOUT_SECONDS,
830                 Integer.toString(DEFAULT_AGGREGATED_ERROR_REPORT_HTTP_TIMEOUT_SECONDS),
831                 /* makeDefault */ false);
832         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingIntervalInHours())
833                 .isEqualTo(DEFAULT_AGGREGATED_ERROR_REPORT_HTTP_TIMEOUT_SECONDS);
834     }
835 
836     @Test
testAggregatedErrorReportingHttpRetryLimit()837     public void testAggregatedErrorReportingHttpRetryLimit() {
838         int testValue = 5;
839 
840         DeviceConfig.setProperty(
841                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
842                 KEY_AGGREGATED_ERROR_REPORTING_HTTP_RETRY_LIMIT,
843                 Integer.toString(testValue),
844                 /* makeDefault */ false);
845 
846         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingHttpRetryLimit())
847                 .isEqualTo(testValue);
848 
849         DeviceConfig.setProperty(
850                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
851                 KEY_AGGREGATED_ERROR_REPORTING_HTTP_RETRY_LIMIT,
852                 Integer.toString(DEFAULT_AGGREGATED_ERROR_REPORT_HTTP_RETRY_LIMIT),
853                 /* makeDefault */ false);
854         assertThat(FlagsFactory.getFlags().getAggregatedErrorReportingIntervalInHours())
855                 .isEqualTo(DEFAULT_AGGREGATED_ERROR_REPORT_HTTP_RETRY_LIMIT);
856     }
857 
858     @Test
testEncryptionKeyFetchUrl()859     public void testEncryptionKeyFetchUrl() {
860         String testValue = "foo/bar";
861 
862         DeviceConfig.setProperty(
863                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
864                 KEY_ENCRYPTION_KEY_URL,
865                 testValue,
866                 /* makeDefault */ false);
867 
868         assertThat(FlagsFactory.getFlags().getEncryptionKeyFetchUrl()).isEqualTo(testValue);
869 
870         DeviceConfig.setProperty(
871                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
872                 KEY_ENCRYPTION_KEY_URL,
873                 DEFAULT_ENCRYPTION_KEY_URL,
874                 /* makeDefault */ false);
875         assertThat(FlagsFactory.getFlags().getEncryptionKeyFetchUrl())
876                 .isEqualTo(DEFAULT_ENCRYPTION_KEY_URL);
877     }
878 
879     @Test
testEncryptionKeyMaxAgeSeconds()880     public void testEncryptionKeyMaxAgeSeconds() {
881         Long testValue = 100L;
882 
883         DeviceConfig.setProperty(
884                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
885                 KEY_ENCRYPTION_KEY_MAX_AGE_SECONDS,
886                 Long.toString(testValue),
887                 /* makeDefault */ false);
888 
889         assertThat(FlagsFactory.getFlags().getEncryptionKeyMaxAgeSeconds()).isEqualTo(testValue);
890 
891         DeviceConfig.setProperty(
892                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
893                 KEY_ENCRYPTION_KEY_MAX_AGE_SECONDS,
894                 Long.toString(DEFAULT_ENCRYPTION_KEY_MAX_AGE_SECONDS),
895                 /* makeDefault */ false);
896         assertThat(FlagsFactory.getFlags().getEncryptionKeyMaxAgeSeconds())
897                 .isEqualTo(DEFAULT_ENCRYPTION_KEY_MAX_AGE_SECONDS);
898     }
899 
900     @Test
testGetAdservicesIpcCallTimeoutInMillis()901     public void testGetAdservicesIpcCallTimeoutInMillis() {
902         long testTimeoutValue = 100L;
903 
904         DeviceConfig.setProperty(
905                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
906                 KEY_ADSERVICES_IPC_CALL_TIMEOUT_IN_MILLIS,
907                 Long.toString(testTimeoutValue),
908                 /* makeDefault */ false);
909 
910         assertThat(FlagsFactory.getFlags().getAdservicesIpcCallTimeoutInMillis())
911                 .isEqualTo(testTimeoutValue);
912 
913         DeviceConfig.setProperty(
914                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
915                 KEY_ADSERVICES_IPC_CALL_TIMEOUT_IN_MILLIS,
916                 Long.toString(DEFAULT_ADSERVICES_IPC_CALL_TIMEOUT_IN_MILLIS),
917                 /* makeDefault */ false);
918         assertThat(FlagsFactory.getFlags().getAdservicesIpcCallTimeoutInMillis())
919                 .isEqualTo(DEFAULT_ADSERVICES_IPC_CALL_TIMEOUT_IN_MILLIS);
920     }
921 
922     @Test
testIsPluginProcessRunnerEnabled()923     public void testIsPluginProcessRunnerEnabled() {
924         // read a stable flag value and verify it's equal to the default value.
925         boolean stableValue = FlagsFactory.getFlags().isPluginProcessRunnerEnabled();
926         assertThat(stableValue).isEqualTo(DEFAULT_PLUGIN_PROCESS_RUNNER_ENABLED);
927 
928         // override the value in device config.
929         boolean overrideEnabled = !stableValue;
930         DeviceConfig.setProperty(
931                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
932                 KEY_PLUGIN_PROCESS_RUNNER_ENABLED,
933                 Boolean.toString(overrideEnabled),
934                 /* makeDefault= */ false);
935 
936         // the flag value remains stable
937         assertThat(FlagsFactory.getFlags().isPluginProcessRunnerEnabled()).isEqualTo(
938                 overrideEnabled);
939     }
940 
941     @Test
testIsFeatureEnabledApiEnabled()942     public void testIsFeatureEnabledApiEnabled() {
943         boolean stableValue = FlagsFactory.getFlags().isFeatureEnabledApiEnabled();
944         assertThat(stableValue).isEqualTo(DEFAULT_IS_FEATURE_ENABLED_API_ENABLED);
945 
946         boolean overrideEnabled = !stableValue;
947         DeviceConfig.setProperty(
948                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
949                 KEY_IS_FEATURE_ENABLED_API_ENABLED,
950                 Boolean.toString(overrideEnabled),
951                 /* makeDefault= */ false);
952 
953         assertThat(FlagsFactory.getFlags().isFeatureEnabledApiEnabled()).isEqualTo(overrideEnabled);
954     }
955 
assertSpeFeatureFlags( Supplier<Boolean> flagSupplier, String flagName, boolean defaultValue)956     private void assertSpeFeatureFlags(
957             Supplier<Boolean> flagSupplier, String flagName, boolean defaultValue) {
958         // Test override value
959         boolean overrideValue = !defaultValue;
960         DeviceConfig.setProperty(
961                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
962                 flagName,
963                 Boolean.toString(overrideValue),
964                 /* makeDefault */ false);
965         assertThat(flagSupplier.get()).isEqualTo(overrideValue);
966 
967         // Test default value
968         DeviceConfig.setProperty(
969                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
970                 flagName,
971                 Boolean.toString(defaultValue),
972                 /* makeDefault */ false);
973         assertThat(flagSupplier.get()).isEqualTo(defaultValue);
974     }
975 }
976