SystemJobServiceTest.java revision 515ed7401d62081fb2cdd34fc8df325ed8943719
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 17package androidx.work.impl.background.systemjob; 18 19import static android.support.test.espresso.matcher.ViewMatchers.assertThat; 20 21import static org.hamcrest.CoreMatchers.is; 22import static org.mockito.Mockito.mock; 23import static org.mockito.Mockito.when; 24 25import android.app.job.JobParameters; 26import android.arch.core.executor.ArchTaskExecutor; 27import android.arch.core.executor.TaskExecutor; 28import android.os.PersistableBundle; 29import android.support.annotation.NonNull; 30import android.support.test.InstrumentationRegistry; 31import android.support.test.filters.SdkSuppress; 32import android.support.test.filters.SmallTest; 33import android.support.test.runner.AndroidJUnit4; 34 35import org.junit.After; 36import org.junit.Before; 37import org.junit.Rule; 38import org.junit.Test; 39import org.junit.runner.RunWith; 40 41import androidx.work.BaseWork; 42import androidx.work.State; 43import androidx.work.Work; 44import androidx.work.WorkManagerTest; 45import androidx.work.impl.WorkDatabase; 46import androidx.work.impl.WorkManagerImpl; 47import androidx.work.impl.model.WorkSpecDao; 48import androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule; 49import androidx.work.worker.InfiniteTestWorker; 50 51@RunWith(AndroidJUnit4.class) 52@SdkSuppress(minSdkVersion = WorkManagerImpl.MIN_JOB_SCHEDULER_API_LEVEL) 53public class SystemJobServiceTest extends WorkManagerTest { 54 55 @Rule 56 public InstantTaskExecutorRule mRule = new InstantTaskExecutorRule(); 57 58 private WorkDatabase mDatabase; 59 private SystemJobService mSystemJobService; 60 61 @Before 62 public void setUp() { 63 ArchTaskExecutor.getInstance().setDelegate(new TaskExecutor() { 64 @Override 65 public void executeOnDiskIO(@NonNull Runnable runnable) { 66 runnable.run(); 67 } 68 69 @Override 70 public void postToMainThread(@NonNull Runnable runnable) { 71 runnable.run(); 72 } 73 74 @Override 75 public boolean isMainThread() { 76 return true; 77 } 78 }); 79 80 mDatabase = WorkManagerImpl.getInstance(InstrumentationRegistry.getTargetContext()) 81 .getWorkDatabase(); 82 mSystemJobService = new SystemJobService(); // Bleh. 83 mSystemJobService.onCreate(); 84 } 85 86 @After 87 public void tearDown() { 88 mSystemJobService.onDestroy(); 89 ArchTaskExecutor.getInstance().setDelegate(null); 90 } 91 92 @Test 93 @SmallTest 94 public void testOnStopJob_ResetsWorkStatus() throws InterruptedException { 95 Work work = new Work.Builder(InfiniteTestWorker.class).build(); 96 insertWork(work); 97 98 JobParameters mockParams = createMockJobParameters(work.getId()); 99 mSystemJobService.onStartJob(mockParams); 100 101 // TODO(sumir): Remove later. Put here because WorkerWrapper sets state to RUNNING. 102 Thread.sleep(1000L); 103 104 WorkSpecDao workSpecDao = mDatabase.workSpecDao(); 105 assertThat(workSpecDao.getState(work.getId()), is(State.RUNNING)); 106 107 mSystemJobService.onStopJob(mockParams); 108 assertThat(workSpecDao.getState(work.getId()), is(State.ENQUEUED)); 109 } 110 111 @Test 112 @SmallTest 113 public void testOnStopJob_ReschedulesWhenNotCancelled() { 114 Work work = new Work.Builder(InfiniteTestWorker.class).build(); 115 insertWork(work); 116 117 JobParameters mockParams = createMockJobParameters(work.getId()); 118 assertThat(mSystemJobService.onStartJob(mockParams), is(true)); 119 assertThat(mSystemJobService.onStopJob(mockParams), is(true)); 120 } 121 122 @Test 123 @SmallTest 124 public void testOnStopJob_DoesNotRescheduleWhenCancelled() { 125 Work work = new Work.Builder(InfiniteTestWorker.class).build(); 126 insertWork(work); 127 128 JobParameters mockParams = createMockJobParameters(work.getId()); 129 assertThat(mSystemJobService.onStartJob(mockParams), is(true)); 130 WorkManagerImpl.getInstance(InstrumentationRegistry.getTargetContext()) 131 .cancelWorkForId(work.getId()); 132 assertThat(mSystemJobService.onStopJob(mockParams), is(false)); 133 } 134 135 private JobParameters createMockJobParameters(String id) { 136 JobParameters jobParameters = mock(JobParameters.class); 137 138 PersistableBundle persistableBundle = new PersistableBundle(); 139 persistableBundle.putString(SystemJobInfoConverter.EXTRA_WORK_SPEC_ID, id); 140 when(jobParameters.getExtras()).thenReturn(persistableBundle); 141 142 return jobParameters; 143 } 144 145 private void insertWork(BaseWork work) { 146 mDatabase.workSpecDao().insertWorkSpec(getWorkSpec(work)); 147 } 148} 149