• 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 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