1 /* 2 * Copyright 2018 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 androidx.work.impl.background.firebase; 18 19 import static android.support.test.espresso.matcher.ViewMatchers.assertThat; 20 21 import static org.hamcrest.CoreMatchers.is; 22 import static org.mockito.Mockito.mock; 23 import static org.mockito.Mockito.when; 24 25 import android.support.test.filters.LargeTest; 26 import android.support.test.filters.SmallTest; 27 import android.support.test.runner.AndroidJUnit4; 28 29 import androidx.work.OneTimeWorkRequest; 30 import androidx.work.State; 31 import androidx.work.WorkRequest; 32 import androidx.work.impl.WorkDatabase; 33 import androidx.work.impl.WorkManagerImpl; 34 import androidx.work.impl.model.WorkSpecDao; 35 import androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule; 36 import androidx.work.worker.FirebaseInfiniteTestWorker; 37 38 import com.firebase.jobdispatcher.JobParameters; 39 40 import org.junit.After; 41 import org.junit.Before; 42 import org.junit.Rule; 43 import org.junit.Test; 44 import org.junit.runner.RunWith; 45 46 @RunWith(AndroidJUnit4.class) 47 public class FirebaseJobServiceTest { 48 49 @Rule 50 public InstantTaskExecutorRule mRule = new InstantTaskExecutorRule(); 51 52 private WorkDatabase mDatabase; 53 private FirebaseJobService mFirebaseJobService; 54 55 @Before 56 public void setUp() { 57 mDatabase = WorkManagerImpl.getInstance().getWorkDatabase(); 58 mFirebaseJobService = new FirebaseJobService(); 59 mFirebaseJobService.onCreate(); 60 } 61 62 @After 63 public void tearDown() { 64 mFirebaseJobService.onDestroy(); 65 } 66 67 @Test 68 @LargeTest 69 public void testOnStopJob_ResetsWorkStatus() throws InterruptedException { 70 OneTimeWorkRequest work = 71 new OneTimeWorkRequest.Builder(FirebaseInfiniteTestWorker.class).build(); 72 insertWork(work); 73 74 JobParameters mockParams = createMockJobParameters(work.getStringId()); 75 mFirebaseJobService.onStartJob(mockParams); 76 77 // TODO(sumir): Remove later. Put here because WorkerWrapper sets state to RUNNING. 78 Thread.sleep(5000L); 79 80 WorkSpecDao workSpecDao = mDatabase.workSpecDao(); 81 assertThat(workSpecDao.getState(work.getStringId()), is(State.RUNNING)); 82 83 mFirebaseJobService.onStopJob(mockParams); 84 assertThat(workSpecDao.getState(work.getStringId()), is(State.ENQUEUED)); 85 } 86 87 @Test 88 @SmallTest 89 public void testOnStopJob_ReschedulesWhenNotCancelled() { 90 OneTimeWorkRequest work = 91 new OneTimeWorkRequest.Builder(FirebaseInfiniteTestWorker.class).build(); 92 insertWork(work); 93 94 JobParameters mockParams = createMockJobParameters(work.getStringId()); 95 assertThat(mFirebaseJobService.onStartJob(mockParams), is(true)); 96 assertThat(mFirebaseJobService.onStopJob(mockParams), is(true)); 97 } 98 99 @Test 100 @SmallTest 101 public void testOnStopJob_DoesNotRescheduleWhenCancelled() { 102 OneTimeWorkRequest work = 103 new OneTimeWorkRequest.Builder(FirebaseInfiniteTestWorker.class).build(); 104 insertWork(work); 105 106 JobParameters mockParams = createMockJobParameters(work.getStringId()); 107 assertThat(mFirebaseJobService.onStartJob(mockParams), is(true)); 108 WorkManagerImpl.getInstance().cancelWorkById(work.getId()); 109 assertThat(mFirebaseJobService.onStopJob(mockParams), is(false)); 110 } 111 112 private JobParameters createMockJobParameters(String id) { 113 JobParameters jobParameters = mock(JobParameters.class); 114 when(jobParameters.getTag()).thenReturn(id); 115 return jobParameters; 116 } 117 118 private void insertWork(WorkRequest work) { 119 mDatabase.workSpecDao().insertWorkSpec(work.getWorkSpec()); 120 } 121 } 122