• 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_LOGGING_ENABLED;
20 import static com.android.adservices.shared.common.flags.ModuleSharedFlags.BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
21 import static com.android.adservices.shared.common.flags.ModuleSharedFlags.DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED;
22 import static com.android.adservices.shared.common.flags.ModuleSharedFlags.DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
23 import static com.android.ondevicepersonalization.services.Flags.APP_REQUEST_FLOW_DEADLINE_SECONDS;
24 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_APP_INSTALL_HISTORY_TTL_MILLIS;
25 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_CALLER_APP_ALLOW_LIST;
26 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_CLIENT_ERROR_LOGGING_ENABLED;
27 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ISOLATED_SERVICE_ALLOW_LIST;
28 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_ODP_MODULE_JOB_POLICY;
29 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_OUTPUT_DATA_ALLOW_LIST;
30 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED;
31 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_SPE_PILOT_JOB_ENABLED;
32 import static com.android.ondevicepersonalization.services.Flags.DEFAULT_TRUSTED_PARTNER_APPS_LIST;
33 import static com.android.ondevicepersonalization.services.Flags.DOWNLOAD_FLOW_DEADLINE_SECONDS;
34 import static com.android.ondevicepersonalization.services.Flags.ENABLE_PERSONALIZATION_STATUS_OVERRIDE;
35 import static com.android.ondevicepersonalization.services.Flags.EXAMPLE_STORE_FLOW_DEADLINE_SECONDS;
36 import static com.android.ondevicepersonalization.services.Flags.GLOBAL_KILL_SWITCH;
37 import static com.android.ondevicepersonalization.services.Flags.IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED;
38 import static com.android.ondevicepersonalization.services.Flags.PERSONALIZATION_STATUS_OVERRIDE_VALUE;
39 import static com.android.ondevicepersonalization.services.Flags.RENDER_FLOW_DEADLINE_SECONDS;
40 import static com.android.ondevicepersonalization.services.Flags.WEB_TRIGGER_FLOW_DEADLINE_SECONDS;
41 import static com.android.ondevicepersonalization.services.Flags.WEB_VIEW_FLOW_DEADLINE_SECONDS;
42 import static com.android.ondevicepersonalization.services.PhFlags.APP_INSTALL_HISTORY_TTL;
43 import static com.android.ondevicepersonalization.services.PhFlags.KEY_APP_REQUEST_FLOW_DEADLINE_SECONDS;
44 import static com.android.ondevicepersonalization.services.PhFlags.KEY_CALLER_APP_ALLOW_LIST;
45 import static com.android.ondevicepersonalization.services.PhFlags.KEY_DOWNLOAD_FLOW_DEADLINE_SECONDS;
46 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ENABLE_PERSONALIZATION_STATUS_OVERRIDE;
47 import static com.android.ondevicepersonalization.services.PhFlags.KEY_EXAMPLE_STORE_FLOW_DEADLINE_SECONDS;
48 import static com.android.ondevicepersonalization.services.PhFlags.KEY_GLOBAL_KILL_SWITCH;
49 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ISOLATED_SERVICE_ALLOW_LIST;
50 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ISOLATED_SERVICE_DEBUGGING_ENABLED;
51 import static com.android.ondevicepersonalization.services.PhFlags.KEY_IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED;
52 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_BACKGROUND_JOBS_LOGGING_ENABLED;
53 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
54 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_ENABLE_CLIENT_ERROR_LOGGING;
55 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_JOB_SCHEDULING_LOGGING_ENABLED;
56 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
57 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_MODULE_JOB_POLICY;
58 import static com.android.ondevicepersonalization.services.PhFlags.KEY_ODP_SPE_PILOT_JOB_ENABLED;
59 import static com.android.ondevicepersonalization.services.PhFlags.KEY_OUTPUT_DATA_ALLOW_LIST;
60 import static com.android.ondevicepersonalization.services.PhFlags.KEY_PERSONALIZATION_STATUS_OVERRIDE_VALUE;
61 import static com.android.ondevicepersonalization.services.PhFlags.KEY_RENDER_FLOW_DEADLINE_SECONDS;
62 import static com.android.ondevicepersonalization.services.PhFlags.KEY_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED;
63 import static com.android.ondevicepersonalization.services.PhFlags.KEY_TRUSTED_PARTNER_APPS_LIST;
64 import static com.android.ondevicepersonalization.services.PhFlags.KEY_WEB_TRIGGER_FLOW_DEADLINE_SECONDS;
65 import static com.android.ondevicepersonalization.services.PhFlags.KEY_WEB_VIEW_FLOW_DEADLINE_SECONDS;
66 
67 import static com.google.common.truth.Truth.assertThat;
68 
69 import android.provider.DeviceConfig;
70 
71 import com.android.modules.utils.build.SdkLevel;
72 import com.android.modules.utils.testing.TestableDeviceConfig;
73 
74 import org.junit.Before;
75 import org.junit.Rule;
76 import org.junit.Test;
77 
78 /** Unit tests for {@link com.android.ondevicepersonalization.services.PhFlags} */
79 public class PhFlagsTest {
80     @Rule
81     public final TestableDeviceConfig.TestableDeviceConfigRule mDeviceConfigRule =
82             new TestableDeviceConfig.TestableDeviceConfigRule();
83 
84     /**
85      * Get necessary permissions to access Setting.Config API and set up context
86      */
87     @Before
setUpContext()88     public void setUpContext() throws Exception {
89         PhFlagsTestUtil.setUpDeviceConfigPermissions();
90     }
91 
92     @Test(expected = IllegalArgumentException.class)
testInvalidStableFlags()93     public void testInvalidStableFlags() {
94         FlagsFactory.getFlags().getStableFlag("INVALID_FLAG_NAME");
95     }
96 
97     @Test
testValidStableFlags()98     public void testValidStableFlags() {
99         Object isSipFeatureEnabled = FlagsFactory.getFlags()
100                 .getStableFlag(KEY_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED);
101 
102         assertThat(isSipFeatureEnabled).isNotNull();
103     }
104 
105     @Test
testGetGlobalKillSwitch()106     public void testGetGlobalKillSwitch() {
107         // Without any overriding, the value is the hard coded constant.
108         DeviceConfig.setProperty(
109                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
110                 KEY_GLOBAL_KILL_SWITCH,
111                 Boolean.toString(GLOBAL_KILL_SWITCH),
112                 /* makeDefault */ false);
113         assertThat(FlagsFactory.getFlags().getGlobalKillSwitch()).isEqualTo(GLOBAL_KILL_SWITCH);
114 
115         // Now overriding with the value from PH.
116         final boolean phOverridingValue = true;
117         DeviceConfig.setProperty(
118                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
119                 KEY_GLOBAL_KILL_SWITCH,
120                 Boolean.toString(phOverridingValue),
121                 /* makeDefault */ false);
122 
123         Flags phFlags = FlagsFactory.getFlags();
124         assertThat(phFlags.getGlobalKillSwitch()).isEqualTo(phOverridingValue);
125     }
126 
127     @Test
testIsPersonalizationStatusOverrideEnabled()128     public void testIsPersonalizationStatusOverrideEnabled() {
129         PhFlagsTestUtil.disableGlobalKillSwitch();
130         DeviceConfig.setProperty(
131                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
132                 KEY_ENABLE_PERSONALIZATION_STATUS_OVERRIDE,
133                 Boolean.toString(ENABLE_PERSONALIZATION_STATUS_OVERRIDE),
134                 /* makeDefault */ false);
135         assertThat(FlagsFactory.getFlags().isPersonalizationStatusOverrideEnabled()).isEqualTo(
136                 ENABLE_PERSONALIZATION_STATUS_OVERRIDE);
137 
138         final boolean phOverridingValue = true;
139         DeviceConfig.setProperty(
140                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
141                 KEY_ENABLE_PERSONALIZATION_STATUS_OVERRIDE,
142                 Boolean.toString(phOverridingValue),
143                 /* makeDefault */ false);
144 
145         Flags phFlags = FlagsFactory.getFlags();
146         assertThat(phFlags.isPersonalizationStatusOverrideEnabled()).isEqualTo(phOverridingValue);
147     }
148 
149     @Test
testGetPersonalizationStatusOverrideValue()150     public void testGetPersonalizationStatusOverrideValue() {
151         PhFlagsTestUtil.disableGlobalKillSwitch();
152         DeviceConfig.setProperty(
153                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
154                 KEY_PERSONALIZATION_STATUS_OVERRIDE_VALUE,
155                 Boolean.toString(PERSONALIZATION_STATUS_OVERRIDE_VALUE),
156                 /* makeDefault */ false);
157         assertThat(FlagsFactory.getFlags().getPersonalizationStatusOverrideValue()).isEqualTo(
158                 PERSONALIZATION_STATUS_OVERRIDE_VALUE);
159 
160         final boolean phOverridingValue = true;
161         DeviceConfig.setProperty(
162                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
163                 KEY_PERSONALIZATION_STATUS_OVERRIDE_VALUE,
164                 Boolean.toString(phOverridingValue),
165                 /* makeDefault */ false);
166 
167         Flags phFlags = FlagsFactory.getFlags();
168         assertThat(phFlags.getPersonalizationStatusOverrideValue()).isEqualTo(phOverridingValue);
169     }
170 
171     @Test
testWebTriggerFlowDeadlineSeconds()172     public void testWebTriggerFlowDeadlineSeconds() {
173         assertThat(FlagsFactory.getFlags().getWebTriggerFlowDeadlineSeconds())
174                 .isEqualTo(WEB_TRIGGER_FLOW_DEADLINE_SECONDS);
175 
176         final int test_deadline = 10;
177 
178         DeviceConfig.setProperty(
179                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
180                 KEY_WEB_TRIGGER_FLOW_DEADLINE_SECONDS,
181                 String.valueOf(test_deadline),
182                 /* makeDefault */ false);
183 
184         assertThat(FlagsFactory.getFlags().getWebTriggerFlowDeadlineSeconds())
185                 .isEqualTo(test_deadline);
186 
187         DeviceConfig.setProperty(
188                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
189                 KEY_WEB_TRIGGER_FLOW_DEADLINE_SECONDS,
190                 String.valueOf(WEB_TRIGGER_FLOW_DEADLINE_SECONDS),
191                 /* makeDefault */ false);
192     }
193 
194     @Test
testWebViewFlowDeadlineSeconds()195     public void testWebViewFlowDeadlineSeconds() {
196         assertThat(FlagsFactory.getFlags().getWebViewFlowDeadlineSeconds())
197                 .isEqualTo(WEB_VIEW_FLOW_DEADLINE_SECONDS);
198 
199         final int test_deadline = 10;
200 
201         DeviceConfig.setProperty(
202                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
203                 KEY_WEB_VIEW_FLOW_DEADLINE_SECONDS,
204                 String.valueOf(test_deadline),
205                 /* makeDefault */ false);
206 
207         assertThat(FlagsFactory.getFlags().getWebViewFlowDeadlineSeconds())
208                 .isEqualTo(test_deadline);
209 
210         DeviceConfig.setProperty(
211                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
212                 KEY_WEB_VIEW_FLOW_DEADLINE_SECONDS,
213                 String.valueOf(WEB_VIEW_FLOW_DEADLINE_SECONDS),
214                 /* makeDefault */ false);
215     }
216 
217     @Test
testRenderFlowDeadlineSeconds()218     public void testRenderFlowDeadlineSeconds() {
219         assertThat(FlagsFactory.getFlags().getRenderFlowDeadlineSeconds())
220                 .isEqualTo(RENDER_FLOW_DEADLINE_SECONDS);
221 
222         final int test_deadline = 10;
223 
224         DeviceConfig.setProperty(
225                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
226                 KEY_RENDER_FLOW_DEADLINE_SECONDS,
227                 String.valueOf(test_deadline),
228                 /* makeDefault */ false);
229 
230         assertThat(FlagsFactory.getFlags().getRenderFlowDeadlineSeconds())
231                 .isEqualTo(test_deadline);
232 
233         DeviceConfig.setProperty(
234                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
235                 KEY_RENDER_FLOW_DEADLINE_SECONDS,
236                 String.valueOf(RENDER_FLOW_DEADLINE_SECONDS),
237                 /* makeDefault */ false);
238     }
239 
240     @Test
testAppRequestFlowDeadlineSeconds()241     public void testAppRequestFlowDeadlineSeconds() {
242         assertThat(FlagsFactory.getFlags().getAppRequestFlowDeadlineSeconds())
243                 .isEqualTo(APP_REQUEST_FLOW_DEADLINE_SECONDS);
244 
245         final int test_deadline = 10;
246 
247         DeviceConfig.setProperty(
248                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
249                 KEY_APP_REQUEST_FLOW_DEADLINE_SECONDS,
250                 String.valueOf(test_deadline),
251                 /* makeDefault */ false);
252 
253         assertThat(FlagsFactory.getFlags().getAppRequestFlowDeadlineSeconds())
254                 .isEqualTo(test_deadline);
255 
256         DeviceConfig.setProperty(
257                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
258                 KEY_APP_REQUEST_FLOW_DEADLINE_SECONDS,
259                 String.valueOf(APP_REQUEST_FLOW_DEADLINE_SECONDS),
260                 /* makeDefault */ false);
261     }
262 
263     @Test
testExampleStoreFlowDeadlineSeconds()264     public void testExampleStoreFlowDeadlineSeconds() {
265         assertThat(FlagsFactory.getFlags().getExampleStoreFlowDeadlineSeconds())
266                 .isEqualTo(EXAMPLE_STORE_FLOW_DEADLINE_SECONDS);
267 
268         final int test_deadline = 10;
269 
270         DeviceConfig.setProperty(
271                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
272                 KEY_EXAMPLE_STORE_FLOW_DEADLINE_SECONDS,
273                 String.valueOf(test_deadline),
274                 /* makeDefault */ false);
275 
276         assertThat(FlagsFactory.getFlags().getExampleStoreFlowDeadlineSeconds())
277                 .isEqualTo(test_deadline);
278 
279         DeviceConfig.setProperty(
280                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
281                 KEY_EXAMPLE_STORE_FLOW_DEADLINE_SECONDS,
282                 String.valueOf(EXAMPLE_STORE_FLOW_DEADLINE_SECONDS),
283                 /* makeDefault */ false);
284     }
285 
286     @Test
testDownloadFlowDeadlineSeconds()287     public void testDownloadFlowDeadlineSeconds() {
288         assertThat(FlagsFactory.getFlags().getExampleStoreFlowDeadlineSeconds())
289                 .isEqualTo(DOWNLOAD_FLOW_DEADLINE_SECONDS);
290 
291         final int test_deadline = 10;
292 
293         DeviceConfig.setProperty(
294                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
295                 KEY_DOWNLOAD_FLOW_DEADLINE_SECONDS,
296                 String.valueOf(test_deadline),
297                 /* makeDefault */ false);
298 
299         assertThat(FlagsFactory.getFlags().getDownloadFlowDeadlineSeconds())
300                 .isEqualTo(test_deadline);
301 
302         DeviceConfig.setProperty(
303                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
304                 KEY_DOWNLOAD_FLOW_DEADLINE_SECONDS,
305                 String.valueOf(DOWNLOAD_FLOW_DEADLINE_SECONDS),
306                 /* makeDefault */ false);
307     }
308 
309     @Test
testGetTrustedPartnerAppsList()310     public void testGetTrustedPartnerAppsList() {
311         DeviceConfig.setProperty(
312                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
313                 KEY_TRUSTED_PARTNER_APPS_LIST,
314                 DEFAULT_TRUSTED_PARTNER_APPS_LIST,
315                 /* makeDefault */ false);
316 
317         if (SdkLevel.isAtLeastU()) {
318             assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList())
319                     .isEqualTo(DEFAULT_TRUSTED_PARTNER_APPS_LIST);
320         } else {
321             assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList())
322                     .isEqualTo("");
323         }
324 
325         final String testTrustedPartnerAppsList =
326                 "trusted_test_app_1, trusted_test_app_2, trusted_test_app_3";
327 
328         DeviceConfig.setProperty(
329                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
330                 KEY_TRUSTED_PARTNER_APPS_LIST,
331                 testTrustedPartnerAppsList,
332                 /* makeDefault */ false);
333 
334         if (SdkLevel.isAtLeastU()) {
335             assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList())
336                     .isEqualTo(testTrustedPartnerAppsList);
337         } else {
338             assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList())
339                     .isEqualTo("");
340         }
341     }
342 
343     @Test
testSharedIsolatedProcessFeature()344     public void testSharedIsolatedProcessFeature() {
345         DeviceConfig.setProperty(
346                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
347                 KEY_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED,
348                 Boolean.toString(DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED),
349                 /* makeDefault */ false);
350 
351         if (SdkLevel.isAtLeastU()) {
352             assertThat(FlagsFactory.getFlags().isSharedIsolatedProcessFeatureEnabled())
353                     .isEqualTo(DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED);
354         } else {
355             assertThat(FlagsFactory.getFlags().isSharedIsolatedProcessFeatureEnabled())
356                     .isFalse();
357         }
358 
359         final boolean testIsolatedProcessFeatureEnabled =
360                 !DEFAULT_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED;
361 
362         DeviceConfig.setProperty(
363                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
364                 KEY_SHARED_ISOLATED_PROCESS_FEATURE_ENABLED,
365                 Boolean.toString(testIsolatedProcessFeatureEnabled),
366                 /* makeDefault */ false);
367 
368         if (SdkLevel.isAtLeastU()) {
369             assertThat(FlagsFactory.getFlags().isSharedIsolatedProcessFeatureEnabled())
370                     .isEqualTo(testIsolatedProcessFeatureEnabled);
371         } else {
372             assertThat(FlagsFactory.getFlags().isSharedIsolatedProcessFeatureEnabled())
373                     .isFalse();
374         }
375     }
376 
377     @Test
testGetCallerAppAllowList()378     public void testGetCallerAppAllowList() {
379         DeviceConfig.setProperty(
380                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
381                 KEY_CALLER_APP_ALLOW_LIST,
382                 DEFAULT_CALLER_APP_ALLOW_LIST,
383                 /* makeDefault */ false);
384 
385         assertThat(FlagsFactory.getFlags().getCallerAppAllowList())
386                 .isEqualTo(DEFAULT_CALLER_APP_ALLOW_LIST);
387 
388         final String testCallerAppAllowList =
389                 "com.example.odpclient";
390 
391         DeviceConfig.setProperty(
392                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
393                 KEY_CALLER_APP_ALLOW_LIST,
394                 testCallerAppAllowList,
395                 /* makeDefault */ false);
396 
397         assertThat(FlagsFactory.getFlags().getCallerAppAllowList())
398                 .isEqualTo(testCallerAppAllowList);
399     }
400 
401     @Test
testIsolatedServiceDebuggingEnabled()402     public void testIsolatedServiceDebuggingEnabled() {
403         DeviceConfig.setProperty(
404                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
405                 KEY_ISOLATED_SERVICE_DEBUGGING_ENABLED,
406                 Boolean.toString(false),
407                 /* makeDefault */ false);
408 
409         assertThat(FlagsFactory.getFlags().isIsolatedServiceDebuggingEnabled())
410                 .isEqualTo(false);
411 
412         DeviceConfig.setProperty(
413                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
414                 KEY_ISOLATED_SERVICE_DEBUGGING_ENABLED,
415                 Boolean.toString(true),
416                 /* makeDefault */ false);
417 
418         assertThat(FlagsFactory.getFlags().isIsolatedServiceDebuggingEnabled())
419                 .isEqualTo(true);
420     }
421 
422     @Test
testIsArtImageLoadingOptimizationEnabled()423     public void testIsArtImageLoadingOptimizationEnabled() {
424         assertThat(FlagsFactory.getFlags().isArtImageLoadingOptimizationEnabled())
425                 .isEqualTo(IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED);
426 
427         boolean testValue = !IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED;
428 
429         DeviceConfig.setProperty(
430                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
431                 KEY_IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED,
432                 String.valueOf(testValue),
433                 /* makeDefault */ false);
434 
435         assertThat(FlagsFactory.getFlags().isArtImageLoadingOptimizationEnabled())
436                 .isEqualTo(testValue);
437 
438         DeviceConfig.setProperty(
439                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
440                 KEY_IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED,
441                 String.valueOf(IS_ART_IMAGE_LOADING_OPTIMIZATION_ENABLED),
442                 /* makeDefault */ false);
443     }
444 
445     @Test
testGetIsolatedServiceAllowList()446     public void testGetIsolatedServiceAllowList() {
447         DeviceConfig.setProperty(
448                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
449                 KEY_ISOLATED_SERVICE_ALLOW_LIST,
450                 DEFAULT_ISOLATED_SERVICE_ALLOW_LIST,
451                 /* makeDefault */ false);
452 
453         assertThat(FlagsFactory.getFlags().getIsolatedServiceAllowList())
454                 .isEqualTo(DEFAULT_ISOLATED_SERVICE_ALLOW_LIST);
455 
456         final String testIsolatedServiceAllowList =
457                 "com.example.odpsamplenetwork";
458 
459         DeviceConfig.setProperty(
460                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
461                 KEY_ISOLATED_SERVICE_ALLOW_LIST,
462                 testIsolatedServiceAllowList,
463                 /* makeDefault */ false);
464 
465         assertThat(FlagsFactory.getFlags().getIsolatedServiceAllowList())
466                 .isEqualTo(testIsolatedServiceAllowList);
467     }
468 
469     @Test
testGetOutputDataAllowList()470     public void testGetOutputDataAllowList() {
471         DeviceConfig.setProperty(
472                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
473                 KEY_OUTPUT_DATA_ALLOW_LIST,
474                 DEFAULT_OUTPUT_DATA_ALLOW_LIST,
475                 /* makeDefault */ false);
476 
477         assertThat(FlagsFactory.getFlags().getOutputDataAllowList())
478                 .isEqualTo(DEFAULT_OUTPUT_DATA_ALLOW_LIST);
479 
480         final String testOutputDataAllowList =
481                 "com.example.odpclient;com.example.odpsamplenetwork";
482 
483         DeviceConfig.setProperty(
484                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
485                 KEY_OUTPUT_DATA_ALLOW_LIST,
486                 testOutputDataAllowList,
487                 /* makeDefault */ false);
488 
489         assertThat(FlagsFactory.getFlags().getOutputDataAllowList())
490                 .isEqualTo(testOutputDataAllowList);
491     }
492 
493     @Test
testGetEnableClientErrorLogging()494     public void testGetEnableClientErrorLogging() {
495         DeviceConfig.setProperty(
496                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
497                 KEY_ODP_ENABLE_CLIENT_ERROR_LOGGING,
498                 Boolean.toString(DEFAULT_CLIENT_ERROR_LOGGING_ENABLED),
499                 /* makeDefault= */ false);
500         assertThat(FlagsFactory.getFlags().getEnableClientErrorLogging())
501                 .isEqualTo(DEFAULT_CLIENT_ERROR_LOGGING_ENABLED);
502 
503         // Overriding the value in device config.
504         boolean overrideEnable = !DEFAULT_CLIENT_ERROR_LOGGING_ENABLED;
505         DeviceConfig.setProperty(
506                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
507                 KEY_ODP_ENABLE_CLIENT_ERROR_LOGGING,
508                 Boolean.toString(overrideEnable),
509                 /* makeDefault= */ false);
510         assertThat(FlagsFactory.getFlags().getEnableClientErrorLogging())
511                 .isEqualTo(overrideEnable);
512     }
513 
514     @Test
testGetBackgroundJobsLoggingEnabled()515     public void testGetBackgroundJobsLoggingEnabled() {
516         // read a stable flag value and verify it's equal to the default value.
517         boolean stableValue = FlagsFactory.getFlags().getBackgroundJobsLoggingEnabled();
518         assertThat(stableValue).isEqualTo(BACKGROUND_JOB_LOGGING_ENABLED);
519 
520         // override the value in device config.
521         boolean overrideEnabled = !stableValue;
522         DeviceConfig.setProperty(
523                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
524                 KEY_ODP_BACKGROUND_JOBS_LOGGING_ENABLED,
525                 Boolean.toString(overrideEnabled),
526                 /* makeDefault= */ false);
527 
528         // the flag value remains stable
529         assertThat(FlagsFactory.getFlags().getBackgroundJobsLoggingEnabled())
530                 .isEqualTo(stableValue);
531     }
532 
533     @Test
testGetBackgroundJobSamplingLoggingRate()534     public void testGetBackgroundJobSamplingLoggingRate() {
535         int defaultValue = BACKGROUND_JOB_SAMPLING_LOGGING_RATE;
536         assertThat(FlagsFactory.getFlags().getBackgroundJobSamplingLoggingRate())
537                 .isEqualTo(defaultValue);
538 
539         // Override the value in device config.
540         int overrideRate = defaultValue + 1;
541         DeviceConfig.setProperty(
542                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
543                 KEY_ODP_BACKGROUND_JOB_SAMPLING_LOGGING_RATE,
544                 Integer.toString(overrideRate),
545                 /* makeDefault= */ false);
546         assertThat(FlagsFactory.getFlags().getBackgroundJobSamplingLoggingRate())
547                 .isEqualTo(overrideRate);
548     }
549 
550     @Test
testGetJobSchedulingLoggingEnabled()551     public void testGetJobSchedulingLoggingEnabled() {
552         // read a stable flag value and verify it's equal to the default value.
553         boolean stableValue = FlagsFactory.getFlags().getJobSchedulingLoggingEnabled();
554         assertThat(stableValue).isEqualTo(DEFAULT_JOB_SCHEDULING_LOGGING_ENABLED);
555 
556         // override the value in device config.
557         boolean overrideEnabled = !stableValue;
558         DeviceConfig.setProperty(
559                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
560                 KEY_ODP_JOB_SCHEDULING_LOGGING_ENABLED,
561                 Boolean.toString(overrideEnabled),
562                 /* makeDefault= */ false);
563 
564         // the flag value remains stable
565         assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingEnabled())
566                 .isEqualTo(overrideEnabled);
567     }
568 
569     @Test
testGetJobSchedulingLoggingSamplingRate()570     public void testGetJobSchedulingLoggingSamplingRate() {
571         int defaultValue = DEFAULT_JOB_SCHEDULING_LOGGING_SAMPLING_RATE;
572         assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingSamplingRate())
573                 .isEqualTo(defaultValue);
574 
575         // Override the value in device config.
576         int overrideRate = defaultValue + 1;
577         DeviceConfig.setProperty(
578                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
579                 KEY_ODP_JOB_SCHEDULING_LOGGING_SAMPLING_RATE,
580                 Integer.toString(overrideRate),
581                 /* makeDefault= */ false);
582         assertThat(FlagsFactory.getFlags().getJobSchedulingLoggingSamplingRate())
583                 .isEqualTo(overrideRate);
584     }
585 
586     @Test
testGetOdpModuleJobPolicy()587     public void testGetOdpModuleJobPolicy() {
588         assertThat(FlagsFactory.getFlags().getOdpModuleJobPolicy())
589                 .isEqualTo(DEFAULT_ODP_MODULE_JOB_POLICY);
590 
591         String overrideValue = "Something";
592         DeviceConfig.setProperty(
593                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
594                 KEY_ODP_MODULE_JOB_POLICY,
595                 overrideValue,
596                 /* makeDefault= */ false);
597         assertThat(FlagsFactory.getFlags().getOdpModuleJobPolicy()).isEqualTo(overrideValue);
598     }
599 
600     @Test
testGetSpePilotJobEnabled()601     public void testGetSpePilotJobEnabled() {
602         // read a stable flag value and verify it's equal to the default value.
603         boolean stableValue = FlagsFactory.getFlags().getSpePilotJobEnabled();
604         assertThat(stableValue).isEqualTo(DEFAULT_SPE_PILOT_JOB_ENABLED);
605 
606         // override the value in device config.
607         boolean overrideEnabled = !stableValue;
608         DeviceConfig.setProperty(
609                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
610                 KEY_ODP_SPE_PILOT_JOB_ENABLED,
611                 Boolean.toString(overrideEnabled),
612                 /* makeDefault= */ false);
613 
614         // the flag value remains stable
615         assertThat(FlagsFactory.getFlags().getSpePilotJobEnabled()).isEqualTo(overrideEnabled);
616     }
617 
618     @Test
testAppInstallHistoryTtl()619     public void testAppInstallHistoryTtl() {
620         // read a stable flag value and verify it's equal to the default value.
621         long stableValue = FlagsFactory.getFlags().getAppInstallHistoryTtlInMillis();
622         assertThat(stableValue).isEqualTo(DEFAULT_APP_INSTALL_HISTORY_TTL_MILLIS);
623 
624         // override the value in device config.
625         long overrideEnabled = 1000L;
626         DeviceConfig.setProperty(
627                 DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION,
628                 APP_INSTALL_HISTORY_TTL,
629                 Long.toString(overrideEnabled),
630                 /* makeDefault= */ false);
631 
632         // the flag value remains stable
633         assertThat(FlagsFactory.getFlags().getAppInstallHistoryTtlInMillis())
634                 .isEqualTo(overrideEnabled);
635     }
636 }
637