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