Home | History | Annotate | Download | only in firebase
      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