blob: 00014a97bc9a517e3e4d13cf64fdc4f37f26ef18 [file] [log] [blame]
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -07001/*
Sumir Katariada315bf2017-12-06 16:29:10 -08002 * Copyright 2017 The Android Open Source Project
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -07003 *
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
Sumir Kataria564e4302018-02-14 11:22:30 -080017package androidx.work.impl;
Sumir Katariab6430f22018-02-05 13:45:22 -080018
Rahul Ravikumar7f7ab612018-11-01 16:22:11 -070019import static androidx.work.WorkInfo.State.BLOCKED;
20import static androidx.work.WorkInfo.State.CANCELLED;
21import static androidx.work.WorkInfo.State.ENQUEUED;
22import static androidx.work.WorkInfo.State.FAILED;
23import static androidx.work.WorkInfo.State.RUNNING;
24import static androidx.work.WorkInfo.State.SUCCEEDED;
Sumir Katariab5728f42018-03-19 12:58:41 -070025
Sumir Katariada315bf2017-12-06 16:29:10 -080026import static org.hamcrest.CoreMatchers.equalTo;
Jan Clarin9e3c28e2017-09-29 16:18:41 -070027import static org.hamcrest.CoreMatchers.is;
Sumir Katariada315bf2017-12-06 16:29:10 -080028import static org.hamcrest.CoreMatchers.notNullValue;
Jan Clarin9e3c28e2017-09-29 16:18:41 -070029import static org.hamcrest.MatcherAssert.assertThat;
Sumir Kataria9244d372017-11-30 13:39:07 -080030import static org.hamcrest.Matchers.contains;
Sumir Kataria9e637902017-11-27 14:03:47 -080031import static org.hamcrest.Matchers.containsInAnyOrder;
Jan Clarin0deb5e22017-12-06 11:26:29 -080032import static org.hamcrest.Matchers.greaterThan;
Sumir Katariac4fde482018-12-11 12:58:51 -080033import static org.hamcrest.Matchers.isOneOf;
Sumir Kataria4184cf02018-07-10 13:24:17 -070034import static org.mockito.ArgumentMatchers.any;
Rahul Ravikumar275ff752018-06-22 14:20:43 -070035import static org.mockito.Mockito.atLeast;
Sumir Kataria9554b662017-10-02 14:49:46 -070036import static org.mockito.Mockito.mock;
Sumir Kataria4184cf02018-07-10 13:24:17 -070037import static org.mockito.Mockito.never;
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -070038import static org.mockito.Mockito.times;
Sumir Kataria9554b662017-10-02 14:49:46 -070039import static org.mockito.Mockito.verify;
Xyan Bhatnagard7b783e2017-09-22 14:21:25 -070040
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -070041import android.content.Context;
Sumir Kataria7b5c5602018-05-21 15:51:33 -070042import android.net.Uri;
Rahul Ravikumar275ff752018-06-22 14:20:43 -070043import android.os.Build;
Sumir Kataria5c0277e2018-09-24 13:24:18 -070044import android.util.Log;
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -070045
Alan Viverettebadf2f82018-12-18 12:14:10 -050046import androidx.test.core.app.ApplicationProvider;
47import androidx.test.ext.junit.runners.AndroidJUnit4;
Aurimas Liutikasb7eeda42018-07-10 11:57:16 -070048import androidx.test.filters.LargeTest;
49import androidx.test.filters.SmallTest;
Sumir Kataria564e4302018-02-14 11:22:30 -080050import androidx.work.ArrayCreatingInputMerger;
Rahul Ravikumare3265922018-06-07 16:35:15 -070051import androidx.work.Configuration;
Sumir Kataria64e6bd82018-03-28 17:14:22 -070052import androidx.work.Data;
Sumir Kataria564e4302018-02-14 11:22:30 -080053import androidx.work.DatabaseTest;
Sumir Kataria32f10f672018-09-28 15:00:45 -070054import androidx.work.ListenableWorker;
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -070055import androidx.work.OneTimeWorkRequest;
Sumir Kataria8b3284f2018-04-13 09:50:18 -070056import androidx.work.PeriodicWorkRequest;
Sumir Katariaf82a3d62018-09-12 14:18:23 -070057import androidx.work.WorkerParameters;
Sumir Kataria564e4302018-02-14 11:22:30 -080058import androidx.work.impl.model.Dependency;
59import androidx.work.impl.model.DependencyDao;
60import androidx.work.impl.model.WorkSpec;
61import androidx.work.impl.model.WorkSpecDao;
Sumir Kataria2cea33c2018-09-07 15:10:39 -070062import androidx.work.impl.utils.SynchronousExecutor;
Sumir Kataria8df18fe2018-08-23 10:19:02 -070063import androidx.work.impl.utils.taskexecutor.InstantWorkTaskExecutor;
64import androidx.work.impl.utils.taskexecutor.TaskExecutor;
Sumir Kataria564e4302018-02-14 11:22:30 -080065import androidx.work.worker.ChainedArgumentWorker;
66import androidx.work.worker.EchoingWorker;
Sumir Kataria3f0c0fb2018-05-07 16:24:48 -070067import androidx.work.worker.ExceptionWorker;
Sumir Kataria564e4302018-02-14 11:22:30 -080068import androidx.work.worker.FailureWorker;
Sumir Katariab24ef382018-06-01 14:13:53 -070069import androidx.work.worker.InfiniteTestWorker;
Sumir Katariabf4f4f72018-05-22 11:23:27 -070070import androidx.work.worker.InterruptionAwareWorker;
Sumir Kataria5c0277e2018-09-24 13:24:18 -070071import androidx.work.worker.LatchWorker;
Sumir Kataria564e4302018-02-14 11:22:30 -080072import androidx.work.worker.RetryWorker;
Rahul Ravikumard64fb002018-12-03 13:10:53 -080073import androidx.work.worker.ReturnNullResultWorker;
Sumir Kataria564e4302018-02-14 11:22:30 -080074import androidx.work.worker.SleepTestWorker;
75import androidx.work.worker.TestWorker;
Sumir Kataria768d1602018-09-17 14:09:06 -070076import androidx.work.worker.UsedWorker;
Sumir Kataria564e4302018-02-14 11:22:30 -080077
Sergey Vasilinetsd0ac2cc2018-09-12 11:23:16 -070078import com.google.common.util.concurrent.ListenableFuture;
79
Sumir Katariab5728f42018-03-19 12:58:41 -070080import org.junit.Before;
Sumir Katariab5728f42018-03-19 12:58:41 -070081import org.junit.Test;
82import org.junit.runner.RunWith;
83import org.mockito.ArgumentCaptor;
84
85import java.util.Arrays;
86import java.util.Collections;
87import java.util.List;
Sumir Kataria0c320a82018-09-06 16:20:53 -070088import java.util.concurrent.ExecutionException;
89import java.util.concurrent.Executor;
Sumir Katariab5728f42018-03-19 12:58:41 -070090import java.util.concurrent.Executors;
91import java.util.concurrent.TimeUnit;
92
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -070093@RunWith(AndroidJUnit4.class)
Sumir Kataria9e637902017-11-27 14:03:47 -080094public class WorkerWrapperTest extends DatabaseTest {
Sumir Kataria8df18fe2018-08-23 10:19:02 -070095
Rahul Ravikumare3265922018-06-07 16:35:15 -070096 private Configuration mConfiguration;
Sumir Kataria8df18fe2018-08-23 10:19:02 -070097 private TaskExecutor mWorkTaskExecutor;
Xyan Bhatnagard7b783e2017-09-22 14:21:25 -070098 private WorkSpecDao mWorkSpecDao;
Xyan Bhatnagar6463beb2017-09-27 16:37:04 -070099 private DependencyDao mDependencyDao;
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -0700100 private Context mContext;
Sumir Kataria9554b662017-10-02 14:49:46 -0700101 private Scheduler mMockScheduler;
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700102 private Executor mSynchronousExecutor = new SynchronousExecutor();
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -0700103
104 @Before
Xyan Bhatnagar63ccec52017-09-22 16:09:31 -0700105 public void setUp() {
Alan Viverettebadf2f82018-12-18 12:14:10 -0500106 mContext = ApplicationProvider.getApplicationContext();
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700107 mConfiguration = new Configuration.Builder()
108 .setExecutor(new SynchronousExecutor())
Sumir Kataria5c0277e2018-09-24 13:24:18 -0700109 .setMinimumLoggingLevel(Log.VERBOSE)
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700110 .build();
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700111 mWorkTaskExecutor = new InstantWorkTaskExecutor();
Rahul Ravikumare5356662019-03-04 16:22:14 -0800112 mWorkSpecDao = mDatabase.workSpecDao();
Xyan Bhatnagar6463beb2017-09-27 16:37:04 -0700113 mDependencyDao = mDatabase.dependencyDao();
Sumir Kataria9554b662017-10-02 14:49:46 -0700114 mMockScheduler = mock(Scheduler.class);
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -0700115 }
116
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -0700117 @Test
Xyan Bhatnagar687da332017-11-15 10:39:57 -0800118 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700119 public void testSuccess() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700120 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800121 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700122 WorkerWrapper workerWrapper = createBuilder(work.getStringId()).build();
123 FutureListener listener = createAndAddFutureListener(workerWrapper);
124 workerWrapper.run();
125 assertThat(listener.mResult, is(false));
Sumir Katariafa284c92018-04-23 14:25:53 -0700126 assertThat(mWorkSpecDao.getState(work.getStringId()), is(SUCCEEDED));
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -0700127 }
128
129 @Test
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700130 @SmallTest
131 public void testRunAttemptCountIncremented_successfulExecution() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700132 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800133 insertWork(work);
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700134 createBuilder(work.getStringId())
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700135 .withSchedulers(Collections.singletonList(mMockScheduler))
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700136 .build()
137 .run();
Sumir Katariafa284c92018-04-23 14:25:53 -0700138 WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getStringId());
Sumir Katariab5728f42018-03-19 12:58:41 -0700139 assertThat(latestWorkSpec.runAttemptCount, is(1));
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700140 }
141
142 @Test
143 @SmallTest
144 public void testRunAttemptCountIncremented_failedExecution() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700145 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800146 insertWork(work);
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700147 createBuilder(work.getStringId())
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700148 .build()
149 .run();
Sumir Katariafa284c92018-04-23 14:25:53 -0700150 WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getStringId());
Sumir Katariaa3262882018-08-17 16:15:35 -0700151 assertThat(latestWorkSpec.runAttemptCount, is(1));
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700152 }
153
154 @Test
Jan Clarinee302e12017-10-09 11:16:19 -0700155 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700156 public void testPermanentErrorWithInvalidWorkSpecId() {
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -0700157 final String invalidWorkSpecId = "INVALID_ID";
Sumir Kataria0c320a82018-09-06 16:20:53 -0700158 WorkerWrapper workerWrapper = createBuilder(invalidWorkSpecId).build();
159 FutureListener listener = createAndAddFutureListener(workerWrapper);
160 workerWrapper.run();
161 assertThat(listener.mResult, is(false));
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -0700162 }
163
164 @Test
Xyan Bhatnagar687da332017-11-15 10:39:57 -0800165 @SmallTest
Sumir Kataria4184cf02018-07-10 13:24:17 -0700166 public void testInvalidWorkerClassName() {
167 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
168 work.getWorkSpec().workerClassName = "dummy";
169 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700170 WorkerWrapper workerWrapper = createBuilder(work.getStringId())
Sumir Kataria4184cf02018-07-10 13:24:17 -0700171 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Kataria0c320a82018-09-06 16:20:53 -0700172 .build();
173 FutureListener listener = createAndAddFutureListener(workerWrapper);
174 workerWrapper.run();
175 assertThat(listener.mResult, is(false));
Sumir Kataria4184cf02018-07-10 13:24:17 -0700176 verify(mMockScheduler, never()).schedule(any(WorkSpec[].class));
177 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
178 }
179
180 @Test
181 @SmallTest
Sumir Kataria768d1602018-09-17 14:09:06 -0700182 public void testUsedWorker_failsExecution() {
183 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
184 insertWork(work);
Sumir Katariaa5658ce2018-09-27 15:02:32 -0700185
Sumir Kataria931889d2018-10-01 12:44:42 -0700186 UsedWorker usedWorker = (UsedWorker) mConfiguration.getWorkerFactory()
187 .createWorkerWithDefaultFallback(
188 mContext.getApplicationContext(),
189 UsedWorker.class.getName(),
190 new WorkerParameters(
191 work.getId(),
192 Data.EMPTY,
193 work.getTags(),
194 new WorkerParameters.RuntimeExtras(),
195 1,
196 mSynchronousExecutor,
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -0700197 mWorkTaskExecutor,
Sumir Kataria931889d2018-10-01 12:44:42 -0700198 mConfiguration.getWorkerFactory()));
Sumir Katariaa5658ce2018-09-27 15:02:32 -0700199
Sumir Kataria768d1602018-09-17 14:09:06 -0700200 WorkerWrapper workerWrapper = createBuilder(work.getStringId())
Sumir Katariaa5658ce2018-09-27 15:02:32 -0700201 .withWorker(usedWorker)
Sumir Kataria768d1602018-09-17 14:09:06 -0700202 .build();
203 workerWrapper.run();
204 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
205 }
206
207 @Test
208 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700209 public void testNotEnqueued() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700210 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700211 .setInitialState(RUNNING)
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700212 .build();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800213 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700214 WorkerWrapper workerWrapper = createBuilder(work.getStringId()).build();
215 FutureListener listener = createAndAddFutureListener(workerWrapper);
216 workerWrapper.run();
217 assertThat(listener.mResult, is(true));
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -0700218 }
219
220 @Test
Xyan Bhatnagar687da332017-11-15 10:39:57 -0800221 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700222 public void testCancelled() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700223 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria5b84f5c2018-05-04 14:34:49 +0000224 .setInitialState(CANCELLED)
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700225 .build();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800226 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700227 WorkerWrapper workerWrapper = createBuilder(work.getStringId()).build();
228 FutureListener listener = createAndAddFutureListener(workerWrapper);
229 workerWrapper.run();
230 assertThat(listener.mResult, is(false));
Sumir Kataria5b84f5c2018-05-04 14:34:49 +0000231 assertThat(mWorkSpecDao.getState(work.getStringId()), is(CANCELLED));
Sumir Kataria2ace67d2017-11-21 13:23:53 -0800232 }
233
234 @Test
235 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700236 public void testPermanentErrorWithInvalidWorkerClass() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700237 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Sumir Katariab5728f42018-03-19 12:58:41 -0700238 getWorkSpec(work).workerClassName = "INVALID_CLASS_NAME";
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800239 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700240 WorkerWrapper workerWrapper = createBuilder(work.getStringId()).build();
241 FutureListener listener = createAndAddFutureListener(workerWrapper);
242 workerWrapper.run();
243 assertThat(listener.mResult, is(false));
Sumir Katariafa284c92018-04-23 14:25:53 -0700244 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
Xyan Bhatnagard7b783e2017-09-22 14:21:25 -0700245 }
246
247 @Test
Xyan Bhatnagar687da332017-11-15 10:39:57 -0800248 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700249 public void testPermanentErrorWithInvalidInputMergerClass() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700250 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Sumir Katariab5728f42018-03-19 12:58:41 -0700251 getWorkSpec(work).inputMergerClassName = "INVALID_CLASS_NAME";
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800252 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700253 WorkerWrapper workerWrapper = createBuilder(work.getStringId())
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700254 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Kataria0c320a82018-09-06 16:20:53 -0700255 .build();
256 FutureListener listener = createAndAddFutureListener(workerWrapper);
257 workerWrapper.run();
258 assertThat(listener.mResult, is(false));
Sumir Katariafa284c92018-04-23 14:25:53 -0700259 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
Xyan Bhatnagar35574572017-12-11 11:26:16 -0800260 }
261
262 @Test
263 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700264 public void testFailed() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700265 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800266 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700267 WorkerWrapper workerWrapper = createBuilder(work.getStringId()).build();
268 FutureListener listener = createAndAddFutureListener(workerWrapper);
269 workerWrapper.run();
270 assertThat(listener.mResult, is(false));
Sumir Katariafa284c92018-04-23 14:25:53 -0700271 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
Xyan Bhatnagar63ccec52017-09-22 16:09:31 -0700272 }
273
274 @Test
Sumir Katariab93bf042019-03-27 13:13:49 -0700275 @LargeTest
Sumir Kataria286a63d2019-03-25 16:37:22 -0700276 public void testFailedOnDeepHierarchy() {
277 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build();
278 insertWork(work);
279 String previousId = work.getStringId();
280 String firstWorkId = previousId;
281 for (int i = 0; i < 500; ++i) {
282 work = new OneTimeWorkRequest.Builder(FailureWorker.class).build();
283 insertWork(work);
284 mDependencyDao.insertDependency(new Dependency(work.getStringId(), previousId));
285 previousId = work.getStringId();
286 }
287 WorkerWrapper workerWrapper = createBuilder(firstWorkId).build();
288 workerWrapper.setFailedAndResolve();
289 assertThat(mWorkSpecDao.getState(firstWorkId), is(FAILED));
290 assertThat(mWorkSpecDao.getState(previousId), is(FAILED));
291 }
292
293 @Test
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700294 @LargeTest
Xyan Bhatnagar63ccec52017-09-22 16:09:31 -0700295 public void testRunning() throws InterruptedException {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700296 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(SleepTestWorker.class).build();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800297 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700298 WorkerWrapper wrapper = createBuilder(work.getStringId()).build();
299 FutureListener listener = createAndAddFutureListener(wrapper);
Xyan Bhatnagard7b783e2017-09-22 14:21:25 -0700300 Executors.newSingleThreadExecutor().submit(wrapper);
Xyan Bhatnagar687da332017-11-15 10:39:57 -0800301 Thread.sleep(2000L); // Async wait duration.
Sumir Katariafa284c92018-04-23 14:25:53 -0700302 assertThat(mWorkSpecDao.getState(work.getStringId()), is(RUNNING));
Xyan Bhatnagardc31aa82017-09-26 10:53:38 -0700303 Thread.sleep(SleepTestWorker.SLEEP_DURATION);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700304 assertThat(listener.mResult, is(false));
Xyan Bhatnagard7b783e2017-09-22 14:21:25 -0700305 }
Xyan Bhatnagar6463beb2017-09-27 16:37:04 -0700306
307 @Test
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700308 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700309 public void testRunning_onlyWhenEnqueued() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700310 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700311 .setInitialState(RUNNING)
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700312 .build();
313 insertWork(work);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700314 WorkerWrapper workerWrapper = createBuilder(work.getStringId()).build();
315 FutureListener listener = createAndAddFutureListener(workerWrapper);
316 workerWrapper.run();
317 assertThat(listener.mResult, is(true));
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700318 }
319
320 @Test
321 @SmallTest
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700322 public void testDependencies() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700323 OneTimeWorkRequest prerequisiteWork =
324 new OneTimeWorkRequest.Builder(TestWorker.class).build();
325 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700326 .setInitialState(BLOCKED).build();
Sumir Katariafa284c92018-04-23 14:25:53 -0700327 Dependency dependency = new Dependency(work.getStringId(), prerequisiteWork.getStringId());
Xyan Bhatnagar6463beb2017-09-27 16:37:04 -0700328
Sumir Kataria5643e2e2017-09-29 14:44:22 -0700329 mDatabase.beginTransaction();
330 try {
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800331 insertWork(prerequisiteWork);
332 insertWork(work);
Sumir Kataria5643e2e2017-09-29 14:44:22 -0700333 mDependencyDao.insertDependency(dependency);
334 mDatabase.setTransactionSuccessful();
335 } finally {
336 mDatabase.endTransaction();
337 }
338
Sumir Katariafa284c92018-04-23 14:25:53 -0700339 assertThat(mWorkSpecDao.getState(prerequisiteWork.getStringId()), is(ENQUEUED));
340 assertThat(mWorkSpecDao.getState(work.getStringId()), is(BLOCKED));
341 assertThat(mDependencyDao.hasCompletedAllPrerequisites(work.getStringId()), is(false));
Sumir Kataria5643e2e2017-09-29 14:44:22 -0700342
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700343 createBuilder(prerequisiteWork.getStringId())
Sumir Kataria137c84c2018-02-13 15:13:33 -0800344 .withSchedulers(Collections.singletonList(mMockScheduler))
Xyan Bhatnagar969025c2017-09-28 10:42:42 -0700345 .build()
346 .run();
Sumir Kataria5643e2e2017-09-29 14:44:22 -0700347
Sumir Katariafa284c92018-04-23 14:25:53 -0700348 assertThat(mWorkSpecDao.getState(prerequisiteWork.getStringId()), is(SUCCEEDED));
349 assertThat(mWorkSpecDao.getState(work.getStringId()), is(ENQUEUED));
350 assertThat(mDependencyDao.hasCompletedAllPrerequisites(work.getStringId()), is(true));
Sumir Kataria9554b662017-10-02 14:49:46 -0700351
352 ArgumentCaptor<WorkSpec> captor = ArgumentCaptor.forClass(WorkSpec.class);
353 verify(mMockScheduler).schedule(captor.capture());
Sumir Katariafa284c92018-04-23 14:25:53 -0700354 assertThat(captor.getValue().id, is(work.getStringId()));
Xyan Bhatnagar6463beb2017-09-27 16:37:04 -0700355 }
Xyan Bhatnagar969025c2017-09-28 10:42:42 -0700356
357 @Test
Xyan Bhatnagar687da332017-11-15 10:39:57 -0800358 @SmallTest
Sumir Kataria9244d372017-11-30 13:39:07 -0800359 public void testDependencies_passesOutputs() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700360 OneTimeWorkRequest prerequisiteWork =
361 new OneTimeWorkRequest.Builder(ChainedArgumentWorker.class).build();
362 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700363 .setInitialState(BLOCKED)
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700364 .build();
Sumir Katariafa284c92018-04-23 14:25:53 -0700365 Dependency dependency = new Dependency(work.getStringId(), prerequisiteWork.getStringId());
Sumir Kataria1e9589d2017-11-22 13:23:46 -0800366
367 mDatabase.beginTransaction();
368 try {
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800369 insertWork(prerequisiteWork);
370 insertWork(work);
Sumir Kataria1e9589d2017-11-22 13:23:46 -0800371 mDependencyDao.insertDependency(dependency);
372 mDatabase.setTransactionSuccessful();
373 } finally {
374 mDatabase.endTransaction();
375 }
376
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700377 createBuilder(prerequisiteWork.getStringId())
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700378 .withSchedulers(Collections.singletonList(mMockScheduler))
379 .build().run();
Sumir Kataria1e9589d2017-11-22 13:23:46 -0800380
Sumir Katariafa284c92018-04-23 14:25:53 -0700381 List<Data> arguments = mWorkSpecDao.getInputsFromPrerequisites(work.getStringId());
Sumir Kataria9244d372017-11-30 13:39:07 -0800382 assertThat(arguments.size(), is(1));
383 assertThat(arguments, contains(ChainedArgumentWorker.getChainedArguments()));
Sumir Kataria1e9589d2017-11-22 13:23:46 -0800384 }
385
386 @Test
387 @SmallTest
Sumir Kataria9244d372017-11-30 13:39:07 -0800388 public void testDependencies_passesMergedOutputs() {
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800389 String key = "key";
390 String value1 = "value1";
391 String value2 = "value2";
392
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700393 OneTimeWorkRequest prerequisiteWork1 = new OneTimeWorkRequest.Builder(EchoingWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700394 .setInputData(new Data.Builder().putString(key, value1).build())
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800395 .build();
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700396 OneTimeWorkRequest prerequisiteWork2 = new OneTimeWorkRequest.Builder(EchoingWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700397 .setInputData(new Data.Builder().putString(key, value2).build())
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800398 .build();
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700399 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700400 .setInputMerger(ArrayCreatingInputMerger.class)
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800401 .build();
Sumir Katariafa284c92018-04-23 14:25:53 -0700402 Dependency dependency1 =
403 new Dependency(work.getStringId(), prerequisiteWork1.getStringId());
404 Dependency dependency2 =
405 new Dependency(work.getStringId(), prerequisiteWork2.getStringId());
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800406
407 mDatabase.beginTransaction();
408 try {
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800409 insertWork(prerequisiteWork1);
410 insertWork(prerequisiteWork2);
411 insertWork(work);
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800412 mDependencyDao.insertDependency(dependency1);
413 mDependencyDao.insertDependency(dependency2);
414 mDatabase.setTransactionSuccessful();
415 } finally {
416 mDatabase.endTransaction();
417 }
418
419 // Run the prerequisites.
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700420 createBuilder(prerequisiteWork1.getStringId())
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700421 .withSchedulers(Collections.singletonList(mMockScheduler))
422 .build().run();
423
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700424 createBuilder(prerequisiteWork2.getStringId())
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700425 .withSchedulers(Collections.singletonList(mMockScheduler))
426 .build().run();
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800427
428 // Create and run the dependent work.
Sumir Katariafa284c92018-04-23 14:25:53 -0700429 WorkerWrapper workerWrapper =
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700430 createBuilder(work.getStringId())
Sumir Katariafa284c92018-04-23 14:25:53 -0700431 .withSchedulers(Collections.singletonList(mMockScheduler))
432 .build();
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800433 workerWrapper.run();
434
Sumir Kataria64e6bd82018-03-28 17:14:22 -0700435 Data input = workerWrapper.mWorker.getInputData();
436 assertThat(input.size(), is(1));
437 assertThat(Arrays.asList(input.getStringArray(key)),
Sumir Kataria6ae802c2017-11-29 16:00:44 -0800438 containsInAnyOrder(value1, value2));
439 }
440
441 @Test
442 @SmallTest
Jan Clarin0deb5e22017-12-06 11:26:29 -0800443 public void testDependencies_setsPeriodStartTimesForUnblockedWork() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700444 OneTimeWorkRequest prerequisiteWork =
445 new OneTimeWorkRequest.Builder(TestWorker.class).build();
446 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700447 .setInitialState(BLOCKED)
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700448 .build();
Sumir Katariafa284c92018-04-23 14:25:53 -0700449 Dependency dependency = new Dependency(work.getStringId(), prerequisiteWork.getStringId());
Jan Clarin0deb5e22017-12-06 11:26:29 -0800450
451 mDatabase.beginTransaction();
452 try {
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800453 insertWork(prerequisiteWork);
454 insertWork(work);
Jan Clarin0deb5e22017-12-06 11:26:29 -0800455 mDependencyDao.insertDependency(dependency);
456 mDatabase.setTransactionSuccessful();
457 } finally {
458 mDatabase.endTransaction();
459 }
460
461 long beforeUnblockedTime = System.currentTimeMillis();
462
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700463 createBuilder(prerequisiteWork.getStringId())
Sumir Kataria137c84c2018-02-13 15:13:33 -0800464 .withSchedulers(Collections.singletonList(mMockScheduler))
Jan Clarin0deb5e22017-12-06 11:26:29 -0800465 .build()
466 .run();
467
Sumir Katariafa284c92018-04-23 14:25:53 -0700468 WorkSpec workSpec = mWorkSpecDao.getWorkSpec(work.getStringId());
Sumir Katariab5728f42018-03-19 12:58:41 -0700469 assertThat(workSpec.periodStartTime, is(greaterThan(beforeUnblockedTime)));
Jan Clarin0deb5e22017-12-06 11:26:29 -0800470 }
471
472 @Test
473 @SmallTest
Sumir Katariac4fde482018-12-11 12:58:51 -0800474 public void testDependencies_enqueuesBlockedDependentsOnSuccess() {
475 OneTimeWorkRequest prerequisiteWork =
476 new OneTimeWorkRequest.Builder(TestWorker.class).build();
477 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
478 .setInitialState(BLOCKED)
479 .build();
480 OneTimeWorkRequest cancelledWork = new OneTimeWorkRequest.Builder(TestWorker.class)
481 .setInitialState(CANCELLED)
482 .build();
483 Dependency dependency1 = new Dependency(work.getStringId(), prerequisiteWork.getStringId());
484 Dependency dependency2 =
485 new Dependency(cancelledWork.getStringId(), prerequisiteWork.getStringId());
486
487 mDatabase.beginTransaction();
488 try {
489 insertWork(prerequisiteWork);
490 insertWork(work);
491 insertWork(cancelledWork);
492 mDependencyDao.insertDependency(dependency1);
493 mDependencyDao.insertDependency(dependency2);
494 mDatabase.setTransactionSuccessful();
495 } finally {
496 mDatabase.endTransaction();
497 }
498
499 createBuilder(prerequisiteWork.getStringId())
500 .build()
501 .run();
502
503 assertThat(mWorkSpecDao.getState(prerequisiteWork.getStringId()), is(SUCCEEDED));
504 assertThat(mWorkSpecDao.getState(work.getStringId()),
505 isOneOf(ENQUEUED, RUNNING, SUCCEEDED));
506 assertThat(mWorkSpecDao.getState(cancelledWork.getStringId()), is(CANCELLED));
507 }
508
509 @Test
510 @SmallTest
Sumir Katariac1ba6332018-03-06 16:54:45 -0800511 public void testDependencies_failsUncancelledDependentsOnFailure() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700512 OneTimeWorkRequest prerequisiteWork =
513 new OneTimeWorkRequest.Builder(FailureWorker.class).build();
514 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria62a7e772018-04-23 21:12:57 -0700515 .setInitialState(BLOCKED)
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700516 .build();
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700517 OneTimeWorkRequest cancelledWork = new OneTimeWorkRequest.Builder(TestWorker.class)
Sumir Kataria5b84f5c2018-05-04 14:34:49 +0000518 .setInitialState(CANCELLED)
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700519 .build();
Sumir Katariafa284c92018-04-23 14:25:53 -0700520 Dependency dependency1 = new Dependency(work.getStringId(), prerequisiteWork.getStringId());
521 Dependency dependency2 =
522 new Dependency(cancelledWork.getStringId(), prerequisiteWork.getStringId());
Sumir Katariac1ba6332018-03-06 16:54:45 -0800523
524 mDatabase.beginTransaction();
525 try {
526 insertWork(prerequisiteWork);
527 insertWork(work);
528 insertWork(cancelledWork);
529 mDependencyDao.insertDependency(dependency1);
530 mDependencyDao.insertDependency(dependency2);
531 mDatabase.setTransactionSuccessful();
532 } finally {
533 mDatabase.endTransaction();
534 }
535
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700536 createBuilder(prerequisiteWork.getStringId())
Sumir Katariafa284c92018-04-23 14:25:53 -0700537 .build()
538 .run();
Sumir Katariac1ba6332018-03-06 16:54:45 -0800539
Sumir Katariafa284c92018-04-23 14:25:53 -0700540 assertThat(mWorkSpecDao.getState(prerequisiteWork.getStringId()), is(FAILED));
541 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
Sumir Kataria5b84f5c2018-05-04 14:34:49 +0000542 assertThat(mWorkSpecDao.getState(cancelledWork.getStringId()), is(CANCELLED));
Sumir Katariac1ba6332018-03-06 16:54:45 -0800543 }
544
545 @Test
546 @SmallTest
Rahul Ravikumar1cb6e002019-01-15 14:24:59 -0800547 public void testBackedOffOneTimeWork_doesNotRun() {
548 OneTimeWorkRequest retryWork =
549 new OneTimeWorkRequest.Builder(RetryWorker.class).build();
550
551 long future = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1);
552 mDatabase.beginTransaction();
553 try {
554 mWorkSpecDao.insertWorkSpec(retryWork.getWorkSpec());
555 mWorkSpecDao.setPeriodStartTime(retryWork.getStringId(), future);
556 mWorkSpecDao.incrementWorkSpecRunAttemptCount(retryWork.getStringId());
557 mDatabase.setTransactionSuccessful();
558 } finally {
559 mDatabase.endTransaction();
560 }
561
562 createBuilder(retryWork.getStringId())
563 .build()
564 .run();
565
566 WorkSpec workSpec = mWorkSpecDao.getWorkSpec(retryWork.getStringId());
567 // The run attempt count should remain the same
568 assertThat(workSpec.runAttemptCount, is(1));
569 }
570
571 @Test
572 @SmallTest
Jan Clarin0deb5e22017-12-06 11:26:29 -0800573 public void testRun_periodicWork_success_updatesPeriodStartTime() {
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700574 long intervalDuration = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS;
Jan Clarin0deb5e22017-12-06 11:26:29 -0800575 long periodStartTime = System.currentTimeMillis();
Jan Clarin0deb5e22017-12-06 11:26:29 -0800576
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700577 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
Sumir Katariaf4ae2b72018-03-06 10:54:57 -0800578 TestWorker.class, intervalDuration, TimeUnit.MILLISECONDS).build();
Jan Clarin0deb5e22017-12-06 11:26:29 -0800579
Sumir Katariab5728f42018-03-19 12:58:41 -0700580 getWorkSpec(periodicWork).periodStartTime = periodStartTime;
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800581 insertWork(periodicWork);
Jan Clarin0deb5e22017-12-06 11:26:29 -0800582
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700583 createBuilder(periodicWork.getStringId())
Jan Clarin0deb5e22017-12-06 11:26:29 -0800584 .build()
585 .run();
586
Sumir Katariafa284c92018-04-23 14:25:53 -0700587 WorkSpec updatedWorkSpec = mWorkSpecDao.getWorkSpec(periodicWork.getStringId());
Rahul Ravikumar67a9b192019-01-28 15:00:20 -0800588 assertThat(updatedWorkSpec.calculateNextRunTime(), greaterThan(periodStartTime));
Jan Clarin0deb5e22017-12-06 11:26:29 -0800589 }
590
591 @Test
592 @SmallTest
593 public void testRun_periodicWork_failure_updatesPeriodStartTime() {
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700594 long intervalDuration = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS;
Jan Clarin0deb5e22017-12-06 11:26:29 -0800595 long periodStartTime = System.currentTimeMillis();
Jan Clarin0deb5e22017-12-06 11:26:29 -0800596
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700597 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
Sumir Katariaf4ae2b72018-03-06 10:54:57 -0800598 FailureWorker.class, intervalDuration, TimeUnit.MILLISECONDS).build();
Jan Clarin0deb5e22017-12-06 11:26:29 -0800599
Sumir Katariab5728f42018-03-19 12:58:41 -0700600 getWorkSpec(periodicWork).periodStartTime = periodStartTime;
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800601 insertWork(periodicWork);
Jan Clarin0deb5e22017-12-06 11:26:29 -0800602
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700603 createBuilder(periodicWork.getStringId())
Jan Clarin0deb5e22017-12-06 11:26:29 -0800604 .build()
605 .run();
606
Sumir Katariafa284c92018-04-23 14:25:53 -0700607 WorkSpec updatedWorkSpec = mWorkSpecDao.getWorkSpec(periodicWork.getStringId());
Rahul Ravikumar67a9b192019-01-28 15:00:20 -0800608 assertThat(updatedWorkSpec.calculateNextRunTime(), greaterThan(periodStartTime));
Jan Clarin0deb5e22017-12-06 11:26:29 -0800609 }
610
611 @Test
612 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700613 public void testPeriodicWork_success() {
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700614 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
Sumir Kataria3f630c92017-10-24 16:38:54 -0700615 TestWorker.class,
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700616 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
Sumir Katariaf4ae2b72018-03-06 10:54:57 -0800617 TimeUnit.MILLISECONDS)
Jan Clarinee302e12017-10-09 11:16:19 -0700618 .build();
619
Sumir Katariafa284c92018-04-23 14:25:53 -0700620 final String periodicWorkId = periodicWork.getStringId();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800621 insertWork(periodicWork);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700622 WorkerWrapper workerWrapper = createBuilder(periodicWorkId)
Rahul Ravikumar275ff752018-06-22 14:20:43 -0700623 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Kataria0c320a82018-09-06 16:20:53 -0700624 .build();
625 FutureListener listener = createAndAddFutureListener(workerWrapper);
626 workerWrapper.run();
Jan Clarinee302e12017-10-09 11:16:19 -0700627
Jan Clarinee302e12017-10-09 11:16:19 -0700628 WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700629 assertThat(listener.mResult, is(false));
Sumir Katariab5728f42018-03-19 12:58:41 -0700630 assertThat(periodicWorkSpecAfterFirstRun.runAttemptCount, is(0));
631 assertThat(periodicWorkSpecAfterFirstRun.state, is(ENQUEUED));
Rahul Ravikumar275ff752018-06-22 14:20:43 -0700632 // SystemAlarmScheduler needs to reschedule the same worker.
633 if (Build.VERSION.SDK_INT <= WorkManagerImpl.MAX_PRE_JOB_SCHEDULER_API_LEVEL) {
634 ArgumentCaptor<WorkSpec> captor = ArgumentCaptor.forClass(WorkSpec.class);
635 verify(mMockScheduler, atLeast(1))
636 .schedule(captor.capture());
637
638 WorkSpec workSpec = captor.getValue();
639 assertThat(workSpec.id, is(periodicWorkId));
640 }
Jan Clarinee302e12017-10-09 11:16:19 -0700641 }
642
643 @Test
Xyan Bhatnagar367c6492017-10-06 11:20:02 -0700644 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700645 public void testPeriodicWork_fail() {
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700646 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800647 FailureWorker.class,
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700648 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
Sumir Katariaf4ae2b72018-03-06 10:54:57 -0800649 TimeUnit.MILLISECONDS)
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800650 .build();
651
Sumir Katariafa284c92018-04-23 14:25:53 -0700652 final String periodicWorkId = periodicWork.getStringId();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800653 insertWork(periodicWork);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700654 WorkerWrapper workerWrapper = createBuilder(periodicWorkId).build();
655 FutureListener listener = createAndAddFutureListener(workerWrapper);
656 workerWrapper.run();
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800657
658 WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700659 assertThat(listener.mResult, is(false));
Sumir Katariab5728f42018-03-19 12:58:41 -0700660 assertThat(periodicWorkSpecAfterFirstRun.runAttemptCount, is(0));
661 assertThat(periodicWorkSpecAfterFirstRun.state, is(ENQUEUED));
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800662 }
663
664 @Test
665 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700666 public void testPeriodicWork_retry() {
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700667 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800668 RetryWorker.class,
Sumir Kataria8b3284f2018-04-13 09:50:18 -0700669 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
Sumir Katariaf4ae2b72018-03-06 10:54:57 -0800670 TimeUnit.MILLISECONDS)
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800671 .build();
672
Sumir Katariafa284c92018-04-23 14:25:53 -0700673 final String periodicWorkId = periodicWork.getStringId();
Sumir Kataria1cd0e4e2017-12-12 10:53:46 -0800674 insertWork(periodicWork);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700675 WorkerWrapper workerWrapper = createBuilder(periodicWorkId).build();
676 FutureListener listener = createAndAddFutureListener(workerWrapper);
677 workerWrapper.run();
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800678
679 WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700680 assertThat(listener.mResult, is(true));
Sumir Katariab5728f42018-03-19 12:58:41 -0700681 assertThat(periodicWorkSpecAfterFirstRun.runAttemptCount, is(1));
682 assertThat(periodicWorkSpecAfterFirstRun.state, is(ENQUEUED));
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800683 }
684
Rahul Ravikumar82d2db92019-01-04 11:28:27 -0800685
686 @Test
687 @SmallTest
688 public void testPeriodic_dedupe() {
689 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
690 TestWorker.class,
691 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
692 TimeUnit.MILLISECONDS)
693 .build();
694
695 final String periodicWorkId = periodicWork.getStringId();
696 final WorkSpec workSpec = periodicWork.getWorkSpec();
697 long now = System.currentTimeMillis();
698 workSpec.periodStartTime = now + workSpec.intervalDuration;
699 insertWork(periodicWork);
700 WorkerWrapper workerWrapper = createBuilder(periodicWorkId).build();
701 FutureListener listener = createAndAddFutureListener(workerWrapper);
702 workerWrapper.run();
Rahul Ravikumarebb4f872019-01-29 16:16:17 -0800703 // Should get rescheduled
704 assertThat(listener.mResult, is(true));
Rahul Ravikumar82d2db92019-01-04 11:28:27 -0800705 }
706
Xyan Bhatnagarfdd887f2017-11-17 16:44:55 -0800707 @Test
708 @SmallTest
Rahul Ravikumar6dc75802019-02-12 15:41:35 -0800709 public void testPeriodic_firstRun_flexApplied_noDedupe() {
710 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
711 TestWorker.class,
712 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
713 TimeUnit.MILLISECONDS,
714 PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
715 TimeUnit.MILLISECONDS)
716 .build();
717
718 final String periodicWorkId = periodicWork.getStringId();
719 final WorkSpec workSpec = periodicWork.getWorkSpec();
720 workSpec.periodStartTime = 0;
721 insertWork(periodicWork);
722 WorkerWrapper workerWrapper = createBuilder(periodicWorkId).build();
723 FutureListener listener = createAndAddFutureListener(workerWrapper);
724 workerWrapper.run();
725 // Should not get rescheduled
726 assertThat(listener.mResult, is(false));
727 }
728
729 @Test
730 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700731 public void testScheduler() {
Sumir Kataria8e3ba6f2018-07-03 14:04:00 -0700732 OneTimeWorkRequest prerequisiteWork =
733 new OneTimeWorkRequest.Builder(TestWorker.class).build();
734 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
735 .setInitialState(BLOCKED).build();
736 Dependency dependency = new Dependency(work.getStringId(), prerequisiteWork.getStringId());
Xyan Bhatnagara1af78b2017-10-04 17:36:36 -0700737
Sumir Kataria8e3ba6f2018-07-03 14:04:00 -0700738 mDatabase.beginTransaction();
739 try {
740 insertWork(prerequisiteWork);
741 insertWork(work);
742 mDependencyDao.insertDependency(dependency);
743 mDatabase.setTransactionSuccessful();
744 } finally {
745 mDatabase.endTransaction();
746 }
747
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700748 createBuilder(prerequisiteWork.getStringId())
Sumir Kataria8e3ba6f2018-07-03 14:04:00 -0700749 .withSchedulers(Collections.singletonList(mMockScheduler))
Xyan Bhatnagara1af78b2017-10-04 17:36:36 -0700750 .build()
751 .run();
752
Sumir Kataria8e3ba6f2018-07-03 14:04:00 -0700753 ArgumentCaptor<WorkSpec> captor = ArgumentCaptor.forClass(WorkSpec.class);
754 verify(mMockScheduler).schedule(captor.capture());
755 assertThat(captor.getValue().id, is(work.getStringId()));
Xyan Bhatnagara1af78b2017-10-04 17:36:36 -0700756 }
Sumir Katariada315bf2017-12-06 16:29:10 -0800757
758 @Test
759 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700760 public void testFromWorkSpec_hasAppContext() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700761 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Sumir Kataria931889d2018-10-01 12:44:42 -0700762 ListenableWorker worker = mConfiguration.getWorkerFactory().createWorkerWithDefaultFallback(
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700763 mContext.getApplicationContext(),
764 TestWorker.class.getName(),
Sumir Katariaf82a3d62018-09-12 14:18:23 -0700765 new WorkerParameters(
766 work.getId(),
767 Data.EMPTY,
768 work.getTags(),
769 new WorkerParameters.RuntimeExtras(),
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700770 1,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700771 mSynchronousExecutor,
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -0700772 mWorkTaskExecutor,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700773 mConfiguration.getWorkerFactory()));
Sumir Katariada315bf2017-12-06 16:29:10 -0800774
775 assertThat(worker, is(notNullValue()));
Rahul Ravikumard0d61c52018-04-19 16:52:46 -0700776 assertThat(worker.getApplicationContext(), is(equalTo(mContext.getApplicationContext())));
Sumir Katariada315bf2017-12-06 16:29:10 -0800777 }
778
779 @Test
780 @SmallTest
Sumir Katariadcbf20d2018-04-16 12:40:10 -0700781 public void testFromWorkSpec_hasCorrectArguments() {
Sumir Katariada315bf2017-12-06 16:29:10 -0800782 String key = "KEY";
783 String expectedValue = "VALUE";
Sumir Kataria64e6bd82018-03-28 17:14:22 -0700784 Data input = new Data.Builder().putString(key, expectedValue).build();
Sumir Katariada315bf2017-12-06 16:29:10 -0800785
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700786 OneTimeWorkRequest work =
Sumir Kataria62a7e772018-04-23 21:12:57 -0700787 new OneTimeWorkRequest.Builder(TestWorker.class).setInputData(input).build();
Sumir Kataria931889d2018-10-01 12:44:42 -0700788 ListenableWorker worker = mConfiguration.getWorkerFactory().createWorkerWithDefaultFallback(
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700789 mContext.getApplicationContext(),
790 TestWorker.class.getName(),
Sumir Katariaf82a3d62018-09-12 14:18:23 -0700791 new WorkerParameters(
792 work.getId(),
793 input,
794 work.getTags(),
795 new WorkerParameters.RuntimeExtras(),
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700796 1,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700797 mSynchronousExecutor,
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -0700798 mWorkTaskExecutor,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700799 mConfiguration.getWorkerFactory()));
Sumir Katariada315bf2017-12-06 16:29:10 -0800800
801 assertThat(worker, is(notNullValue()));
Sumir Kataria6d1c4d62018-07-02 12:50:38 -0700802 assertThat(worker.getInputData().getString(key), is(expectedValue));
Sumir Katariada315bf2017-12-06 16:29:10 -0800803
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700804 work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Sumir Kataria931889d2018-10-01 12:44:42 -0700805 worker = mConfiguration.getWorkerFactory().createWorkerWithDefaultFallback(
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700806 mContext.getApplicationContext(),
807 TestWorker.class.getName(),
Sumir Katariaf82a3d62018-09-12 14:18:23 -0700808 new WorkerParameters(
809 work.getId(),
810 Data.EMPTY,
811 work.getTags(),
812 new WorkerParameters.RuntimeExtras(),
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700813 1,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700814 mSynchronousExecutor,
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -0700815 mWorkTaskExecutor,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700816 mConfiguration.getWorkerFactory()));
Sumir Katariada315bf2017-12-06 16:29:10 -0800817
818 assertThat(worker, is(notNullValue()));
Sumir Kataria64e6bd82018-03-28 17:14:22 -0700819 assertThat(worker.getInputData().size(), is(0));
Sumir Katariada315bf2017-12-06 16:29:10 -0800820 }
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700821
822 @Test
823 @SmallTest
Sumir Kataria7b5c5602018-05-21 15:51:33 -0700824 public void testFromWorkSpec_hasCorrectTags() {
825 OneTimeWorkRequest work =
826 new OneTimeWorkRequest.Builder(TestWorker.class)
827 .addTag("one")
828 .addTag("two")
829 .addTag("three")
830 .build();
Sumir Kataria931889d2018-10-01 12:44:42 -0700831 ListenableWorker worker = mConfiguration.getWorkerFactory().createWorkerWithDefaultFallback(
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700832 mContext.getApplicationContext(),
833 TestWorker.class.getName(),
Sumir Katariaf82a3d62018-09-12 14:18:23 -0700834 new WorkerParameters(
835 work.getId(),
836 Data.EMPTY,
Sumir Katariaa3262882018-08-17 16:15:35 -0700837 Arrays.asList("one", "two", "three"),
Sumir Katariaf82a3d62018-09-12 14:18:23 -0700838 new WorkerParameters.RuntimeExtras(),
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700839 1,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700840 mSynchronousExecutor,
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -0700841 mWorkTaskExecutor,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700842 mConfiguration.getWorkerFactory()));
Sumir Kataria7b5c5602018-05-21 15:51:33 -0700843
844 assertThat(worker, is(notNullValue()));
845 assertThat(worker.getTags(), containsInAnyOrder("one", "two", "three"));
846 }
847
848 @Test
849 @SmallTest
850 public void testFromWorkSpec_hasCorrectRuntimeExtras() {
851 OneTimeWorkRequest work =
852 new OneTimeWorkRequest.Builder(TestWorker.class).build();
Sumir Katariaf82a3d62018-09-12 14:18:23 -0700853 WorkerParameters.RuntimeExtras runtimeExtras = new WorkerParameters.RuntimeExtras();
Rahul Ravikumarb3a76ba2018-10-12 14:28:06 -0700854 runtimeExtras.triggeredContentAuthorities = Arrays.asList("tca1", "tca2", "tca3");
855 runtimeExtras.triggeredContentUris = Arrays.asList(Uri.parse("tcu1"), Uri.parse("tcu2"));
Sumir Kataria7b5c5602018-05-21 15:51:33 -0700856
Sumir Kataria931889d2018-10-01 12:44:42 -0700857 ListenableWorker worker = mConfiguration.getWorkerFactory().createWorkerWithDefaultFallback(
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700858 mContext.getApplicationContext(),
859 TestWorker.class.getName(),
Sumir Katariaf82a3d62018-09-12 14:18:23 -0700860 new WorkerParameters(
861 work.getId(),
862 Data.EMPTY,
863 work.getTags(),
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700864 runtimeExtras,
865 1,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700866 mSynchronousExecutor,
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -0700867 mWorkTaskExecutor,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700868 mConfiguration.getWorkerFactory()));
Sumir Kataria7b5c5602018-05-21 15:51:33 -0700869
870 assertThat(worker, is(notNullValue()));
871 assertThat(worker.getTriggeredContentAuthorities(),
Rahul Ravikumarb3a76ba2018-10-12 14:28:06 -0700872 containsInAnyOrder(runtimeExtras.triggeredContentAuthorities.toArray()));
Sumir Kataria7b5c5602018-05-21 15:51:33 -0700873 assertThat(worker.getTriggeredContentUris(),
Rahul Ravikumarb3a76ba2018-10-12 14:28:06 -0700874 containsInAnyOrder(runtimeExtras.triggeredContentUris.toArray()));
Sumir Kataria7b5c5602018-05-21 15:51:33 -0700875 }
876
877 @Test
878 @SmallTest
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700879 public void testSuccess_withPendingScheduledWork() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700880 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700881 insertWork(work);
882
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700883 OneTimeWorkRequest unscheduled = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700884 insertWork(unscheduled);
885
Sumir Kataria0c320a82018-09-06 16:20:53 -0700886 WorkerWrapper workerWrapper = createBuilder(work.getStringId())
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700887 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Kataria0c320a82018-09-06 16:20:53 -0700888 .build();
889 FutureListener listener = createAndAddFutureListener(workerWrapper);
890 workerWrapper.run();
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700891
892 verify(mMockScheduler, times(1)).schedule(unscheduled.getWorkSpec());
Sumir Kataria0c320a82018-09-06 16:20:53 -0700893 assertThat(listener.mResult, is(false));
Sumir Katariafa284c92018-04-23 14:25:53 -0700894 assertThat(mWorkSpecDao.getState(work.getStringId()), is(SUCCEEDED));
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700895 }
896
897 @Test
898 @SmallTest
899 public void testFailure_withPendingScheduledWork() {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700900 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build();
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700901 insertWork(work);
902
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700903 OneTimeWorkRequest unscheduled = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700904 insertWork(unscheduled);
905
Sumir Kataria0c320a82018-09-06 16:20:53 -0700906 WorkerWrapper workerWrapper = createBuilder(work.getStringId())
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700907 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Kataria0c320a82018-09-06 16:20:53 -0700908 .build();
909 FutureListener listener = createAndAddFutureListener(workerWrapper);
910 workerWrapper.run();
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700911
912 verify(mMockScheduler, times(1)).schedule(unscheduled.getWorkSpec());
Sumir Kataria0c320a82018-09-06 16:20:53 -0700913 assertThat(listener.mResult, is(false));
Sumir Katariafa284c92018-04-23 14:25:53 -0700914 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
Rahul Ravikumar9f91ee82018-03-20 17:33:38 -0700915 }
Sumir Katariab0a0d7b2018-04-16 16:12:35 -0700916
917 @Test
Sumir Katariad8748112018-05-11 11:22:58 -0700918 @LargeTest
Sumir Katariab0a0d7b2018-04-16 16:12:35 -0700919 public void testInterruption() throws InterruptedException {
Rahul Ravikumar7031a0f2018-04-19 14:24:30 -0700920 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build();
Sumir Katariab0a0d7b2018-04-16 16:12:35 -0700921 insertWork(work);
922
Sumir Katariafa284c92018-04-23 14:25:53 -0700923 WorkerWrapper workerWrapper =
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700924 createBuilder(work.getStringId())
Sumir Katariafa284c92018-04-23 14:25:53 -0700925 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Katariafa284c92018-04-23 14:25:53 -0700926 .build();
Sumir Kataria0c320a82018-09-06 16:20:53 -0700927 FutureListener listener = createAndAddFutureListener(workerWrapper);
Sumir Katariab0a0d7b2018-04-16 16:12:35 -0700928 Executors.newSingleThreadExecutor().submit(workerWrapper);
Sumir Kataria5d373d32018-05-30 16:51:36 -0700929 workerWrapper.interrupt(false);
Sumir Katariab0a0d7b2018-04-16 16:12:35 -0700930 Thread.sleep(6000L);
Sumir Kataria0c320a82018-09-06 16:20:53 -0700931 assertThat(listener.mResult, is(true));
Sumir Katariab0a0d7b2018-04-16 16:12:35 -0700932 }
Sumir Kataria3f0c0fb2018-05-07 16:24:48 -0700933
934 @Test
Sumir Kataria5c0277e2018-09-24 13:24:18 -0700935 @LargeTest
936 public void testPruneWhileRunning_callsSchedulerCancel() throws InterruptedException {
937 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(LatchWorker.class).build();
938 insertWork(work);
939
Sumir Kataria931889d2018-10-01 12:44:42 -0700940 LatchWorker latchWorker =
941 (LatchWorker) mConfiguration.getWorkerFactory().createWorkerWithDefaultFallback(
942 mContext.getApplicationContext(),
943 LatchWorker.class.getName(),
944 new WorkerParameters(
945 work.getId(),
946 Data.EMPTY,
947 work.getTags(),
948 new WorkerParameters.RuntimeExtras(),
949 1,
950 Executors.newSingleThreadExecutor(),
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -0700951 mWorkTaskExecutor,
Sumir Kataria931889d2018-10-01 12:44:42 -0700952 mConfiguration.getWorkerFactory()));
Sumir Kataria5c0277e2018-09-24 13:24:18 -0700953
954 WorkerWrapper workerWrapper =
955 createBuilder(work.getStringId())
956 .withSchedulers(Collections.singletonList(mMockScheduler))
957 .withWorker(latchWorker)
958 .build();
959 FutureListener listener = createAndAddFutureListener(workerWrapper);
960 Executors.newSingleThreadExecutor().submit(workerWrapper);
961
962 Thread.sleep(1000L);
963
964 mDatabase.workSpecDao().delete(work.getStringId());
965 assertThat(latchWorker.mLatch.getCount(), is(greaterThan(0L)));
966
967 latchWorker.mLatch.countDown();
968
969 Thread.sleep(1000L);
970
971 assertThat(listener.mResult, is(notNullValue()));
972 verify(mMockScheduler, times(1)).cancel(work.getStringId());
973 }
974
975 @Test
Sumir Kataria3f0c0fb2018-05-07 16:24:48 -0700976 @SmallTest
Sumir Kataria5d373d32018-05-30 16:51:36 -0700977 public void testInterruptionWithoutCancellation_isMarkedOnRunningWorker() {
Sumir Katariabf4f4f72018-05-22 11:23:27 -0700978 OneTimeWorkRequest work =
979 new OneTimeWorkRequest.Builder(InterruptionAwareWorker.class).build();
980 insertWork(work);
981
Sumir Kataria931889d2018-10-01 12:44:42 -0700982 ListenableWorker worker = mConfiguration.getWorkerFactory().createWorkerWithDefaultFallback(
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700983 mContext.getApplicationContext(),
Sumir Katariabf4f4f72018-05-22 11:23:27 -0700984 InterruptionAwareWorker.class.getName(),
Sumir Katariaf82a3d62018-09-12 14:18:23 -0700985 new WorkerParameters(
986 work.getId(),
987 Data.EMPTY,
988 work.getTags(),
989 new WorkerParameters.RuntimeExtras(),
Sumir Kataria2cea33c2018-09-07 15:10:39 -0700990 1,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700991 mSynchronousExecutor,
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -0700992 mWorkTaskExecutor,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -0700993 mConfiguration.getWorkerFactory()));
Sumir Katariabf4f4f72018-05-22 11:23:27 -0700994 assertThat(worker, is(notNullValue()));
995 assertThat(worker.isStopped(), is(false));
996
997 WorkerWrapper workerWrapper =
Sumir Kataria8df18fe2018-08-23 10:19:02 -0700998 createBuilder(work.getStringId())
Sumir Katariabf4f4f72018-05-22 11:23:27 -0700999 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Katariabf4f4f72018-05-22 11:23:27 -07001000 .withWorker(worker)
1001 .build();
1002 Executors.newSingleThreadExecutor().submit(workerWrapper);
Sumir Kataria5d373d32018-05-30 16:51:36 -07001003 workerWrapper.interrupt(false);
Sumir Katariabf4f4f72018-05-22 11:23:27 -07001004 assertThat(worker.isStopped(), is(true));
Sumir Kataria5d373d32018-05-30 16:51:36 -07001005 }
1006
1007 @Test
1008 @SmallTest
1009 public void testInterruptionWithCancellation_isMarkedOnRunningWorker() {
1010 OneTimeWorkRequest work =
1011 new OneTimeWorkRequest.Builder(InterruptionAwareWorker.class).build();
1012 insertWork(work);
1013
Sumir Kataria931889d2018-10-01 12:44:42 -07001014 ListenableWorker worker = mConfiguration.getWorkerFactory().createWorkerWithDefaultFallback(
Sumir Katariaf7554d2b2018-09-14 13:47:29 -07001015 mContext.getApplicationContext(),
Sumir Kataria5d373d32018-05-30 16:51:36 -07001016 InterruptionAwareWorker.class.getName(),
Sumir Katariaf82a3d62018-09-12 14:18:23 -07001017 new WorkerParameters(
1018 work.getId(),
1019 Data.EMPTY,
Sumir Katariaa3262882018-08-17 16:15:35 -07001020 Collections.<String>emptyList(),
Sumir Katariaf82a3d62018-09-12 14:18:23 -07001021 new WorkerParameters.RuntimeExtras(),
Sumir Kataria2cea33c2018-09-07 15:10:39 -07001022 1,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -07001023 mSynchronousExecutor,
Sumir Kataria9e8b8cc2018-10-01 13:21:12 -07001024 mWorkTaskExecutor,
Sumir Katariaf7554d2b2018-09-14 13:47:29 -07001025 mConfiguration.getWorkerFactory()));
Sumir Kataria5d373d32018-05-30 16:51:36 -07001026 assertThat(worker, is(notNullValue()));
1027 assertThat(worker.isStopped(), is(false));
1028
1029 WorkerWrapper workerWrapper =
Sumir Kataria8df18fe2018-08-23 10:19:02 -07001030 createBuilder(work.getStringId())
Sumir Kataria5d373d32018-05-30 16:51:36 -07001031 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Kataria5d373d32018-05-30 16:51:36 -07001032 .withWorker(worker)
1033 .build();
1034 Executors.newSingleThreadExecutor().submit(workerWrapper);
1035 workerWrapper.interrupt(true);
1036 assertThat(worker.isStopped(), is(true));
Sumir Katariabf4f4f72018-05-22 11:23:27 -07001037 }
1038
1039 @Test
1040 @SmallTest
Sumir Kataria3f0c0fb2018-05-07 16:24:48 -07001041 public void testException_isTreatedAsFailure() {
1042 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(ExceptionWorker.class).build();
1043 insertWork(work);
1044
Sumir Kataria8df18fe2018-08-23 10:19:02 -07001045 createBuilder(work.getStringId())
Sumir Kataria3f0c0fb2018-05-07 16:24:48 -07001046 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Kataria3f0c0fb2018-05-07 16:24:48 -07001047 .build()
1048 .run();
1049
1050 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
1051 }
Sumir Katariad8748112018-05-11 11:22:58 -07001052
1053 @Test
1054 @LargeTest
1055 public void testWorkerWrapper_handlesWorkSpecDeletion() throws InterruptedException {
1056 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(SleepTestWorker.class).build();
1057 insertWork(work);
1058
1059 WorkerWrapper workerWrapper =
Sumir Kataria8df18fe2018-08-23 10:19:02 -07001060 createBuilder(work.getStringId())
Sumir Katariad8748112018-05-11 11:22:58 -07001061 .withSchedulers(Collections.singletonList(mMockScheduler))
Sumir Katariad8748112018-05-11 11:22:58 -07001062 .build();
Sumir Kataria0c320a82018-09-06 16:20:53 -07001063 FutureListener listener = createAndAddFutureListener(workerWrapper);
Sumir Katariad8748112018-05-11 11:22:58 -07001064 Executors.newSingleThreadExecutor().submit(workerWrapper);
1065 mWorkSpecDao.delete(work.getStringId());
1066 Thread.sleep(6000L);
Sumir Kataria0c320a82018-09-06 16:20:53 -07001067 assertThat(listener.mResult, is(false));
Sumir Katariad8748112018-05-11 11:22:58 -07001068 }
Sumir Katariab24ef382018-06-01 14:13:53 -07001069
1070 @Test
1071 @LargeTest
1072 public void testWorker_getsRunAttemptCount() throws InterruptedException {
1073 OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(InfiniteTestWorker.class)
1074 .setInitialRunAttemptCount(10)
1075 .build();
1076 insertWork(work);
1077
1078 WorkerWrapper workerWrapper =
Sumir Kataria8df18fe2018-08-23 10:19:02 -07001079 createBuilder(work.getStringId())
Rahul Ravikumare3265922018-06-07 16:35:15 -07001080 .withSchedulers(Collections.singletonList(mMockScheduler))
Rahul Ravikumare3265922018-06-07 16:35:15 -07001081 .build();
Sumir Katariab24ef382018-06-01 14:13:53 -07001082
1083 Executors.newSingleThreadExecutor().submit(workerWrapper);
1084 Thread.sleep(1000L);
1085 assertThat(workerWrapper.mWorker.getRunAttemptCount(), is(10));
1086 }
Sumir Kataria8df18fe2018-08-23 10:19:02 -07001087
Rahul Ravikumard64fb002018-12-03 13:10:53 -08001088 @Test
1089 @SmallTest
1090 public void testWorkerThatReturnsNullResult() {
1091 OneTimeWorkRequest work =
1092 new OneTimeWorkRequest.Builder(ReturnNullResultWorker.class).build();
1093 insertWork(work);
1094 WorkerWrapper workerWrapper = createBuilder(work.getStringId()).build();
1095 FutureListener listener = createAndAddFutureListener(workerWrapper);
1096 workerWrapper.run();
1097 assertThat(listener.mResult, is(false));
1098 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
1099 }
1100
Rahul Ravikumar4d2e0092019-02-20 18:19:43 -08001101 @Test
1102 @SmallTest
1103 public void testWorkerThatThrowsAnException() {
1104 OneTimeWorkRequest work =
1105 new OneTimeWorkRequest.Builder(ExceptionWorker.class).build();
1106 insertWork(work);
1107 WorkerWrapper workerWrapper = createBuilder(work.getStringId()).build();
1108 FutureListener listener = createAndAddFutureListener(workerWrapper);
1109 workerWrapper.run();
1110 assertThat(listener.mResult, is(false));
1111 assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED));
1112 }
1113
Sumir Kataria8df18fe2018-08-23 10:19:02 -07001114 private WorkerWrapper.Builder createBuilder(String workSpecId) {
1115 return new WorkerWrapper.Builder(
1116 mContext,
1117 mConfiguration,
1118 mWorkTaskExecutor,
1119 mDatabase,
1120 workSpecId);
1121 }
Sumir Kataria0c320a82018-09-06 16:20:53 -07001122
1123 private FutureListener createAndAddFutureListener(WorkerWrapper workerWrapper) {
1124 ListenableFuture<Boolean> future = workerWrapper.getFuture();
1125 FutureListener listener = new FutureListener(future);
1126 future.addListener(listener, mSynchronousExecutor);
1127 return listener;
1128 }
1129
1130 private static class FutureListener implements Runnable {
1131
1132 ListenableFuture<Boolean> mFuture;
1133 Boolean mResult;
1134
1135 FutureListener(ListenableFuture<Boolean> future) {
1136 mFuture = future;
1137 }
1138
1139 @Override
1140 public void run() {
1141 try {
1142 mResult = mFuture.get();
1143 } catch (InterruptedException | ExecutionException e) {
1144 // Do nothing.
1145 }
1146 }
1147 }
Xyan Bhatnagarb8909f22017-09-20 15:45:56 -07001148}