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 android.ext.services.common; 18 19 20 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; 21 22 import static com.google.common.truth.Truth.assertWithMessage; 23 24 import static org.junit.Assert.assertEquals; 25 import static org.junit.Assert.assertNotNull; 26 import static org.junit.Assert.assertTrue; 27 import static org.mockito.ArgumentMatchers.any; 28 import static org.mockito.ArgumentMatchers.anyBoolean; 29 import static org.mockito.ArgumentMatchers.anyInt; 30 import static org.mockito.ArgumentMatchers.anyLong; 31 import static org.mockito.ArgumentMatchers.eq; 32 import static org.mockito.Mockito.doNothing; 33 import static org.mockito.Mockito.doReturn; 34 import static org.mockito.Mockito.doThrow; 35 import static org.mockito.Mockito.mock; 36 import static org.mockito.Mockito.never; 37 import static org.mockito.Mockito.verify; 38 import static org.mockito.Mockito.when; 39 40 import android.app.job.JobInfo; 41 import android.app.job.JobParameters; 42 import android.app.job.JobScheduler; 43 import android.content.Context; 44 import android.content.SharedPreferences; 45 46 import androidx.appsearch.app.AppSearchResult; 47 import androidx.appsearch.app.SetSchemaResponse; 48 import androidx.test.core.app.ApplicationProvider; 49 50 import com.google.common.truth.Expect; 51 52 import org.junit.After; 53 import org.junit.Before; 54 import org.junit.Rule; 55 import org.junit.Test; 56 import org.mockito.ArgumentCaptor; 57 import org.mockito.Mock; 58 import org.mockito.Mockito; 59 import org.mockito.MockitoSession; 60 import org.mockito.Spy; 61 import org.mockito.quality.Strictness; 62 63 import java.util.ArrayList; 64 import java.util.List; 65 import java.util.concurrent.Executor; 66 import java.util.concurrent.LinkedBlockingQueue; 67 import java.util.concurrent.ThreadPoolExecutor; 68 import java.util.concurrent.TimeUnit; 69 70 public final class AdServicesAppsearchDeleteJobTest { 71 72 private MockitoSession mMockitoSession; 73 74 @Spy 75 private final Context mContext = ApplicationProvider.getApplicationContext(); 76 77 @Spy 78 private AdServicesAppsearchDeleteJob mAdServicesAppsearchDeleteJob; 79 80 @Mock 81 private AdservicesPhFlags mAdservicesPhFlags; 82 83 @Mock 84 private SharedPreferences mSharedPreferences; 85 86 @Mock 87 private SharedPreferences.Editor mEditor; 88 89 @Rule 90 public final Expect expect = Expect.create(); 91 92 public static final String TEST = "test"; 93 94 private final Executor mExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, 95 new LinkedBlockingQueue<Runnable>()); 96 97 @Before setup()98 public void setup() { 99 mMockitoSession = mockitoSession() 100 .initMocks(this) 101 .strictness(Strictness.LENIENT) 102 .startMocking(); 103 doReturn(mAdservicesPhFlags).when(mAdServicesAppsearchDeleteJob).getAdservicesPhFlags(); 104 doReturn(mSharedPreferences).when(mAdServicesAppsearchDeleteJob).getSharedPreferences(); 105 doReturn(mEditor).when(mSharedPreferences).edit(); 106 doReturn(mEditor).when(mEditor).putLong(any(), anyLong()); 107 doReturn(mEditor).when(mEditor).putBoolean(any(), anyBoolean()); 108 doReturn(mEditor).when(mEditor).putInt(any(), anyInt()); 109 doReturn(true).when(mEditor).commit(); 110 doNothing().when(mAdServicesAppsearchDeleteJob).setReschedule(any(), anyBoolean()); 111 doReturn(0L).when(mSharedPreferences) 112 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 0L); 113 } 114 115 @After tearDown()116 public void tearDown() { 117 if (mMockitoSession != null) { 118 mMockitoSession.finishMocking(); 119 } 120 } 121 122 @Test hasMinMinutestPassed_test()123 public void hasMinMinutestPassed_test() { 124 assertWithMessage("hasMinMinutesPassed from 1693785600L to 1000 mins should be true") 125 .that(mAdServicesAppsearchDeleteJob 126 .hasMinMinutesPassed(1693785600L, 1000)) 127 .isTrue(); 128 assertWithMessage("hasMinMinutesPassed from current time to 1000 mins" 129 + " should be false").that(mAdServicesAppsearchDeleteJob 130 .hasMinMinutesPassed(System.currentTimeMillis(), 131 1000)).isFalse(); 132 } 133 134 @Test deleteAppsearchDb_onMigrationfailure_shouldBeFalse()135 public void deleteAppsearchDb_onMigrationfailure_shouldBeFalse() 136 throws Exception { 137 SetSchemaResponse mockResponse = Mockito.mock(SetSchemaResponse.class); 138 SetSchemaResponse.MigrationFailure failure = 139 new SetSchemaResponse.MigrationFailure( 140 /* namespace= */ TEST, 141 /* id= */ TEST, 142 /* schemaType= */ TEST, 143 /* appSearchResult= */ AppSearchResult.newFailedResult(1, TEST)); 144 when(mockResponse.getMigrationFailures()).thenReturn(List.of(failure)); 145 doReturn(mockResponse).when(mAdServicesAppsearchDeleteJob).getDeleteSchemaResponse( 146 any(), any(), any()); 147 assertWithMessage("deleteAppsearchDb result should be false") 148 .that(mAdServicesAppsearchDeleteJob.deleteAppsearchDb(mContext, mExecutor, TEST)) 149 .isFalse(); 150 } 151 152 @Test deleteAppsearchDb_onException_shouldBeFalse()153 public void deleteAppsearchDb_onException_shouldBeFalse() 154 throws Exception { 155 doThrow(new RuntimeException(TEST)).when( 156 mAdServicesAppsearchDeleteJob).getDeleteSchemaResponse(any(), any(), any()); 157 assertWithMessage("deleteAppsearchDb result should be false") 158 .that(mAdServicesAppsearchDeleteJob.deleteAppsearchDb(mContext, mExecutor, TEST)) 159 .isFalse(); 160 } 161 162 @Test deleteAppsearchDb_onSuccess_shouldBeTrue()163 public void deleteAppsearchDb_onSuccess_shouldBeTrue() 164 throws Exception { 165 SetSchemaResponse mockResponse = Mockito.mock(SetSchemaResponse.class); 166 when(mockResponse.getMigrationFailures()).thenReturn(new ArrayList<>()); 167 doReturn(mockResponse).when(mAdServicesAppsearchDeleteJob).getDeleteSchemaResponse( 168 any(), any(), any()); 169 assertWithMessage("deleteAppsearchDb result should be true") 170 .that(mAdServicesAppsearchDeleteJob.deleteAppsearchDb(mContext, mExecutor, TEST)) 171 .isTrue(); 172 173 } 174 175 @Test onCancelJob_shouldNotReschedule()176 public void onCancelJob_shouldNotReschedule() 177 throws Exception { 178 doNothing().when(mAdServicesAppsearchDeleteJob).setReschedule(any(), 179 anyBoolean()); 180 JobParameters jobParameters = mock(JobParameters.class); 181 doReturn(0).when(jobParameters).getJobId(); 182 final JobScheduler jobScheduler = mock(JobScheduler.class); 183 when(jobScheduler.getPendingJob(anyInt())).thenReturn(null); 184 when(mContext.getSystemService(JobScheduler.class)).thenReturn(jobScheduler); 185 doNothing().when(jobScheduler).cancel(anyInt()); 186 187 // Execute 188 mAdServicesAppsearchDeleteJob.cancelPeriodicJob(mContext, jobParameters); 189 190 // Validate 191 verify(jobScheduler).cancel(0); 192 verify(mAdServicesAppsearchDeleteJob).setReschedule(any(), eq(false)); 193 194 } 195 196 @Test schedulePeriodic_onDisabledFlag_shouldNotSchedule()197 public void schedulePeriodic_onDisabledFlag_shouldNotSchedule() { 198 final JobScheduler jobScheduler = mock(JobScheduler.class); 199 when(jobScheduler.getPendingJob(anyInt())) 200 .thenReturn(null); 201 when(mContext.getSystemService(JobScheduler.class)).thenReturn(jobScheduler); 202 when(jobScheduler.schedule(any())).thenReturn(1); 203 doReturn(false).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 204 205 // Execute 206 AdServicesAppsearchDeleteJob 207 .scheduleAdServicesAppsearchDeletePeriodicJob( 208 mContext, mAdservicesPhFlags); 209 // Validate 210 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 211 verify(jobScheduler, never()).schedule(any()); 212 213 } 214 215 @Test schedulePeriodic_onExistingJob_shouldNotSchedule()216 public void schedulePeriodic_onExistingJob_shouldNotSchedule() { 217 final JobScheduler jobScheduler = mock(JobScheduler.class); 218 when(jobScheduler.getPendingJob(anyInt())) 219 .thenReturn(Mockito.mock((JobInfo.class))); 220 when(mContext.getSystemService(JobScheduler.class)).thenReturn(jobScheduler); 221 when(jobScheduler.schedule(any())).thenReturn(1); 222 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 223 224 // Execute 225 AdServicesAppsearchDeleteJob 226 .scheduleAdServicesAppsearchDeletePeriodicJob( 227 mContext, mAdservicesPhFlags); 228 // Validate 229 230 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 231 verify(jobScheduler).getPendingJob(anyInt()); 232 verify(jobScheduler, never()).schedule(any()); 233 234 } 235 236 @Test schedulePeriodic_onNonExistingJob_EnabledJob_shouldSchedule()237 public void schedulePeriodic_onNonExistingJob_EnabledJob_shouldSchedule() { 238 final JobScheduler jobScheduler = mock(JobScheduler.class); 239 when(jobScheduler.getPendingJob(anyInt())) 240 .thenReturn(null); 241 when(mContext.getSystemService(JobScheduler.class)).thenReturn(jobScheduler); 242 when(jobScheduler.schedule(any())).thenReturn(0); 243 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 244 doReturn(3600000L).when(mAdservicesPhFlags) 245 .getAppsearchDeletePeriodicIntervalMillis(); 246 doReturn(3600000L).when(mAdservicesPhFlags).getAppsearchDeleteJobFlexMillis(); 247 248 final ArgumentCaptor<JobInfo> captor = ArgumentCaptor.forClass(JobInfo.class); 249 250 // Execute 251 AdServicesAppsearchDeleteJob 252 .scheduleAdServicesAppsearchDeletePeriodicJob( 253 mContext, mAdservicesPhFlags); 254 255 // Validate 256 verify(jobScheduler) 257 .getPendingJob(AdServicesAppsearchDeleteJob.JOB_ID); 258 verify(mAdservicesPhFlags) 259 .isAppsearchDeleteJobEnabled(); 260 verify(mAdservicesPhFlags) 261 .getAppsearchDeletePeriodicIntervalMillis(); 262 verify(mAdservicesPhFlags) 263 .getAppsearchDeleteJobFlexMillis(); 264 verify(jobScheduler).schedule(captor.capture()); 265 assertNotNull(captor.getValue()); 266 assertEquals(AdServicesAppsearchDeleteJob.JOB_ID, 267 captor.getValue().getId()); 268 assertEquals("android.ext.services.common" 269 + ".AdServicesAppsearchDeleteJob", 270 captor.getValue().getService().getClassName()); 271 assertTrue(captor.getValue().isPersisted()); 272 assertEquals(3600000L, captor.getValue().getIntervalMillis()); 273 assertEquals(3600000L, captor.getValue().getFlexMillis()); 274 275 } 276 277 @Test onStartJob_disabledJob()278 public void onStartJob_disabledJob() 279 throws Exception { 280 doReturn(false).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 281 282 JobParameters jobParameters = mock(JobParameters.class); 283 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 284 285 // Execute 286 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 287 288 // Validate 289 // Wanted 290 verify(mAdservicesPhFlags) 291 .isAppsearchDeleteJobEnabled(); 292 verify(mAdServicesAppsearchDeleteJob) 293 .cancelPeriodicJob(any(), any()); 294 295 // Not Wanted 296 verify(mSharedPreferences, never()) 297 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 298 verify(mAdServicesAppsearchDeleteJob, never()) 299 .isAppsearchDbEmpty(any(), any(), any()); 300 verify(mAdservicesPhFlags, never()).isAdServicesEnabled(); 301 302 } 303 304 @Test onStartJob_onDoNothing()305 public void onStartJob_onDoNothing() 306 throws Exception { 307 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 308 doReturn(true).when(mAdservicesPhFlags) 309 .shouldDoNothingAdServicesAppsearchDeleteJob(); 310 311 JobParameters jobParameters = mock(JobParameters.class); 312 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 313 314 // Execute 315 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 316 317 // Validate 318 // Wanted 319 verify(mAdservicesPhFlags) 320 .isAppsearchDeleteJobEnabled(); 321 322 // Not Wanted 323 verify(mSharedPreferences, never()) 324 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 325 verify(mAdServicesAppsearchDeleteJob, never()) 326 .isAppsearchDbEmpty(any(), any(), any()); 327 verify(mAdServicesAppsearchDeleteJob, never()) 328 .cancelPeriodicJob(any(), any()); 329 verify(mAdservicesPhFlags, never()).isAdServicesEnabled(); 330 331 } 332 333 @Test onStartJob_enabledJob_firstTimeOta_appsearchDataNotFound()334 public void onStartJob_enabledJob_firstTimeOta_appsearchDataNotFound() 335 throws Exception { 336 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 337 338 JobParameters jobParameters = mock(JobParameters.class); 339 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 340 doReturn(true).when(mAdServicesAppsearchDeleteJob) 341 .isAppsearchDbEmpty(any(), any(), any()); 342 doReturn(0L).when(mSharedPreferences) 343 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 344 345 // Execute 346 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 347 348 // Validate 349 // Wanted 350 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 351 verify(mSharedPreferences) 352 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 353 verify(mEditor) 354 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 355 verify(mAdServicesAppsearchDeleteJob).isAppsearchDbEmpty(any(), any(), any()); 356 verify(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 357 verify(mEditor) 358 .putBoolean(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND, 359 false); 360 361 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 362 verify(mEditor).commit(); 363 364 // Not Wanted 365 verify(mAdServicesAppsearchDeleteJob, never()).hasMinMinutesPassed(anyLong(), anyLong()); 366 verify(mAdservicesPhFlags, never()).isAdServicesEnabled(); 367 verify(mAdServicesAppsearchDeleteJob, never()).deleteAppsearchDbs(any(), any(), any()); 368 } 369 370 @Test onStartJob_enabledJob_firstTimeOta_appsearchDataFound()371 public void onStartJob_enabledJob_firstTimeOta_appsearchDataFound() 372 throws Exception { 373 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 374 375 JobParameters jobParameters = mock(JobParameters.class); 376 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 377 doReturn(false).when(mAdServicesAppsearchDeleteJob) 378 .isAppsearchDbEmpty(any(), any(), any()); 379 doReturn(0L).when(mSharedPreferences) 380 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 381 382 // Execute 383 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 384 385 // Validate 386 // Wanted 387 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 388 verify(mSharedPreferences) 389 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 390 verify(mEditor) 391 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 392 verify(mAdServicesAppsearchDeleteJob).isAppsearchDbEmpty(any(), any(), any()); 393 verify(mEditor) 394 .putBoolean(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND, 395 true); 396 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 397 verify(mEditor).commit(); 398 399 // Not Wanted 400 verify(mAdservicesPhFlags, never()).getMinMinutesFromOtaToDeleteAppsearchData(); 401 verify(mAdservicesPhFlags, never()).isAdServicesEnabled(); 402 verify(mAdServicesAppsearchDeleteJob, never()).cancelPeriodicJob(any(), any()); 403 verify(mAdServicesAppsearchDeleteJob, never()).setReschedule(jobParameters, false); 404 verify(mAdServicesAppsearchDeleteJob, never()).hasMinMinutesPassed(anyLong(), anyLong()); 405 verify(mAdServicesAppsearchDeleteJob, never()).deleteAppsearchDbs(any(), any(), any()); 406 } 407 408 @Test onStartJob_enabledJob_minMinutesFromOTAPassed_shouldDelete()409 public void onStartJob_enabledJob_minMinutesFromOTAPassed_shouldDelete() 410 throws Exception { 411 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 412 413 JobParameters jobParameters = mock(JobParameters.class); 414 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 415 416 417 doReturn(false).when(mAdServicesAppsearchDeleteJob) 418 .isAppsearchDbEmpty(any(), any(), any()); 419 420 long otaDate = 1693785600L; 421 long minMinutesFromOtaToTToDelete = 100L; 422 doReturn(otaDate).when(mSharedPreferences) 423 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 424 425 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 426 .getMinMinutesFromOtaToDeleteAppsearchData(); 427 doReturn(true).when(mAdServicesAppsearchDeleteJob) 428 .deleteAppsearchDbs(any(), any(), any()); 429 doNothing().when(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 430 431 // Execute 432 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 433 434 // Validate 435 //Wanted 436 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 437 verify(mSharedPreferences) 438 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 439 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 440 verify(mAdServicesAppsearchDeleteJob) 441 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 442 verify(mAdServicesAppsearchDeleteJob).deleteAppsearchDbs(any(), any(), any()); 443 verify(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 444 verify(mEditor).putLong( 445 eq(AdServicesAppsearchDeleteJob 446 .SHARED_PREFS_KEY_ADSERVICES_APPSEARCH_DELETED), 447 anyLong()); 448 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 449 verify(mEditor).commit(); 450 451 // Not Wanted 452 verify(mEditor, never()) 453 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 454 verify(mAdServicesAppsearchDeleteJob, never()).isAppsearchDbEmpty(any(), any(), any()); 455 verify(mAdservicesPhFlags, never()).getMinMinutesFromOtaToCheckAdServicesStatus(); 456 verify(mAdservicesPhFlags, never()).isAdServicesEnabled(); 457 verify(mEditor, never()) 458 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 459 anyBoolean()); 460 } 461 462 @Test onStartJob_enabledJob_deleteDbsException_shouldNotCancel()463 public void onStartJob_enabledJob_deleteDbsException_shouldNotCancel() 464 throws Exception { 465 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 466 doReturn(5).when(mAdservicesPhFlags).getMaxAppsearchAdServicesDeleteAttempts(); 467 doReturn(1).when(mSharedPreferences) 468 .getInt(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ATTEMPTED_DELETE_COUNT, 0); 469 JobParameters jobParameters = mock(JobParameters.class); 470 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 471 472 doReturn(false).when(mAdServicesAppsearchDeleteJob) 473 .isAppsearchDbEmpty(any(), any(), any()); 474 475 long otaDate = 1693785600L; 476 long minMinutesFromOtaToTToDelete = 100L; 477 doReturn(otaDate).when(mSharedPreferences) 478 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 479 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 480 .getMinMinutesFromOtaToDeleteAppsearchData(); 481 doReturn(false).when(mAdServicesAppsearchDeleteJob) 482 .deleteAppsearchDbs(any(), any(), any()); 483 doNothing().when(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 484 485 // Execute 486 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 487 488 // Validate 489 // Wanted 490 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 491 verify(mSharedPreferences) 492 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 493 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 494 verify(mAdServicesAppsearchDeleteJob) 495 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 496 verify(mAdServicesAppsearchDeleteJob).deleteAppsearchDbs(any(), any(), any()); 497 498 verify(mEditor).putInt(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ATTEMPTED_DELETE_COUNT, 499 2); 500 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 501 verify(mEditor).commit(); 502 503 // Not Wanted 504 verify(mEditor, never()) 505 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 506 verify(mAdServicesAppsearchDeleteJob, never()).isAppsearchDbEmpty(any(), any(), any()); 507 verify(mAdservicesPhFlags, never()).getMinMinutesFromOtaToCheckAdServicesStatus(); 508 verify(mAdServicesAppsearchDeleteJob, never()).cancelPeriodicJob(any(), any()); 509 verify(mEditor, never()).putLong( 510 eq(AdServicesAppsearchDeleteJob 511 .SHARED_PREFS_KEY_ADSERVICES_APPSEARCH_DELETED), 512 anyLong()); 513 verify(mAdservicesPhFlags, never()).isAdServicesEnabled(); 514 verify(mEditor, never()) 515 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 516 anyBoolean()); 517 518 } 519 520 @Test onStartJob_enabledJob_deleteDbsException_onMaxAttempts_shouldCancel()521 public void onStartJob_enabledJob_deleteDbsException_onMaxAttempts_shouldCancel() 522 throws Exception { 523 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 524 doReturn(5).when(mAdservicesPhFlags).getMaxAppsearchAdServicesDeleteAttempts(); 525 doReturn(4).when(mSharedPreferences) 526 .getInt(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ATTEMPTED_DELETE_COUNT, 0); 527 JobParameters jobParameters = mock(JobParameters.class); 528 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 529 530 doReturn(false).when(mAdServicesAppsearchDeleteJob) 531 .isAppsearchDbEmpty(any(), any(), any()); 532 533 long otaDate = 1693785600L; 534 long minMinutesFromOtaToTToDelete = 100L; 535 doReturn(otaDate).when(mSharedPreferences) 536 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 537 538 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 539 .getMinMinutesFromOtaToDeleteAppsearchData(); 540 doReturn(false).when(mAdServicesAppsearchDeleteJob) 541 .deleteAppsearchDbs(any(), any(), any()); 542 doNothing().when(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 543 544 // Execute 545 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 546 547 // Validate 548 //Wanted 549 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 550 verify(mSharedPreferences) 551 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 552 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 553 verify(mAdServicesAppsearchDeleteJob) 554 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 555 verify(mAdServicesAppsearchDeleteJob).deleteAppsearchDbs(any(), any(), any()); 556 verify(mEditor).putInt(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ATTEMPTED_DELETE_COUNT, 557 5); 558 verify(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 559 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 560 verify(mEditor).commit(); 561 562 // Not Wanted 563 verify(mEditor, never()) 564 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 565 verify(mAdServicesAppsearchDeleteJob, never()) 566 .isAppsearchDbEmpty(any(), any(), any()); 567 verify(mAdservicesPhFlags, never()).getMinMinutesFromOtaToCheckAdServicesStatus(); 568 verify(mEditor, never()).putLong( 569 eq(AdServicesAppsearchDeleteJob 570 .SHARED_PREFS_KEY_ADSERVICES_APPSEARCH_DELETED), 571 anyLong()); 572 verify(mAdservicesPhFlags, never()).isAdServicesEnabled(); 573 verify(mEditor, never()) 574 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 575 anyBoolean()); 576 577 } 578 579 @Test onStartJob_enabledJob_minMinutesToCheckAdServicesNotPassed_shouldDoNothing()580 public void onStartJob_enabledJob_minMinutesToCheckAdServicesNotPassed_shouldDoNothing() 581 throws Exception { 582 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 583 584 JobParameters jobParameters = mock(JobParameters.class); 585 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 586 doReturn(false).when(mAdServicesAppsearchDeleteJob) 587 .isAppsearchDbEmpty(any(), any(), any()); 588 589 long otaDate = System.currentTimeMillis(); 590 long minMinutesFromOtaToTToDelete = 1000L; 591 doReturn(otaDate).when(mSharedPreferences) 592 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 593 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 594 .getMinMinutesFromOtaToDeleteAppsearchData(); 595 long minMinutesToCheckAdServices = 100L; 596 doReturn(minMinutesToCheckAdServices).when(mAdservicesPhFlags) 597 .getMinMinutesFromOtaToCheckAdServicesStatus(); 598 doNothing().when(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 599 600 // Execute 601 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 602 603 // Validate 604 // Wanted 605 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 606 verify(mSharedPreferences) 607 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 608 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 609 verify(mAdservicesPhFlags).getMinMinutesFromOtaToCheckAdServicesStatus(); 610 verify(mAdServicesAppsearchDeleteJob) 611 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 612 verify(mAdServicesAppsearchDeleteJob) 613 .hasMinMinutesPassed(otaDate, minMinutesToCheckAdServices); 614 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 615 verify(mEditor).commit(); 616 617 // Not Wanted 618 verify(mEditor, never()) 619 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 620 verify(mAdServicesAppsearchDeleteJob, never()) 621 .isAppsearchDbEmpty(any(), any(), any()); 622 verify(mAdservicesPhFlags, never()).isAdServicesEnabled(); 623 verify(mEditor, never()) 624 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 625 anyBoolean()); 626 verify(mAdServicesAppsearchDeleteJob, never()).deleteAppsearchDbs(any(), any(), any()); 627 verify(mAdServicesAppsearchDeleteJob, never()).cancelPeriodicJob(any(), any()); 628 } 629 630 @Test onStartJob_enabledJob_adservicesDisabled_shouldNotDelete()631 public void onStartJob_enabledJob_adservicesDisabled_shouldNotDelete() 632 throws Exception { 633 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 634 635 JobParameters jobParameters = mock(JobParameters.class); 636 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 637 doReturn(false).when(mAdServicesAppsearchDeleteJob) 638 .isAppsearchDbEmpty(any(), any(), any()); 639 640 long otaDate = System.currentTimeMillis(); 641 long minMinutesFromOtaToTToDelete = 10000L; 642 doReturn(otaDate).when(mSharedPreferences) 643 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 644 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 645 .getMinMinutesFromOtaToDeleteAppsearchData(); 646 doReturn(true).when(mAdServicesAppsearchDeleteJob) 647 .deleteAppsearchDbs(any(), any(), any()); 648 doReturn(0L).when(mSharedPreferences) 649 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 650 0L); 651 doReturn(false).when(mAdservicesPhFlags).isAdServicesEnabled(); 652 long minMinutesToCheckAdServices = 0; 653 doReturn(minMinutesToCheckAdServices).when(mAdservicesPhFlags) 654 .getMinMinutesFromOtaToCheckAdServicesStatus(); 655 656 // Execute 657 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 658 659 // Validate 660 //Wanted 661 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 662 verify(mSharedPreferences) 663 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 664 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 665 verify(mAdServicesAppsearchDeleteJob) 666 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 667 verify(mAdservicesPhFlags).getMinMinutesFromOtaToCheckAdServicesStatus(); 668 verify(mAdServicesAppsearchDeleteJob) 669 .hasMinMinutesPassed(otaDate, minMinutesToCheckAdServices); 670 verify(mAdservicesPhFlags).isAdServicesEnabled(); 671 672 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 673 verify(mEditor).commit(); 674 675 // Not Wanted 676 verify(mAdServicesAppsearchDeleteJob, never()).isAppsearchDbEmpty(any(), any(), any()); 677 verify(mAdServicesAppsearchDeleteJob, never()).deleteAppsearchDbs(any(), any(), any()); 678 verify(mAdServicesAppsearchDeleteJob, never()).cancelPeriodicJob(any(), any()); 679 verify(mEditor, never()) 680 .putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0); 681 verify(mEditor, never()) 682 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 683 anyBoolean()); 684 685 } 686 687 @Test onStartJob_enabledJob_adservicesEnabledFirstTime_shouldNotDelete()688 public void onStartJob_enabledJob_adservicesEnabledFirstTime_shouldNotDelete() 689 throws Exception { 690 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 691 692 JobParameters jobParameters = mock(JobParameters.class); 693 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 694 doReturn(false).when(mAdServicesAppsearchDeleteJob) 695 .isAppsearchDbEmpty(any(), any(), any()); 696 697 long otaDate = System.currentTimeMillis(); 698 long minMinutesFromOtaToTToDelete = 10000L; 699 doReturn(otaDate).when(mSharedPreferences) 700 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 701 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 702 .getMinMinutesFromOtaToDeleteAppsearchData(); 703 704 doReturn(true).when(mAdservicesPhFlags).isAdServicesEnabled(); 705 doReturn(0L).when(mSharedPreferences) 706 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 707 0L); 708 long minMinutesToCheckAdServices = 0L; 709 doReturn(minMinutesToCheckAdServices).when(mAdservicesPhFlags) 710 .getMinMinutesFromOtaToCheckAdServicesStatus(); 711 712 // Execute 713 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 714 715 // Validate 716 //Wanted 717 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 718 verify(mSharedPreferences) 719 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 720 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 721 verify(mAdServicesAppsearchDeleteJob) 722 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 723 verify(mAdservicesPhFlags).getMinMinutesFromOtaToCheckAdServicesStatus(); 724 verify(mAdServicesAppsearchDeleteJob) 725 .hasMinMinutesPassed(otaDate, minMinutesToCheckAdServices); 726 verify(mAdservicesPhFlags).isAdServicesEnabled(); 727 verify(mSharedPreferences) 728 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 729 0L); 730 verify(mAdservicesPhFlags).isAdServicesEnabled(); 731 verify(mEditor).putLong( 732 eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE), 733 anyLong()); 734 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 735 verify(mEditor).commit(); 736 737 // Not Wanted 738 verify(mEditor, never()) 739 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 740 verify(mAdServicesAppsearchDeleteJob, never()).isAppsearchDbEmpty(any(), any(), any()); 741 verify(mAdServicesAppsearchDeleteJob, never()).deleteAppsearchDbs(any(), any(), any()); 742 verify(mAdServicesAppsearchDeleteJob, never()).cancelPeriodicJob(any(), any()); 743 verify(mAdservicesPhFlags, never()).getMinMinutesToDeleteFromAdServicesEnabled(); 744 verify(mEditor, never()) 745 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 746 anyBoolean()); 747 748 } 749 750 @Test onStartJob_enabledJob_adservicesEnabled_MinMinsNotPassed_shouldNotDelete()751 public void onStartJob_enabledJob_adservicesEnabled_MinMinsNotPassed_shouldNotDelete() 752 throws Exception { 753 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 754 755 JobParameters jobParameters = mock(JobParameters.class); 756 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 757 doReturn(false).when(mAdServicesAppsearchDeleteJob) 758 .isAppsearchDbEmpty(any(), any(), any()); 759 760 long otaDate = System.currentTimeMillis(); 761 long minMinutesFromOtaToTToDelete = 10000L; 762 doReturn(otaDate).when(mSharedPreferences) 763 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 764 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 765 .getMinMinutesFromOtaToDeleteAppsearchData(); 766 767 doReturn(true).when(mAdservicesPhFlags).isAdServicesEnabled(); 768 long adServicesDate = System.currentTimeMillis(); 769 doReturn(adServicesDate).when(mSharedPreferences) 770 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 771 0L); 772 long minMinsForAdServicesEnabled = 9000000L; 773 doReturn(minMinsForAdServicesEnabled).when(mAdservicesPhFlags) 774 .getMinMinutesToDeleteFromAdServicesEnabled(); 775 long minMinutesToCheckAdServices = 0; 776 doReturn(minMinutesToCheckAdServices).when(mAdservicesPhFlags) 777 .getMinMinutesFromOtaToCheckAdServicesStatus(); 778 779 // Execute 780 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 781 782 // Validate 783 // Wanted 784 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 785 verify(mSharedPreferences) 786 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 787 verify(mAdServicesAppsearchDeleteJob) 788 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 789 verify(mAdservicesPhFlags).getMinMinutesFromOtaToCheckAdServicesStatus(); 790 verify(mAdServicesAppsearchDeleteJob) 791 .hasMinMinutesPassed(otaDate, minMinutesToCheckAdServices); 792 verify(mSharedPreferences) 793 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 794 0L); 795 verify(mAdservicesPhFlags).isAdServicesEnabled(); 796 verify(mAdservicesPhFlags).getMinMinutesToDeleteFromAdServicesEnabled(); 797 verify(mAdServicesAppsearchDeleteJob) 798 .hasMinMinutesPassed(adServicesDate, minMinsForAdServicesEnabled); 799 800 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 801 verify(mEditor).commit(); 802 803 // Not Wanted 804 verify(mEditor, never()) 805 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 806 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 807 verify(mAdServicesAppsearchDeleteJob, never()).isAppsearchDbEmpty(any(), any(), any()); 808 verify(mAdServicesAppsearchDeleteJob, never()).deleteAppsearchDbs(any(), any(), any()); 809 verify(mAdServicesAppsearchDeleteJob, never()).cancelPeriodicJob(any(), any()); 810 verify(mEditor, never()).putLong( 811 eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE), 812 anyLong()); 813 verify(mEditor, never()) 814 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 815 anyBoolean()); 816 817 } 818 819 @Test onStartJob_enabledJob_adservicesDisabled_PostEnabled_shouldOverrideEnabledDate()820 public void onStartJob_enabledJob_adservicesDisabled_PostEnabled_shouldOverrideEnabledDate() 821 throws Exception { 822 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 823 824 JobParameters jobParameters = mock(JobParameters.class); 825 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 826 doReturn(false).when(mAdServicesAppsearchDeleteJob) 827 .isAppsearchDbEmpty(any(), any(), any()); 828 829 long otaDate = System.currentTimeMillis(); 830 long minMinutesFromOtaToTToDelete = 10000L; 831 doReturn(otaDate).when(mSharedPreferences) 832 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 833 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 834 .getMinMinutesFromOtaToDeleteAppsearchData(); 835 836 doReturn(false).when(mAdservicesPhFlags).isAdServicesEnabled(); 837 long adServicesDate = System.currentTimeMillis(); 838 doReturn(adServicesDate).when(mSharedPreferences) 839 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 840 0L); 841 long minMinsForAdServicesEnabled = 0L; 842 doReturn(minMinsForAdServicesEnabled).when(mAdservicesPhFlags) 843 .getMinMinutesToDeleteFromAdServicesEnabled(); 844 long minMinutesToCheckAdServices = 0; 845 doReturn(minMinutesToCheckAdServices).when(mAdservicesPhFlags) 846 .getMinMinutesFromOtaToCheckAdServicesStatus(); 847 848 // Execute 849 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 850 851 // Validate 852 //Wanted 853 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 854 verify(mSharedPreferences) 855 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 856 verify(mAdServicesAppsearchDeleteJob) 857 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 858 verify(mAdservicesPhFlags).getMinMinutesFromOtaToCheckAdServicesStatus(); 859 verify(mAdServicesAppsearchDeleteJob) 860 .hasMinMinutesPassed(otaDate, minMinutesToCheckAdServices); 861 verify(mSharedPreferences) 862 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 863 0L); 864 verify(mEditor) 865 .putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 866 0); 867 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 868 verify(mEditor).commit(); 869 870 // Not Wanted 871 verify(mEditor, never()) 872 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 873 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 874 verify(mAdServicesAppsearchDeleteJob, never()).isAppsearchDbEmpty(any(), any(), any()); 875 verify(mAdServicesAppsearchDeleteJob, never()).deleteAppsearchDbs(any(), any(), any()); 876 verify(mAdServicesAppsearchDeleteJob, never()).cancelPeriodicJob(any(), any()); 877 verify(mEditor, never()) 878 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 879 anyBoolean()); 880 } 881 882 @Test onStartJob_enabledJob_adservicesEnabled_MinMinsPassed_shouldDelete()883 public void onStartJob_enabledJob_adservicesEnabled_MinMinsPassed_shouldDelete() 884 throws Exception { 885 doReturn(true).when(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 886 887 JobParameters jobParameters = mock(JobParameters.class); 888 doReturn(AdServicesAppsearchDeleteJob.JOB_ID).when(jobParameters).getJobId(); 889 doReturn(false).when(mAdServicesAppsearchDeleteJob) 890 .isAppsearchDbEmpty(any(), any(), any()); 891 doReturn(true).when(mAdServicesAppsearchDeleteJob) 892 .deleteAppsearchDbs(any(), any(), any()); 893 long otaDate = System.currentTimeMillis(); 894 long minMinutesFromOtaToTToDelete = 10000L; 895 doReturn(otaDate).when(mSharedPreferences) 896 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 897 doReturn(minMinutesFromOtaToTToDelete).when(mAdservicesPhFlags) 898 .getMinMinutesFromOtaToDeleteAppsearchData(); 899 900 doReturn(true).when(mAdservicesPhFlags).isAdServicesEnabled(); 901 long adServicesDate = 1693785600L; 902 doReturn(adServicesDate).when(mSharedPreferences) 903 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 904 0L); 905 long minMinsForAdServicesEnabled = 10L; 906 doReturn(minMinsForAdServicesEnabled).when(mAdservicesPhFlags) 907 .getMinMinutesToDeleteFromAdServicesEnabled(); 908 long minMinutesToCheckAdServices = 0L; 909 doReturn(minMinutesToCheckAdServices).when(mAdservicesPhFlags) 910 .getMinMinutesFromOtaToCheckAdServicesStatus(); 911 doNothing().when(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 912 913 // Execute 914 mAdServicesAppsearchDeleteJob.onStartJob(jobParameters); 915 916 // Validate 917 // Wanted 918 verify(mAdservicesPhFlags).isAppsearchDeleteJobEnabled(); 919 verify(mSharedPreferences) 920 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE, 0L); 921 verify(mAdservicesPhFlags).getMinMinutesFromOtaToDeleteAppsearchData(); 922 verify(mAdservicesPhFlags).getMinMinutesFromOtaToCheckAdServicesStatus(); 923 verify(mAdServicesAppsearchDeleteJob) 924 .hasMinMinutesPassed(otaDate, minMinutesFromOtaToTToDelete); 925 verify(mSharedPreferences) 926 .getLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE, 927 0L); 928 verify(mAdservicesPhFlags).isAdServicesEnabled(); 929 verify(mAdservicesPhFlags).getMinMinutesToDeleteFromAdServicesEnabled(); 930 verify(mAdServicesAppsearchDeleteJob) 931 .hasMinMinutesPassed(adServicesDate, minMinsForAdServicesEnabled); 932 verify(mAdServicesAppsearchDeleteJob).deleteAppsearchDbs(any(), any(), any()); 933 verify(mAdServicesAppsearchDeleteJob).cancelPeriodicJob(any(), any()); 934 verify(mEditor).putLong( 935 eq(AdServicesAppsearchDeleteJob 936 .SHARED_PREFS_KEY_ADSERVICES_APPSEARCH_DELETED), 937 anyLong()); 938 verify(mEditor).putLong(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_JOB_RUN_COUNT, 1); 939 verify(mEditor).commit(); 940 941 // Not Wanted 942 verify(mEditor, never()) 943 .putLong(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_OTA_DATE), anyLong()); 944 verify(mAdServicesAppsearchDeleteJob, never()) 945 .isAppsearchDbEmpty(any(), any(), any()); 946 verify(mEditor, never()).putLong( 947 eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_ADSERVICES_ENABLED_DATE), 948 anyLong()); 949 verify(mEditor, never()) 950 .putBoolean(eq(AdServicesAppsearchDeleteJob.SHARED_PREFS_KEY_APPSEARCH_DATA_FOUND), 951 anyBoolean()); 952 953 } 954 955 } 956