WorkerWrapperTest.java revision f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12e
1b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar/* 2da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria * Copyright 2017 The Android Open Source Project 3b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * 4b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * Licensed under the Apache License, Version 2.0 (the "License"); 5b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * you may not use this file except in compliance with the License. 6b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * You may obtain a copy of the License at 7b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * 8b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * http://www.apache.org/licenses/LICENSE-2.0 9b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * 10b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * Unless required by applicable law or agreed to in writing, software 11b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * distributed under the License is distributed on an "AS IS" BASIS, 12b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * See the License for the specific language governing permissions and 14b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * limitations under the License. 15b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar */ 16b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 17564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariapackage androidx.work.impl; 18b6430f2f232996be5971e9a57819aa2377daf920Sumir Kataria 19da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Katariaimport static org.hamcrest.CoreMatchers.equalTo; 209e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarinimport static org.hamcrest.CoreMatchers.is; 21da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Katariaimport static org.hamcrest.CoreMatchers.notNullValue; 229e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarinimport static org.hamcrest.MatcherAssert.assertThat; 239244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Katariaimport static org.hamcrest.Matchers.contains; 249e63790830c817be832dd4f7de2b483c2f555363Sumir Katariaimport static org.hamcrest.Matchers.containsInAnyOrder; 250deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarinimport static org.hamcrest.Matchers.greaterThan; 269554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Katariaimport static org.mockito.Mockito.mock; 279554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Katariaimport static org.mockito.Mockito.verify; 28d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 29564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport static androidx.work.State.BLOCKED; 30564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport static androidx.work.State.CANCELLED; 31564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport static androidx.work.State.ENQUEUED; 32564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport static androidx.work.State.FAILED; 33564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport static androidx.work.State.RUNNING; 34564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport static androidx.work.State.SUCCEEDED; 35564e43098c323d1a90be53c190b8fdbdde973505Sumir Kataria 36b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.content.Context; 37b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.InstrumentationRegistry; 38367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagarimport android.support.test.filters.LargeTest; 39b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.filters.SmallTest; 40b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.runner.AndroidJUnit4; 41b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 42b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport org.junit.Before; 43687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagarimport org.junit.Rule; 44b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport org.junit.Test; 45b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport org.junit.runner.RunWith; 469554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Katariaimport org.mockito.ArgumentCaptor; 47b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 486ae802c24782090d816f3950869a446344206e55Sumir Katariaimport java.util.Arrays; 49137c84c9c8212a44ee81c238a1a2271637ffa24bSumir Katariaimport java.util.Collections; 509e63790830c817be832dd4f7de2b483c2f555363Sumir Katariaimport java.util.List; 51d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagarimport java.util.concurrent.Executors; 52f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Katariaimport java.util.concurrent.TimeUnit; 53d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 54564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.Arguments; 55564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.ArrayCreatingInputMerger; 56564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.DatabaseTest; 57564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.PeriodicWork; 58564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.Work; 59564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.Worker; 60564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.Dependency; 61564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.DependencyDao; 62564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.WorkSpec; 63564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.WorkSpecDao; 64564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule; 65564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.ChainedArgumentWorker; 66564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.EchoingWorker; 67564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.FailureWorker; 68564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.RetryWorker; 69564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.SleepTestWorker; 70564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.TestWorker; 71564e43098c323d1a90be53c190b8fdbdde973505Sumir Kataria 72b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar@RunWith(AndroidJUnit4.class) 739e63790830c817be832dd4f7de2b483c2f555363Sumir Katariapublic class WorkerWrapperTest extends DatabaseTest { 74d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar private WorkSpecDao mWorkSpecDao; 756463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar private DependencyDao mDependencyDao; 76b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar private Context mContext; 77dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar private ExecutionListener mMockListener; 789554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria private Scheduler mMockScheduler; 79b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 80687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @Rule 81687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar public InstantTaskExecutorRule mRule = new InstantTaskExecutorRule(); 82687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar 83b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Before 8463ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar public void setUp() { 85b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar mContext = InstrumentationRegistry.getTargetContext(); 86d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar mWorkSpecDao = mDatabase.workSpecDao(); 876463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar mDependencyDao = mDatabase.dependencyDao(); 889554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria mMockListener = mock(ExecutionListener.class); 899554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria mMockScheduler = mock(Scheduler.class); 90b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 91b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 92b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 93687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 94dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar public void testSuccess() throws InterruptedException { 9513915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(TestWorker.class).build(); 961cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 97969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 98969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 99969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 100969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 101fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(work.getId(), true, false); 1026f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(work.getId()), is(SUCCEEDED)); 103b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 104b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 105b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 106367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 107367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testRunAttemptCountIncremented_successfulExecution() { 10813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(TestWorker.class).build(); 1091cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 110367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 111367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .withListener(mMockListener) 112367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .build() 113367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .run(); 114367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getId()); 115367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar assertThat(latestWorkSpec.getRunAttemptCount(), is(1)); 116367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar } 117367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar 118367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @Test 119367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 120367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testRunAttemptCountIncremented_failedExecution() { 12113915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(FailureWorker.class).build(); 1221cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 123367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 124367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .withListener(mMockListener) 125367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .build() 126367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .run(); 127367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getId()); 128367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar assertThat(latestWorkSpec.getRunAttemptCount(), is(1)); 129367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar } 130367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar 131367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @Test 132ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin @SmallTest 133dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar public void testPermanentErrorWithInvalidWorkSpecId() throws InterruptedException { 134b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar final String invalidWorkSpecId = "INVALID_ID"; 135969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, invalidWorkSpecId) 136969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 137969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 138969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 139fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(invalidWorkSpecId, false, false); 140b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 141b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 142b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 143687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 144dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar public void testNotEnqueued() throws InterruptedException { 1459cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria Work work = new Work.Builder(TestWorker.class).withInitialState(RUNNING).build(); 1461cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 147969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 148969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 149969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 150969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 151fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(work.getId(), false, true); 152b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 153b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 154b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 155687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 1562ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria public void testCancelled() throws InterruptedException { 1579cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria Work work = new Work.Builder(TestWorker.class).withInitialState(CANCELLED).build(); 1581cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 1592ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 1602ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria .withListener(mMockListener) 1612ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria .build() 1622ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria .run(); 163fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(work.getId(), false, false); 1646f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(work.getId()), is(CANCELLED)); 1652ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria } 1662ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria 1672ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria @Test 1682ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria @SmallTest 169dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar public void testPermanentErrorWithInvalidWorkerClass() throws InterruptedException { 17013915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(TestWorker.class).build(); 1711cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria getWorkSpec(work).setWorkerClassName("INVALID_CLASS_NAME"); 1721cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 173969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 1743557457daf57a3248c72320243263a0387687085Xyan Bhatnagar .withListener(mMockListener) 1753557457daf57a3248c72320243263a0387687085Xyan Bhatnagar .build() 1763557457daf57a3248c72320243263a0387687085Xyan Bhatnagar .run(); 177fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(work.getId(), false, false); 1786f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(work.getId()), is(FAILED)); 1793557457daf57a3248c72320243263a0387687085Xyan Bhatnagar } 1803557457daf57a3248c72320243263a0387687085Xyan Bhatnagar 1813557457daf57a3248c72320243263a0387687085Xyan Bhatnagar @Test 1823557457daf57a3248c72320243263a0387687085Xyan Bhatnagar @SmallTest 1833557457daf57a3248c72320243263a0387687085Xyan Bhatnagar public void testPermanentErrorWithInvalidInputMergerClass() throws InterruptedException { 18413915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(TestWorker.class).build(); 1851cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria getWorkSpec(work).setInputMergerClassName("INVALID_CLASS_NAME"); 1861cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 1873557457daf57a3248c72320243263a0387687085Xyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 188969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 189969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 190969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 191fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(work.getId(), false, false); 1926f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(work.getId()), is(FAILED)); 193b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 194d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 195d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar @Test 196687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 19763ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar public void testFailed() throws InterruptedException { 19813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(FailureWorker.class).build(); 1991cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 200969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 201969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 202969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 203969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 204fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(work.getId(), false, false); 2056f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(work.getId()), is(FAILED)); 206d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar } 207d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 208d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar @Test 209367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 21063ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar public void testRunning() throws InterruptedException { 21113915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(SleepTestWorker.class).build(); 2121cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 213969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar WorkerWrapper wrapper = new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 214969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 215969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build(); 216d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar Executors.newSingleThreadExecutor().submit(wrapper); 217687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar Thread.sleep(2000L); // Async wait duration. 2186f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(work.getId()), is(RUNNING)); 219dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(SleepTestWorker.SLEEP_DURATION); 220fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(work.getId(), true, false); 221d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar } 2226463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar 2236463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar @Test 224367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 225367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testDependencies() { 22613915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work prerequisiteWork = new Work.Builder(TestWorker.class).build(); 2279cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria Work work = new Work.Builder(TestWorker.class).withInitialState(BLOCKED).build(); 2285643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria Dependency dependency = new Dependency(work.getId(), prerequisiteWork.getId()); 2295643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2305643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.beginTransaction(); 2315643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria try { 2321cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork); 2331cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 2345643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDependencyDao.insertDependency(dependency); 2355643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.setTransactionSuccessful(); 2365643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria } finally { 2375643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.endTransaction(); 2385643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria } 2395643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2406f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(prerequisiteWork.getId()), is(ENQUEUED)); 2416f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(work.getId()), is(BLOCKED)); 2429244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria assertThat(mDependencyDao.hasCompletedAllPrerequisites(work.getId()), is(false)); 2435643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2445643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork.getId()) 245969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 246137c84c9c8212a44ee81c238a1a2271637ffa24bSumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 247969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 248969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 2495643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2506f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(prerequisiteWork.getId()), is(SUCCEEDED)); 2516f4b273fdc1c9b7d93016580dd93825dc0ea9c5bSumir Kataria assertThat(mWorkSpecDao.getState(work.getId()), is(ENQUEUED)); 2529244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria assertThat(mDependencyDao.hasCompletedAllPrerequisites(work.getId()), is(true)); 2539554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria 2549554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria ArgumentCaptor<WorkSpec> captor = ArgumentCaptor.forClass(WorkSpec.class); 2559554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockScheduler).schedule(captor.capture()); 2569554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria assertThat(captor.getValue().getId(), is(work.getId())); 2576463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar } 258969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar 259969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar @Test 260687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 2619244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria public void testDependencies_passesOutputs() { 26213915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work prerequisiteWork = new Work.Builder(ChainedArgumentWorker.class).build(); 2639cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria Work work = new Work.Builder(TestWorker.class).withInitialState(BLOCKED).build(); 2641e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria Dependency dependency = new Dependency(work.getId(), prerequisiteWork.getId()); 2651e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria 2661e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria mDatabase.beginTransaction(); 2671e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria try { 2681cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork); 2691cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 2701e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria mDependencyDao.insertDependency(dependency); 2711e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria mDatabase.setTransactionSuccessful(); 2721e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria } finally { 2731e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria mDatabase.endTransaction(); 2741e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria } 2751e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria 2766ae802c24782090d816f3950869a446344206e55Sumir Kataria new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork.getId()).build().run(); 2771e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria 278d4dcf23e68aefbdb72b105674f18d2b3bd377b69Sumir Kataria List<Arguments> arguments = mWorkSpecDao.getInputsFromPrerequisites(work.getId()); 2799244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria assertThat(arguments.size(), is(1)); 2809244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria assertThat(arguments, contains(ChainedArgumentWorker.getChainedArguments())); 2816ae802c24782090d816f3950869a446344206e55Sumir Kataria } 2826ae802c24782090d816f3950869a446344206e55Sumir Kataria 2836ae802c24782090d816f3950869a446344206e55Sumir Kataria @Test 2846ae802c24782090d816f3950869a446344206e55Sumir Kataria @SmallTest 2859244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria public void testDependencies_passesMergedOutputs() { 2866ae802c24782090d816f3950869a446344206e55Sumir Kataria String key = "key"; 2876ae802c24782090d816f3950869a446344206e55Sumir Kataria String value1 = "value1"; 2886ae802c24782090d816f3950869a446344206e55Sumir Kataria String value2 = "value2"; 2896ae802c24782090d816f3950869a446344206e55Sumir Kataria 29013915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work prerequisiteWork1 = new Work.Builder(EchoingWorker.class) 2916ae802c24782090d816f3950869a446344206e55Sumir Kataria .withArguments(new Arguments.Builder().putString(key, value1).build()) 2926ae802c24782090d816f3950869a446344206e55Sumir Kataria .build(); 29313915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work prerequisiteWork2 = new Work.Builder(EchoingWorker.class) 2946ae802c24782090d816f3950869a446344206e55Sumir Kataria .withArguments(new Arguments.Builder().putString(key, value2).build()) 2956ae802c24782090d816f3950869a446344206e55Sumir Kataria .build(); 29613915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(TestWorker.class) 2976ae802c24782090d816f3950869a446344206e55Sumir Kataria .withInputMerger(ArrayCreatingInputMerger.class) 2986ae802c24782090d816f3950869a446344206e55Sumir Kataria .build(); 2996ae802c24782090d816f3950869a446344206e55Sumir Kataria Dependency dependency1 = new Dependency(work.getId(), prerequisiteWork1.getId()); 3006ae802c24782090d816f3950869a446344206e55Sumir Kataria Dependency dependency2 = new Dependency(work.getId(), prerequisiteWork2.getId()); 3016ae802c24782090d816f3950869a446344206e55Sumir Kataria 3026ae802c24782090d816f3950869a446344206e55Sumir Kataria mDatabase.beginTransaction(); 3036ae802c24782090d816f3950869a446344206e55Sumir Kataria try { 3041cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork1); 3051cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork2); 3061cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 3076ae802c24782090d816f3950869a446344206e55Sumir Kataria mDependencyDao.insertDependency(dependency1); 3086ae802c24782090d816f3950869a446344206e55Sumir Kataria mDependencyDao.insertDependency(dependency2); 3096ae802c24782090d816f3950869a446344206e55Sumir Kataria mDatabase.setTransactionSuccessful(); 3106ae802c24782090d816f3950869a446344206e55Sumir Kataria } finally { 3116ae802c24782090d816f3950869a446344206e55Sumir Kataria mDatabase.endTransaction(); 3126ae802c24782090d816f3950869a446344206e55Sumir Kataria } 3136ae802c24782090d816f3950869a446344206e55Sumir Kataria 3146ae802c24782090d816f3950869a446344206e55Sumir Kataria // Run the prerequisites. 3156ae802c24782090d816f3950869a446344206e55Sumir Kataria new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork1.getId()).build().run(); 3166ae802c24782090d816f3950869a446344206e55Sumir Kataria new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork2.getId()).build().run(); 3176ae802c24782090d816f3950869a446344206e55Sumir Kataria 3186ae802c24782090d816f3950869a446344206e55Sumir Kataria // Create and run the dependent work. 3196ae802c24782090d816f3950869a446344206e55Sumir Kataria WorkerWrapper workerWrapper = new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 3206ae802c24782090d816f3950869a446344206e55Sumir Kataria .build(); 3216ae802c24782090d816f3950869a446344206e55Sumir Kataria workerWrapper.run(); 3226ae802c24782090d816f3950869a446344206e55Sumir Kataria 3236ae802c24782090d816f3950869a446344206e55Sumir Kataria Arguments arguments = workerWrapper.mWorker.getArguments(); 3246ae802c24782090d816f3950869a446344206e55Sumir Kataria assertThat(arguments.size(), is(1)); 3256ae802c24782090d816f3950869a446344206e55Sumir Kataria assertThat(Arrays.asList(arguments.getStringArray(key)), 3266ae802c24782090d816f3950869a446344206e55Sumir Kataria containsInAnyOrder(value1, value2)); 3271e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria } 3281e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria 3291e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria @Test 3301e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria @SmallTest 3310deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin public void testDependencies_setsPeriodStartTimesForUnblockedWork() { 33213915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work prerequisiteWork = new Work.Builder(TestWorker.class).build(); 3339cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria Work work = new Work.Builder(TestWorker.class).withInitialState(BLOCKED).build(); 3340deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin Dependency dependency = new Dependency(work.getId(), prerequisiteWork.getId()); 3350deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3360deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin mDatabase.beginTransaction(); 3370deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin try { 3381cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork); 3391cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 3400deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin mDependencyDao.insertDependency(dependency); 3410deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin mDatabase.setTransactionSuccessful(); 3420deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } finally { 3430deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin mDatabase.endTransaction(); 3440deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } 3450deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3460deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long beforeUnblockedTime = System.currentTimeMillis(); 3470deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3480deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork.getId()) 3490deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .withListener(mMockListener) 350137c84c9c8212a44ee81c238a1a2271637ffa24bSumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 3510deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .build() 3520deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .run(); 3530deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3540deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin WorkSpec workSpec = mWorkSpecDao.getWorkSpec(work.getId()); 3550deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin assertThat(workSpec.getPeriodStartTime(), is(greaterThan(beforeUnblockedTime))); 3560deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } 3570deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3580deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @Test 3590deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @SmallTest 3600deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin public void testRun_periodicWork_success_updatesPeriodStartTime() { 3613032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria long intervalDuration = PeriodicWork.MIN_PERIODIC_INTERVAL_MILLIS; 3620deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long periodStartTime = System.currentTimeMillis(); 3630deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long expectedNextPeriodStartTime = periodStartTime + intervalDuration; 3640deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 36513915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria PeriodicWork periodicWork = new PeriodicWork.Builder( 366f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria TestWorker.class, intervalDuration, TimeUnit.MILLISECONDS).build(); 3670deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3681cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria getWorkSpec(periodicWork).setPeriodStartTime(periodStartTime); 3690deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3701cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 3710deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3720deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin new WorkerWrapper.Builder(mContext, mDatabase, periodicWork.getId()) 3730deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .withListener(mMockListener) 3740deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .build() 3750deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .run(); 3760deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3770deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin WorkSpec updatedWorkSpec = mWorkSpecDao.getWorkSpec(periodicWork.getId()); 3780deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin assertThat(updatedWorkSpec.getPeriodStartTime(), is(expectedNextPeriodStartTime)); 3790deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } 3800deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3810deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @Test 3820deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @SmallTest 3830deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin public void testRun_periodicWork_failure_updatesPeriodStartTime() { 3843032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria long intervalDuration = PeriodicWork.MIN_PERIODIC_INTERVAL_MILLIS; 3850deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long periodStartTime = System.currentTimeMillis(); 3860deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long expectedNextPeriodStartTime = periodStartTime + intervalDuration; 3870deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 38813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria PeriodicWork periodicWork = new PeriodicWork.Builder( 389f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria FailureWorker.class, intervalDuration, TimeUnit.MILLISECONDS).build(); 3900deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3911cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria getWorkSpec(periodicWork).setPeriodStartTime(periodStartTime); 3920deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3931cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 3940deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3950deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin new WorkerWrapper.Builder(mContext, mDatabase, periodicWork.getId()) 3960deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .withListener(mMockListener) 3970deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .build() 3980deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .run(); 3990deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4000deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin WorkSpec updatedWorkSpec = mWorkSpecDao.getWorkSpec(periodicWork.getId()); 4010deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin assertThat(updatedWorkSpec.getPeriodStartTime(), is(expectedNextPeriodStartTime)); 4020deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } 4030deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4040deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @Test 4050deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @SmallTest 406fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar public void testPeriodicWork_success() throws InterruptedException { 40713915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria PeriodicWork periodicWork = new PeriodicWork.Builder( 4083f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria TestWorker.class, 409f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria PeriodicWork.MIN_PERIODIC_INTERVAL_MILLIS, 410f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria TimeUnit.MILLISECONDS) 411ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .build(); 412ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 413ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin final String periodicWorkId = periodicWork.getId(); 4141cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 415ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin new WorkerWrapper.Builder(mContext, mDatabase, periodicWorkId) 416ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .withListener(mMockListener) 417ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .build() 418ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .run(); 419ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 420ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId); 421fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(periodicWorkId, true, false); 422ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin assertThat(periodicWorkSpecAfterFirstRun.getRunAttemptCount(), is(0)); 4239cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria assertThat(periodicWorkSpecAfterFirstRun.getState(), is(ENQUEUED)); 424ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin } 425ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 426ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin @Test 427367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 428fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar public void testPeriodicWork_fail() throws InterruptedException { 42913915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria PeriodicWork periodicWork = new PeriodicWork.Builder( 430fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar FailureWorker.class, 431f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria PeriodicWork.MIN_PERIODIC_INTERVAL_MILLIS, 432f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria TimeUnit.MILLISECONDS) 433fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .build(); 434fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 435fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar final String periodicWorkId = periodicWork.getId(); 4361cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 437fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, periodicWorkId) 438fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .withListener(mMockListener) 439fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .build() 440fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .run(); 441fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 442fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId); 443fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(periodicWorkId, false, false); 444fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar assertThat(periodicWorkSpecAfterFirstRun.getRunAttemptCount(), is(0)); 4459cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria assertThat(periodicWorkSpecAfterFirstRun.getState(), is(ENQUEUED)); 446fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar } 447fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 448fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar @Test 449fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar @SmallTest 450fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar public void testPeriodicWork_retry() throws InterruptedException { 45113915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria PeriodicWork periodicWork = new PeriodicWork.Builder( 452fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar RetryWorker.class, 453f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria PeriodicWork.MIN_PERIODIC_INTERVAL_MILLIS, 454f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria TimeUnit.MILLISECONDS) 455fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .build(); 456fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 457fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar final String periodicWorkId = periodicWork.getId(); 4581cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 459fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, periodicWorkId) 460fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .withListener(mMockListener) 461fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .build() 462fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .run(); 463fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 464fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId); 465fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(periodicWorkId, false, true); 466fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar assertThat(periodicWorkSpecAfterFirstRun.getRunAttemptCount(), is(1)); 4679cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria assertThat(periodicWorkSpecAfterFirstRun.getState(), is(ENQUEUED)); 468fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar } 469fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 470fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar @Test 471fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar @SmallTest 472a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar public void testScheduler() throws InterruptedException { 47313915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(TestWorker.class).build(); 4741cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 475a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar Scheduler mockScheduler = mock(Scheduler.class); 476a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar 477a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 478137c84c9c8212a44ee81c238a1a2271637ffa24bSumir Kataria .withSchedulers(Collections.singletonList(mockScheduler)) 479a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar .build() 480a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar .run(); 481a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar 482a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar verify(mockScheduler).schedule(); 483a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar } 484da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 485da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria @Test 486da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria @SmallTest 487da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria public void testFromWorkSpec_hasAppContext() throws InterruptedException { 48813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(TestWorker.class).build(); 489da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria Worker worker = 4901cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria WorkerWrapper.workerFromWorkSpec(mContext, getWorkSpec(work), Arguments.EMPTY); 491da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 492da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker, is(notNullValue())); 493da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker.getAppContext(), is(equalTo(mContext.getApplicationContext()))); 494da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria } 495da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 496da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria @Test 497da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria @SmallTest 498da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria public void testFromWorkSpec_hasCorrectArguments() throws InterruptedException { 499da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria String key = "KEY"; 500da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria String expectedValue = "VALUE"; 501da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria Arguments arguments = new Arguments.Builder().putString(key, expectedValue).build(); 502da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 50313915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria Work work = new Work.Builder(TestWorker.class).withArguments(arguments).build(); 5041cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria Worker worker = WorkerWrapper.workerFromWorkSpec(mContext, getWorkSpec(work), arguments); 505da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 506da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker, is(notNullValue())); 507da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker.getArguments().getString(key, null), is(expectedValue)); 508da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 50913915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria work = new Work.Builder(TestWorker.class).build(); 5101cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria worker = WorkerWrapper.workerFromWorkSpec(mContext, getWorkSpec(work), Arguments.EMPTY); 511da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 512da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker, is(notNullValue())); 513da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker.getArguments().size(), is(0)); 514da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria } 515b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar} 516