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