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 19b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport static androidx.work.State.BLOCKED; 205b84f5ce59c65703ce6d5cdb1133185cd93e1862Sumir Katariaimport static androidx.work.State.CANCELLED; 21b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport static androidx.work.State.ENQUEUED; 22b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport static androidx.work.State.FAILED; 23b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport static androidx.work.State.RUNNING; 24b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport static androidx.work.State.SUCCEEDED; 25b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria 26da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Katariaimport static org.hamcrest.CoreMatchers.equalTo; 279e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarinimport static org.hamcrest.CoreMatchers.is; 28da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Katariaimport static org.hamcrest.CoreMatchers.notNullValue; 299e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarinimport static org.hamcrest.MatcherAssert.assertThat; 307b5c560e4098585f73564951621060de708e441fSumir Katariaimport static org.hamcrest.Matchers.arrayContaining; 319244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Katariaimport static org.hamcrest.Matchers.contains; 329e63790830c817be832dd4f7de2b483c2f555363Sumir Katariaimport static org.hamcrest.Matchers.containsInAnyOrder; 330deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarinimport static org.hamcrest.Matchers.greaterThan; 349554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Katariaimport static org.mockito.Mockito.mock; 359f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumarimport static org.mockito.Mockito.spy; 369f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumarimport static org.mockito.Mockito.times; 379554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Katariaimport static org.mockito.Mockito.verify; 38d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 39b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.content.Context; 407b5c560e4098585f73564951621060de708e441fSumir Katariaimport android.net.Uri; 41b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.InstrumentationRegistry; 42367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagarimport android.support.test.filters.LargeTest; 43b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.filters.SmallTest; 44b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.runner.AndroidJUnit4; 45b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 46564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.ArrayCreatingInputMerger; 47e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport androidx.work.Configuration; 4864e6bd86c786f1cb1b0c3dbc2b5307cca5c0d1f6Sumir Katariaimport androidx.work.Data; 49564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.DatabaseTest; 507031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport androidx.work.OneTimeWorkRequest; 518b3284fa4a62568df91f706b0b2334284794008fSumir Katariaimport androidx.work.PeriodicWorkRequest; 52564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.Worker; 53564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.Dependency; 54564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.DependencyDao; 55564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.WorkSpec; 56564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.model.WorkSpecDao; 57564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.impl.utils.taskexecutor.InstantTaskExecutorRule; 58564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.ChainedArgumentWorker; 59564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.EchoingWorker; 603f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Katariaimport androidx.work.worker.ExceptionWorker; 61564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.FailureWorker; 62b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Katariaimport androidx.work.worker.InfiniteTestWorker; 63bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Katariaimport androidx.work.worker.InterruptionAwareWorker; 64564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.RetryWorker; 65564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.SleepTestWorker; 66564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariaimport androidx.work.worker.TestWorker; 67564e43098c323d1a90be53c190b8fdbdde973505Sumir Kataria 68b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport org.junit.Before; 69b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport org.junit.Rule; 70b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport org.junit.Test; 71b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport org.junit.runner.RunWith; 72b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport org.mockito.ArgumentCaptor; 73b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria 74b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport java.util.Arrays; 75b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport java.util.Collections; 76b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport java.util.List; 77b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport java.util.concurrent.Executors; 78b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport java.util.concurrent.TimeUnit; 79b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria 80b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar@RunWith(AndroidJUnit4.class) 819e63790830c817be832dd4f7de2b483c2f555363Sumir Katariapublic class WorkerWrapperTest extends DatabaseTest { 82e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar private Configuration mConfiguration; 83d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar private WorkSpecDao mWorkSpecDao; 846463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar private DependencyDao mDependencyDao; 85b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar private Context mContext; 86dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar private ExecutionListener mMockListener; 879554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria private Scheduler mMockScheduler; 88b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 89687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @Rule 90687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar public InstantTaskExecutorRule mRule = new InstantTaskExecutorRule(); 91687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar 92b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Before 9363ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar public void setUp() { 94b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar mContext = InstrumentationRegistry.getTargetContext(); 95e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar mConfiguration = new Configuration.Builder().build(); 969f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar mWorkSpecDao = spy(mDatabase.workSpecDao()); 976463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar mDependencyDao = mDatabase.dependencyDao(); 989554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria mMockListener = mock(ExecutionListener.class); 999554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria mMockScheduler = mock(Scheduler.class); 100b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 101b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 102b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 103687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 104dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testSuccess() { 1057031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 1061cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 107e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 108969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 109969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 110969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 111fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), true, false); 112fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(SUCCEEDED)); 113b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 114b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 115b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 116367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 117367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testRunAttemptCountIncremented_successfulExecution() { 1187031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 1191cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 120e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 1219f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 122367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .withListener(mMockListener) 123367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .build() 124367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .run(); 125fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getStringId()); 126b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(latestWorkSpec.runAttemptCount, is(1)); 127367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar } 128367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar 129367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @Test 130367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 131367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testRunAttemptCountIncremented_failedExecution() { 1327031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build(); 1331cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 134e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 1359f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 136367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .withListener(mMockListener) 137367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .build() 138367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .run(); 139fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getStringId()); 140b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(latestWorkSpec.runAttemptCount, is(1)); 141367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar } 142367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar 143367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @Test 144ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin @SmallTest 145dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testPermanentErrorWithInvalidWorkSpecId() { 146b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar final String invalidWorkSpecId = "INVALID_ID"; 147e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, invalidWorkSpecId) 148969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 149969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 150969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 151fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(invalidWorkSpecId, false, false); 152b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 153b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 154b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 155687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 156dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testNotEnqueued() { 1577031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class) 15862a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInitialState(RUNNING) 1598b3284fa4a62568df91f706b0b2334284794008fSumir Kataria .build(); 1601cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 161e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 162969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 163969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 164969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 165fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, true); 166b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 167b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 168b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 169687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 170dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testCancelled() { 1717031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class) 1725b84f5ce59c65703ce6d5cdb1133185cd93e1862Sumir Kataria .setInitialState(CANCELLED) 1738b3284fa4a62568df91f706b0b2334284794008fSumir Kataria .build(); 1741cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 175e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 1762ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria .withListener(mMockListener) 1772ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria .build() 1782ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria .run(); 179fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, false); 1805b84f5ce59c65703ce6d5cdb1133185cd93e1862Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(CANCELLED)); 1812ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria } 1822ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria 1832ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria @Test 1842ace67d8c1383f7c33940d48817fd4d362105641Sumir Kataria @SmallTest 185dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testPermanentErrorWithInvalidWorkerClass() { 1867031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 187b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria getWorkSpec(work).workerClassName = "INVALID_CLASS_NAME"; 1881cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 189e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 1903557457daf57a3248c72320243263a0387687085Xyan Bhatnagar .withListener(mMockListener) 1913557457daf57a3248c72320243263a0387687085Xyan Bhatnagar .build() 1923557457daf57a3248c72320243263a0387687085Xyan Bhatnagar .run(); 193fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, false); 194fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED)); 1953557457daf57a3248c72320243263a0387687085Xyan Bhatnagar } 1963557457daf57a3248c72320243263a0387687085Xyan Bhatnagar 1973557457daf57a3248c72320243263a0387687085Xyan Bhatnagar @Test 1983557457daf57a3248c72320243263a0387687085Xyan Bhatnagar @SmallTest 199dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testPermanentErrorWithInvalidInputMergerClass() { 2007031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 201b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria getWorkSpec(work).inputMergerClassName = "INVALID_CLASS_NAME"; 2021cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 203e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 2049f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 205969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 206969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 207969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 208fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, false); 209fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED)); 210b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 211d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 212d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar @Test 213687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 214dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testFailed() { 2157031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build(); 2161cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 217e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 218969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 219969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 220969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 221fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, false); 222fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED)); 223d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar } 224d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 225d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar @Test 226367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 22763ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar public void testRunning() throws InterruptedException { 2287031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(SleepTestWorker.class).build(); 2291cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 230e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar WorkerWrapper wrapper = new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, 231e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar work.getStringId()) 232969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 233969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build(); 234d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar Executors.newSingleThreadExecutor().submit(wrapper); 235687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar Thread.sleep(2000L); // Async wait duration. 236fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(RUNNING)); 237dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(SleepTestWorker.SLEEP_DURATION); 238fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), true, false); 239d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar } 2406463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar 2416463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar @Test 242367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 243dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testRunning_onlyWhenEnqueued() { 2447031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class) 24562a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInitialState(RUNNING) 246dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria .build(); 247dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria insertWork(work); 248e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 249dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria .withListener(mMockListener) 250dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria .build() 251dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria .run(); 252fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, true); 253dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria } 254dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria 255dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria @Test 256dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria @SmallTest 257367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testDependencies() { 2587031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest prerequisiteWork = 2597031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar new OneTimeWorkRequest.Builder(TestWorker.class).build(); 2607031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class) 26162a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInitialState(BLOCKED).build(); 262fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria Dependency dependency = new Dependency(work.getStringId(), prerequisiteWork.getStringId()); 2635643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2645643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.beginTransaction(); 2655643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria try { 2661cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork); 2671cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 2685643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDependencyDao.insertDependency(dependency); 2695643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.setTransactionSuccessful(); 2705643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria } finally { 2715643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.endTransaction(); 2725643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria } 2735643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 274fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(prerequisiteWork.getStringId()), is(ENQUEUED)); 275fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(BLOCKED)); 276fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mDependencyDao.hasCompletedAllPrerequisites(work.getStringId()), is(false)); 2775643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 278e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, 279e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar prerequisiteWork.getStringId()) 280969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 281137c84c9c8212a44ee81c238a1a2271637ffa24bSumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 282969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 283969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 2845643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 285fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(prerequisiteWork.getStringId()), is(SUCCEEDED)); 286fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(ENQUEUED)); 287fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mDependencyDao.hasCompletedAllPrerequisites(work.getStringId()), is(true)); 2889554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria 2899554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria ArgumentCaptor<WorkSpec> captor = ArgumentCaptor.forClass(WorkSpec.class); 2909554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockScheduler).schedule(captor.capture()); 291fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(captor.getValue().id, is(work.getStringId())); 2926463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar } 293969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar 294969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar @Test 295687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar @SmallTest 2969244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria public void testDependencies_passesOutputs() { 2977031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest prerequisiteWork = 2987031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar new OneTimeWorkRequest.Builder(ChainedArgumentWorker.class).build(); 2997031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class) 30062a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInitialState(BLOCKED) 3018b3284fa4a62568df91f706b0b2334284794008fSumir Kataria .build(); 302fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria Dependency dependency = new Dependency(work.getStringId(), prerequisiteWork.getStringId()); 3031e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria 3041e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria mDatabase.beginTransaction(); 3051e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria try { 3061cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork); 3071cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 3081e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria mDependencyDao.insertDependency(dependency); 3091e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria mDatabase.setTransactionSuccessful(); 3101e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria } finally { 3111e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria mDatabase.endTransaction(); 3121e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria } 3131e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria 314e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, 315e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar prerequisiteWork.getStringId()) 3169f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 3179f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .build().run(); 3181e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria 319fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria List<Data> arguments = mWorkSpecDao.getInputsFromPrerequisites(work.getStringId()); 3209244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria assertThat(arguments.size(), is(1)); 3219244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria assertThat(arguments, contains(ChainedArgumentWorker.getChainedArguments())); 3226ae802c24782090d816f3950869a446344206e55Sumir Kataria } 3236ae802c24782090d816f3950869a446344206e55Sumir Kataria 3246ae802c24782090d816f3950869a446344206e55Sumir Kataria @Test 3256ae802c24782090d816f3950869a446344206e55Sumir Kataria @SmallTest 3269244d377b9c9216a474b12d1a5f6aaa787941af4Sumir Kataria public void testDependencies_passesMergedOutputs() { 3276ae802c24782090d816f3950869a446344206e55Sumir Kataria String key = "key"; 3286ae802c24782090d816f3950869a446344206e55Sumir Kataria String value1 = "value1"; 3296ae802c24782090d816f3950869a446344206e55Sumir Kataria String value2 = "value2"; 3306ae802c24782090d816f3950869a446344206e55Sumir Kataria 3317031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest prerequisiteWork1 = new OneTimeWorkRequest.Builder(EchoingWorker.class) 33262a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInputData(new Data.Builder().putString(key, value1).build()) 3336ae802c24782090d816f3950869a446344206e55Sumir Kataria .build(); 3347031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest prerequisiteWork2 = new OneTimeWorkRequest.Builder(EchoingWorker.class) 33562a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInputData(new Data.Builder().putString(key, value2).build()) 3366ae802c24782090d816f3950869a446344206e55Sumir Kataria .build(); 3377031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class) 33862a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInputMerger(ArrayCreatingInputMerger.class) 3396ae802c24782090d816f3950869a446344206e55Sumir Kataria .build(); 340fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria Dependency dependency1 = 341fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria new Dependency(work.getStringId(), prerequisiteWork1.getStringId()); 342fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria Dependency dependency2 = 343fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria new Dependency(work.getStringId(), prerequisiteWork2.getStringId()); 3446ae802c24782090d816f3950869a446344206e55Sumir Kataria 3456ae802c24782090d816f3950869a446344206e55Sumir Kataria mDatabase.beginTransaction(); 3466ae802c24782090d816f3950869a446344206e55Sumir Kataria try { 3471cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork1); 3481cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork2); 3491cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 3506ae802c24782090d816f3950869a446344206e55Sumir Kataria mDependencyDao.insertDependency(dependency1); 3516ae802c24782090d816f3950869a446344206e55Sumir Kataria mDependencyDao.insertDependency(dependency2); 3526ae802c24782090d816f3950869a446344206e55Sumir Kataria mDatabase.setTransactionSuccessful(); 3536ae802c24782090d816f3950869a446344206e55Sumir Kataria } finally { 3546ae802c24782090d816f3950869a446344206e55Sumir Kataria mDatabase.endTransaction(); 3556ae802c24782090d816f3950869a446344206e55Sumir Kataria } 3566ae802c24782090d816f3950869a446344206e55Sumir Kataria 3576ae802c24782090d816f3950869a446344206e55Sumir Kataria // Run the prerequisites. 358e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, 359e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar prerequisiteWork1.getStringId()) 3609f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 3619f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .build().run(); 3629f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 363e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, 364e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar prerequisiteWork2.getStringId()) 3659f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 3669f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .build().run(); 3676ae802c24782090d816f3950869a446344206e55Sumir Kataria 3686ae802c24782090d816f3950869a446344206e55Sumir Kataria // Create and run the dependent work. 369fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria WorkerWrapper workerWrapper = 370e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 371fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 372fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria .build(); 3736ae802c24782090d816f3950869a446344206e55Sumir Kataria workerWrapper.run(); 3746ae802c24782090d816f3950869a446344206e55Sumir Kataria 37564e6bd86c786f1cb1b0c3dbc2b5307cca5c0d1f6Sumir Kataria Data input = workerWrapper.mWorker.getInputData(); 37664e6bd86c786f1cb1b0c3dbc2b5307cca5c0d1f6Sumir Kataria assertThat(input.size(), is(1)); 37764e6bd86c786f1cb1b0c3dbc2b5307cca5c0d1f6Sumir Kataria assertThat(Arrays.asList(input.getStringArray(key)), 3786ae802c24782090d816f3950869a446344206e55Sumir Kataria containsInAnyOrder(value1, value2)); 3791e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria } 3801e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria 3811e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria @Test 3821e9589d6482d2690e2eabb21f732377d268a5c05Sumir Kataria @SmallTest 3830deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin public void testDependencies_setsPeriodStartTimesForUnblockedWork() { 3847031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest prerequisiteWork = 3857031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar new OneTimeWorkRequest.Builder(TestWorker.class).build(); 3867031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class) 38762a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInitialState(BLOCKED) 3888b3284fa4a62568df91f706b0b2334284794008fSumir Kataria .build(); 389fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria Dependency dependency = new Dependency(work.getStringId(), prerequisiteWork.getStringId()); 3900deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 3910deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin mDatabase.beginTransaction(); 3920deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin try { 3931cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(prerequisiteWork); 3941cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 3950deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin mDependencyDao.insertDependency(dependency); 3960deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin mDatabase.setTransactionSuccessful(); 3970deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } finally { 3980deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin mDatabase.endTransaction(); 3990deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } 4000deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4010deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long beforeUnblockedTime = System.currentTimeMillis(); 4020deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 403e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, 404e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar prerequisiteWork.getStringId()) 4050deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .withListener(mMockListener) 406137c84c9c8212a44ee81c238a1a2271637ffa24bSumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 4070deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .build() 4080deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .run(); 4090deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 410fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria WorkSpec workSpec = mWorkSpecDao.getWorkSpec(work.getStringId()); 411b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(workSpec.periodStartTime, is(greaterThan(beforeUnblockedTime))); 4120deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } 4130deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4140deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @Test 4150deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @SmallTest 416c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria public void testDependencies_failsUncancelledDependentsOnFailure() { 4177031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest prerequisiteWork = 4187031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar new OneTimeWorkRequest.Builder(FailureWorker.class).build(); 4197031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class) 42062a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria .setInitialState(BLOCKED) 4218b3284fa4a62568df91f706b0b2334284794008fSumir Kataria .build(); 4227031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest cancelledWork = new OneTimeWorkRequest.Builder(TestWorker.class) 4235b84f5ce59c65703ce6d5cdb1133185cd93e1862Sumir Kataria .setInitialState(CANCELLED) 4248b3284fa4a62568df91f706b0b2334284794008fSumir Kataria .build(); 425fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria Dependency dependency1 = new Dependency(work.getStringId(), prerequisiteWork.getStringId()); 426fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria Dependency dependency2 = 427fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria new Dependency(cancelledWork.getStringId(), prerequisiteWork.getStringId()); 428c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria 429c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria mDatabase.beginTransaction(); 430c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria try { 431c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria insertWork(prerequisiteWork); 432c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria insertWork(work); 433c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria insertWork(cancelledWork); 434c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria mDependencyDao.insertDependency(dependency1); 435c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria mDependencyDao.insertDependency(dependency2); 436c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria mDatabase.setTransactionSuccessful(); 437c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria } finally { 438c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria mDatabase.endTransaction(); 439c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria } 440c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria 441e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, 442e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar prerequisiteWork.getStringId()) 443fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria .build() 444fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria .run(); 445c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria 446fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(prerequisiteWork.getStringId()), is(FAILED)); 447fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED)); 4485b84f5ce59c65703ce6d5cdb1133185cd93e1862Sumir Kataria assertThat(mWorkSpecDao.getState(cancelledWork.getStringId()), is(CANCELLED)); 449c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria } 450c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria 451c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria @Test 452c1ba633e4668bbf02097a76261ebcee8f3b59e06Sumir Kataria @SmallTest 4530deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin public void testRun_periodicWork_success_updatesPeriodStartTime() { 4548b3284fa4a62568df91f706b0b2334284794008fSumir Kataria long intervalDuration = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS; 4550deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long periodStartTime = System.currentTimeMillis(); 4560deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long expectedNextPeriodStartTime = periodStartTime + intervalDuration; 4570deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4588b3284fa4a62568df91f706b0b2334284794008fSumir Kataria PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder( 459f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria TestWorker.class, intervalDuration, TimeUnit.MILLISECONDS).build(); 4600deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 461b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria getWorkSpec(periodicWork).periodStartTime = periodStartTime; 4620deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4631cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 4640deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 465e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWork.getStringId()) 4660deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .withListener(mMockListener) 4670deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .build() 4680deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .run(); 4690deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 470fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria WorkSpec updatedWorkSpec = mWorkSpecDao.getWorkSpec(periodicWork.getStringId()); 471b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(updatedWorkSpec.periodStartTime, is(expectedNextPeriodStartTime)); 4720deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } 4730deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4740deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @Test 4750deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @SmallTest 4760deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin public void testRun_periodicWork_failure_updatesPeriodStartTime() { 4778b3284fa4a62568df91f706b0b2334284794008fSumir Kataria long intervalDuration = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS; 4780deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long periodStartTime = System.currentTimeMillis(); 4790deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin long expectedNextPeriodStartTime = periodStartTime + intervalDuration; 4800deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4818b3284fa4a62568df91f706b0b2334284794008fSumir Kataria PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder( 482f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria FailureWorker.class, intervalDuration, TimeUnit.MILLISECONDS).build(); 4830deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 484b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria getWorkSpec(periodicWork).periodStartTime = periodStartTime; 4850deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4861cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 4870deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 488e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWork.getStringId()) 4890deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .withListener(mMockListener) 4900deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .build() 4910deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin .run(); 4920deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 493fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria WorkSpec updatedWorkSpec = mWorkSpecDao.getWorkSpec(periodicWork.getStringId()); 494b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(updatedWorkSpec.periodStartTime, is(expectedNextPeriodStartTime)); 4950deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin } 4960deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin 4970deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @Test 4980deb5e280d72959e89e7c4433e15c77f6523b693Jan Clarin @SmallTest 499dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testPeriodicWork_success() { 5008b3284fa4a62568df91f706b0b2334284794008fSumir Kataria PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder( 5013f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria TestWorker.class, 5028b3284fa4a62568df91f706b0b2334284794008fSumir Kataria PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, 503f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria TimeUnit.MILLISECONDS) 504ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .build(); 505ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 506fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria final String periodicWorkId = periodicWork.getStringId(); 5071cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 508e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWorkId) 509ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .withListener(mMockListener) 510ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .build() 511ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .run(); 512ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 513ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId); 514fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(periodicWorkId, true, false); 515b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(periodicWorkSpecAfterFirstRun.runAttemptCount, is(0)); 516b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(periodicWorkSpecAfterFirstRun.state, is(ENQUEUED)); 517ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin } 518ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 519ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin @Test 520367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 521dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testPeriodicWork_fail() { 5228b3284fa4a62568df91f706b0b2334284794008fSumir Kataria PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder( 523fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar FailureWorker.class, 5248b3284fa4a62568df91f706b0b2334284794008fSumir Kataria PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, 525f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria TimeUnit.MILLISECONDS) 526fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .build(); 527fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 528fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria final String periodicWorkId = periodicWork.getStringId(); 5291cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 530e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWorkId) 531fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .withListener(mMockListener) 532fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .build() 533fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .run(); 534fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 535fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId); 536fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(periodicWorkId, false, false); 537b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(periodicWorkSpecAfterFirstRun.runAttemptCount, is(0)); 538b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(periodicWorkSpecAfterFirstRun.state, is(ENQUEUED)); 539fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar } 540fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 541fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar @Test 542fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar @SmallTest 543dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testPeriodicWork_retry() { 5448b3284fa4a62568df91f706b0b2334284794008fSumir Kataria PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder( 545fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar RetryWorker.class, 5468b3284fa4a62568df91f706b0b2334284794008fSumir Kataria PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, 547f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria TimeUnit.MILLISECONDS) 548fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .build(); 549fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 550fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria final String periodicWorkId = periodicWork.getStringId(); 5511cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(periodicWork); 552e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, periodicWorkId) 553fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .withListener(mMockListener) 554fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .build() 555fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar .run(); 556fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 557fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId); 558fb351fb5fe9af0af6c37aa282ce3a3325d311425Rahul Ravikumar verify(mMockListener).onExecuted(periodicWorkId, false, true); 559b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(periodicWorkSpecAfterFirstRun.runAttemptCount, is(1)); 560b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria assertThat(periodicWorkSpecAfterFirstRun.state, is(ENQUEUED)); 561fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar } 562fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar 563fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar @Test 564fdd887fead7d32e5e69e94d6b2ebe9770b2ec5bbXyan Bhatnagar @SmallTest 565dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testScheduler() { 5667031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 5671cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria insertWork(work); 568a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar Scheduler mockScheduler = mock(Scheduler.class); 569a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar 570e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 571137c84c9c8212a44ee81c238a1a2271637ffa24bSumir Kataria .withSchedulers(Collections.singletonList(mockScheduler)) 572a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar .build() 573a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar .run(); 574a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar 575a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar verify(mockScheduler).schedule(); 576a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar } 577da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 578da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria @Test 579da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria @SmallTest 580dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testFromWorkSpec_hasAppContext() { 5817031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 582681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria Worker worker = WorkerWrapper.workerFromWorkSpec( 583681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria mContext, 584681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria getWorkSpec(work), 585b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria new Extras(Data.EMPTY, Collections.<String>emptyList(), null, 1)); 586da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 587da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker, is(notNullValue())); 588d0d61c5aa317685f06802a202a2f46c71e1da962Rahul Ravikumar assertThat(worker.getApplicationContext(), is(equalTo(mContext.getApplicationContext()))); 589da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria } 590da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 591da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria @Test 592da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria @SmallTest 593dcbf20db18e3e93a13e9fa75fa4b723255b87c54Sumir Kataria public void testFromWorkSpec_hasCorrectArguments() { 594da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria String key = "KEY"; 595da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria String expectedValue = "VALUE"; 59664e6bd86c786f1cb1b0c3dbc2b5307cca5c0d1f6Sumir Kataria Data input = new Data.Builder().putString(key, expectedValue).build(); 597da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 5987031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = 59962a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria new OneTimeWorkRequest.Builder(TestWorker.class).setInputData(input).build(); 600681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria Worker worker = WorkerWrapper.workerFromWorkSpec( 601681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria mContext, 602681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria getWorkSpec(work), 603b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria new Extras(input, Collections.<String>emptyList(), null, 1)); 604da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 605da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker, is(notNullValue())); 60664e6bd86c786f1cb1b0c3dbc2b5307cca5c0d1f6Sumir Kataria assertThat(worker.getInputData().getString(key, null), is(expectedValue)); 607da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 6087031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 609681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria worker = WorkerWrapper.workerFromWorkSpec( 610681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria mContext, 611681a8d809fe41189c9d590d33b986b98170e4963Sumir Kataria getWorkSpec(work), 612b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria new Extras(Data.EMPTY, Collections.<String>emptyList(), null, 1)); 613da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria 614da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria assertThat(worker, is(notNullValue())); 61564e6bd86c786f1cb1b0c3dbc2b5307cca5c0d1f6Sumir Kataria assertThat(worker.getInputData().size(), is(0)); 616da315bf9331a3ead74483bd0d38fd331f4a96088Sumir Kataria } 6179f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 6189f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar @Test 6199f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar @SmallTest 6207b5c560e4098585f73564951621060de708e441fSumir Kataria public void testFromWorkSpec_hasCorrectTags() { 6217b5c560e4098585f73564951621060de708e441fSumir Kataria OneTimeWorkRequest work = 6227b5c560e4098585f73564951621060de708e441fSumir Kataria new OneTimeWorkRequest.Builder(TestWorker.class) 6237b5c560e4098585f73564951621060de708e441fSumir Kataria .addTag("one") 6247b5c560e4098585f73564951621060de708e441fSumir Kataria .addTag("two") 6257b5c560e4098585f73564951621060de708e441fSumir Kataria .addTag("three") 6267b5c560e4098585f73564951621060de708e441fSumir Kataria .build(); 6277b5c560e4098585f73564951621060de708e441fSumir Kataria Worker worker = WorkerWrapper.workerFromWorkSpec( 6287b5c560e4098585f73564951621060de708e441fSumir Kataria mContext, 6297b5c560e4098585f73564951621060de708e441fSumir Kataria getWorkSpec(work), 630b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria new Extras(Data.EMPTY, Arrays.asList("one", "two", "three"), null, 1)); 6317b5c560e4098585f73564951621060de708e441fSumir Kataria 6327b5c560e4098585f73564951621060de708e441fSumir Kataria assertThat(worker, is(notNullValue())); 6337b5c560e4098585f73564951621060de708e441fSumir Kataria assertThat(worker.getTags(), containsInAnyOrder("one", "two", "three")); 6347b5c560e4098585f73564951621060de708e441fSumir Kataria } 6357b5c560e4098585f73564951621060de708e441fSumir Kataria 6367b5c560e4098585f73564951621060de708e441fSumir Kataria @Test 6377b5c560e4098585f73564951621060de708e441fSumir Kataria @SmallTest 6387b5c560e4098585f73564951621060de708e441fSumir Kataria public void testFromWorkSpec_hasCorrectRuntimeExtras() { 6397b5c560e4098585f73564951621060de708e441fSumir Kataria OneTimeWorkRequest work = 6407b5c560e4098585f73564951621060de708e441fSumir Kataria new OneTimeWorkRequest.Builder(TestWorker.class).build(); 6417b5c560e4098585f73564951621060de708e441fSumir Kataria Extras.RuntimeExtras runtimeExtras = new Extras.RuntimeExtras(); 642e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar runtimeExtras.triggeredContentAuthorities = new String[]{"tca1", "tca2", "tca3"}; 643e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar runtimeExtras.triggeredContentUris = new Uri[]{Uri.parse("tcu1"), Uri.parse("tcu2")}; 6447b5c560e4098585f73564951621060de708e441fSumir Kataria 6457b5c560e4098585f73564951621060de708e441fSumir Kataria Worker worker = WorkerWrapper.workerFromWorkSpec( 6467b5c560e4098585f73564951621060de708e441fSumir Kataria mContext, 6477b5c560e4098585f73564951621060de708e441fSumir Kataria getWorkSpec(work), 648b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria new Extras(Data.EMPTY, Collections.<String>emptyList(), runtimeExtras, 1)); 6497b5c560e4098585f73564951621060de708e441fSumir Kataria 6507b5c560e4098585f73564951621060de708e441fSumir Kataria assertThat(worker, is(notNullValue())); 6517b5c560e4098585f73564951621060de708e441fSumir Kataria assertThat(worker.getTriggeredContentAuthorities(), 6527b5c560e4098585f73564951621060de708e441fSumir Kataria arrayContaining(runtimeExtras.triggeredContentAuthorities)); 6537b5c560e4098585f73564951621060de708e441fSumir Kataria assertThat(worker.getTriggeredContentUris(), 6547b5c560e4098585f73564951621060de708e441fSumir Kataria arrayContaining(runtimeExtras.triggeredContentUris)); 6557b5c560e4098585f73564951621060de708e441fSumir Kataria } 6567b5c560e4098585f73564951621060de708e441fSumir Kataria 6577b5c560e4098585f73564951621060de708e441fSumir Kataria @Test 6587b5c560e4098585f73564951621060de708e441fSumir Kataria @SmallTest 6599f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar public void testSuccess_withPendingScheduledWork() { 6607031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 6619f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar insertWork(work); 6629f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 6637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest unscheduled = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 6649f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar insertWork(unscheduled); 6659f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 666e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 6679f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 6689f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withListener(mMockListener) 6699f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .build() 6709f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .run(); 6719f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 6729f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar verify(mMockScheduler, times(1)).schedule(unscheduled.getWorkSpec()); 673fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), true, false); 674fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(SUCCEEDED)); 6759f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar } 6769f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 6779f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar @Test 6789f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar @SmallTest 6799f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar public void testFailure_withPendingScheduledWork() { 6807031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(FailureWorker.class).build(); 6819f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar insertWork(work); 6829f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 6837031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest unscheduled = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 6849f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar insertWork(unscheduled); 6859f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 686e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 6879f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 6889f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .withListener(mMockListener) 6899f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .build() 6909f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar .run(); 6919f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar 6929f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar verify(mMockScheduler, times(1)).schedule(unscheduled.getWorkSpec()); 693fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, false); 694fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED)); 6959f91ee8c71606f36a51177cd0b5c3005834be1ffRahul Ravikumar } 696b0a0d7b4910f8733c04bc9dd98ec05da7247bdceSumir Kataria 697b0a0d7b4910f8733c04bc9dd98ec05da7247bdceSumir Kataria @Test 698d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria @LargeTest 699b0a0d7b4910f8733c04bc9dd98ec05da7247bdceSumir Kataria public void testInterruption() throws InterruptedException { 7007031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class).build(); 701b0a0d7b4910f8733c04bc9dd98ec05da7247bdceSumir Kataria insertWork(work); 702b0a0d7b4910f8733c04bc9dd98ec05da7247bdceSumir Kataria 703fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria WorkerWrapper workerWrapper = 704e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 705fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 706fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria .withListener(mMockListener) 707fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria .build(); 708b0a0d7b4910f8733c04bc9dd98ec05da7247bdceSumir Kataria Executors.newSingleThreadExecutor().submit(workerWrapper); 7095d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria workerWrapper.interrupt(false); 710b0a0d7b4910f8733c04bc9dd98ec05da7247bdceSumir Kataria Thread.sleep(6000L); 711fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, true); 712b0a0d7b4910f8733c04bc9dd98ec05da7247bdceSumir Kataria } 7133f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria 7143f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria @Test 7153f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria @SmallTest 7165d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria public void testInterruptionWithoutCancellation_isMarkedOnRunningWorker() { 717bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria OneTimeWorkRequest work = 718bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria new OneTimeWorkRequest.Builder(InterruptionAwareWorker.class).build(); 719bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria insertWork(work); 720bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria 721dd5f33cd6b98eba208ac7c69d3d6314d3115e2d2Sumir Kataria Worker worker = WorkerWrapper.workerFromClassName( 722dd5f33cd6b98eba208ac7c69d3d6314d3115e2d2Sumir Kataria mContext, 723bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria InterruptionAwareWorker.class.getName(), 724dd5f33cd6b98eba208ac7c69d3d6314d3115e2d2Sumir Kataria work.getId(), 725b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria new Extras(Data.EMPTY, Collections.<String>emptyList(), null, 1)); 726bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria assertThat(worker, is(notNullValue())); 727bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria assertThat(worker.isStopped(), is(false)); 728bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria 729bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria WorkerWrapper workerWrapper = 730e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 731bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 732bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria .withListener(mMockListener) 733bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria .withWorker(worker) 734bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria .build(); 735bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria Executors.newSingleThreadExecutor().submit(workerWrapper); 7365d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria workerWrapper.interrupt(false); 737bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria assertThat(worker.isStopped(), is(true)); 7385d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria assertThat(worker.isCancelled(), is(false)); 7395d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria } 7405d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria 7415d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria @Test 7425d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria @SmallTest 7435d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria public void testInterruptionWithCancellation_isMarkedOnRunningWorker() { 7445d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria OneTimeWorkRequest work = 7455d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria new OneTimeWorkRequest.Builder(InterruptionAwareWorker.class).build(); 7465d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria insertWork(work); 7475d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria 7485d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria Worker worker = WorkerWrapper.workerFromClassName( 7495d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria mContext, 7505d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria InterruptionAwareWorker.class.getName(), 7515d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria work.getId(), 752b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria new Extras(Data.EMPTY, Collections.<String>emptyList(), null, 1)); 7535d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria assertThat(worker, is(notNullValue())); 7545d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria assertThat(worker.isStopped(), is(false)); 7555d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria 7565d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria WorkerWrapper workerWrapper = 757e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 7585d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 7595d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria .withListener(mMockListener) 7605d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria .withWorker(worker) 7615d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria .build(); 7625d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria Executors.newSingleThreadExecutor().submit(workerWrapper); 7635d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria workerWrapper.interrupt(true); 7645d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria assertThat(worker.isStopped(), is(true)); 7655d373d376edddb57cd822dd06ed54f97ef949586Sumir Kataria assertThat(worker.isCancelled(), is(true)); 766bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria } 767bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria 768bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria @Test 769bf4f4f72fd27f110b95cc9867fb5dc695d2689b1Sumir Kataria @SmallTest 7703f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria public void testException_isTreatedAsFailure() { 7713f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(ExceptionWorker.class).build(); 7723f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria insertWork(work); 7733f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria 774e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 7753f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 7763f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria .withListener(mMockListener) 7773f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria .build() 7783f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria .run(); 7793f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria 7803f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria assertThat(mWorkSpecDao.getState(work.getStringId()), is(FAILED)); 7813f0c0fbaf4be127488fc900d915d1c966813a4e6Sumir Kataria } 782d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria 783d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria @Test 784d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria @LargeTest 785d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria public void testWorkerWrapper_handlesWorkSpecDeletion() throws InterruptedException { 786d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(SleepTestWorker.class).build(); 787d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria insertWork(work); 788d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria 789d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria WorkerWrapper workerWrapper = 790e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 791d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria .withSchedulers(Collections.singletonList(mMockScheduler)) 792d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria .withListener(mMockListener) 793d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria .build(); 794d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria 795d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria Executors.newSingleThreadExecutor().submit(workerWrapper); 796d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria mWorkSpecDao.delete(work.getStringId()); 797d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria Thread.sleep(6000L); 798d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria verify(mMockListener).onExecuted(work.getStringId(), false, false); 799d874811ee5f3275e6022115a03aa6001dc1830a9Sumir Kataria } 800b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria 801b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria @Test 802b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria @LargeTest 803b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria public void testWorker_getsRunAttemptCount() throws InterruptedException { 804b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(InfiniteTestWorker.class) 805b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria .setInitialRunAttemptCount(10) 806b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria .build(); 807b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria insertWork(work); 808b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria 809b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria WorkerWrapper workerWrapper = 810e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar new WorkerWrapper.Builder(mContext, mConfiguration, mDatabase, work.getStringId()) 811e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar .withSchedulers(Collections.singletonList(mMockScheduler)) 812e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar .withListener(mMockListener) 813e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar .build(); 814b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria 815b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria Executors.newSingleThreadExecutor().submit(workerWrapper); 816b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria Thread.sleep(1000L); 817b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria assertThat(workerWrapper.mWorker.getRunAttemptCount(), is(10)); 818b24ef38a0b526b524e3e6a7849f62f934a6ad58cSumir Kataria } 819b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar} 820