WorkerWrapperTest.java revision 3f630c934df9af951f5b209ac98892a840f9aa97
1b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar/* 2b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar * Copyright (C) 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 17b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarpackage android.arch.background.workmanager; 18b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 195643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Katariaimport static android.arch.background.workmanager.Work.STATUS_BLOCKED; 205643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Katariaimport static android.arch.background.workmanager.Work.STATUS_ENQUEUED; 215643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Katariaimport static android.arch.background.workmanager.Work.STATUS_SUCCEEDED; 225643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 239e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarinimport static org.hamcrest.CoreMatchers.is; 249e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarinimport static org.hamcrest.MatcherAssert.assertThat; 259554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Katariaimport static org.mockito.Mockito.mock; 269554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Katariaimport static org.mockito.Mockito.verify; 27d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 28115eb6a640a0addca15460a2a994e21692a3ffefSumir Katariaimport android.arch.background.workmanager.model.Dependency; 29115eb6a640a0addca15460a2a994e21692a3ffefSumir Katariaimport android.arch.background.workmanager.model.DependencyDao; 30969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagarimport android.arch.background.workmanager.model.WorkSpec; 31115eb6a640a0addca15460a2a994e21692a3ffefSumir Katariaimport android.arch.background.workmanager.model.WorkSpecDao; 323acfec58a69ade0e1a608fb56e2712188f1b7843Sumir Katariaimport android.arch.background.workmanager.worker.ExceptionTestWorker; 333acfec58a69ade0e1a608fb56e2712188f1b7843Sumir Katariaimport android.arch.background.workmanager.worker.SleepTestWorker; 343acfec58a69ade0e1a608fb56e2712188f1b7843Sumir Katariaimport android.arch.background.workmanager.worker.TestWorker; 35b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.content.Context; 36b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.InstrumentationRegistry; 37367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagarimport android.support.test.filters.LargeTest; 38b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.filters.SmallTest; 39b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport android.support.test.runner.AndroidJUnit4; 40b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 41b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport org.junit.After; 42b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport org.junit.Before; 43b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport org.junit.Test; 44b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagarimport org.junit.runner.RunWith; 459554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Katariaimport org.mockito.ArgumentCaptor; 46b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 47d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagarimport java.util.concurrent.Executors; 48d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 49b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar@RunWith(AndroidJUnit4.class) 509e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarinpublic class WorkerWrapperTest { 51dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar private static final long LISTENER_SLEEP_DURATION = 2000; 52b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar private WorkDatabase mDatabase; 53d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar private WorkSpecDao mWorkSpecDao; 546463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar private DependencyDao mDependencyDao; 55b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar private Context mContext; 56dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar private ExecutionListener mMockListener; 579554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria private Scheduler mMockScheduler; 58b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 59b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Before 6063ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar public void setUp() { 61b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar mContext = InstrumentationRegistry.getTargetContext(); 622ee405ffe5240d935a4dde7fe4581c96912a4166Sumir Kataria mDatabase = WorkDatabase.create(mContext, true); 63d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar mWorkSpecDao = mDatabase.workSpecDao(); 646463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar mDependencyDao = mDatabase.dependencyDao(); 659554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria mMockListener = mock(ExecutionListener.class); 669554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria mMockScheduler = mock(Scheduler.class); 67b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 68b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 69b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @After 70b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar public void tearDown() { 718ea588f4bc1498875f7d0ee3d5528aba4bf7049aJan Clarin mDatabase.close(); 72b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 73b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 74b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 75367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 76dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar public void testSuccess() throws InterruptedException { 77b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar Work work = new Work.Builder(TestWorker.class).build(); 78d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 79969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 80969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 81969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 82969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 83dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(LISTENER_SLEEP_DURATION); 849554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockListener).onExecuted(work.getId(), WorkerWrapper.RESULT_SUCCEEDED); 859e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarin assertThat(mWorkSpecDao.getWorkSpecStatus(work.getId()), is(Work.STATUS_SUCCEEDED)); 86b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 87b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 88b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 89367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 90367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testRunAttemptCountIncremented_successfulExecution() { 91367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar Work work = new Work.Builder(TestWorker.class).build(); 92367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 93367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 94367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .withListener(mMockListener) 95367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .build() 96367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .run(); 97367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getId()); 98367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar assertThat(latestWorkSpec.getRunAttemptCount(), is(1)); 99367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar } 100367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar 101367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @Test 102367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 103367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testRunAttemptCountIncremented_failedExecution() { 104367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar Work work = new Work.Builder(ExceptionTestWorker.class).build(); 105367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 106367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 107367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .withListener(mMockListener) 108367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .build() 109367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar .run(); 110367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getId()); 111367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar assertThat(latestWorkSpec.getRunAttemptCount(), is(1)); 112367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar } 113367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar 114367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @Test 115ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin @SmallTest 116ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin public void testRunAttemptCountIncremented_periodic_failedExecution() { 1173f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria PeriodicWork work = new PeriodicWork.Builder( 1183f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria ExceptionTestWorker.class, 1193f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria PeriodicWork.MIN_PERIODIC_INTERVAL_DURATION) 120ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .build(); 121ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 122ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 123ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 124ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .withListener(mMockListener) 125ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .build() 126ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .run(); 127ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin WorkSpec latestWorkSpec = mWorkSpecDao.getWorkSpec(work.getId()); 128ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin assertThat(latestWorkSpec.getRunAttemptCount(), is(1)); 129ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin } 130ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 131ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin @Test 132367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 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(); 139dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(LISTENER_SLEEP_DURATION); 1409554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockListener) 14163ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar .onExecuted(invalidWorkSpecId, WorkerWrapper.RESULT_PERMANENT_ERROR); 142b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 143b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 144b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 145367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 146dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar public void testNotEnqueued() throws InterruptedException { 147b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar Work work = new Work.Builder(TestWorker.class).build(); 148904ba12beeda5f75519b80f1b92d8f73401c1bf4Sumir Kataria work.getWorkSpec().setStatus(Work.STATUS_RUNNING); 149d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 150969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 151969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 152969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 153969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 154dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(LISTENER_SLEEP_DURATION); 1559554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockListener) 15663ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar .onExecuted(work.getId(), WorkerWrapper.RESULT_NOT_ENQUEUED); 157b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 158b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar 159b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar @Test 160367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 161dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar public void testPermanentErrorWithInvalidWorkerClass() throws InterruptedException { 162b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar Work work = new Work.Builder(TestWorker.class).build(); 163904ba12beeda5f75519b80f1b92d8f73401c1bf4Sumir Kataria work.getWorkSpec().setWorkerClassName("INVALID_CLASS_NAME"); 164d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 165969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 166969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 167969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 168969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 169dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(LISTENER_SLEEP_DURATION); 1709554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockListener).onExecuted(work.getId(), WorkerWrapper.RESULT_PERMANENT_ERROR); 1719e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarin assertThat(mWorkSpecDao.getWorkSpecStatus(work.getId()), is(Work.STATUS_FAILED)); 172b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar } 173d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 174d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar @Test 175367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 17663ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar public void testFailed() throws InterruptedException { 177d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar Work work = new Work.Builder(ExceptionTestWorker.class).build(); 178d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 179969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 180969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 181969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 182969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 183dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(LISTENER_SLEEP_DURATION); 1849554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockListener).onExecuted(work.getId(), WorkerWrapper.RESULT_FAILED); 1859e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarin assertThat(mWorkSpecDao.getWorkSpecStatus(work.getId()), is(Work.STATUS_FAILED)); 186d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar } 187d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar 188d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar @Test 189367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 19063ccec5104c970c3d93dd67c7f829d6a8cf8abbdXyan Bhatnagar public void testRunning() throws InterruptedException { 191d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar Work work = new Work.Builder(SleepTestWorker.class).build(); 192d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 193969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar WorkerWrapper wrapper = new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 194969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 195969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build(); 196d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar Executors.newSingleThreadExecutor().submit(wrapper); 197dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(LISTENER_SLEEP_DURATION); 1989e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarin assertThat(mWorkSpecDao.getWorkSpecStatus(work.getId()), is(Work.STATUS_RUNNING)); 199dc31aa85682ec4cb14784d393b4b70ff4da5d43dXyan Bhatnagar Thread.sleep(SleepTestWorker.SLEEP_DURATION); 2009554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockListener).onExecuted(work.getId(), WorkerWrapper.RESULT_SUCCEEDED); 201d7b783ea8f3a1e7fe1318681573a59bdf341b9dbXyan Bhatnagar } 2026463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar 2036463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar @Test 204367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 205367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar public void testDependencies() { 2065643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria Work prerequisiteWork = new Work.Builder(TestWorker.class).build(); 2075643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria Work work = new Work.Builder(TestWorker.class).withInitialStatus(STATUS_BLOCKED).build(); 2085643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria Dependency dependency = new Dependency(work.getId(), prerequisiteWork.getId()); 2095643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2105643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.beginTransaction(); 2115643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria try { 2125643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mWorkSpecDao.insertWorkSpec(prerequisiteWork.getWorkSpec()); 2135643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 2145643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDependencyDao.insertDependency(dependency); 2155643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.setTransactionSuccessful(); 2165643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria } finally { 2175643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria mDatabase.endTransaction(); 2185643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria } 2195643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2209e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarin assertThat(mWorkSpecDao.getWorkSpecStatus(prerequisiteWork.getId()), is(STATUS_ENQUEUED)); 2219e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarin assertThat(mWorkSpecDao.getWorkSpecStatus(work.getId()), is(STATUS_BLOCKED)); 222e89fa65672b38c2f8c80f0e89e592a0b175d24aeSumir Kataria assertThat(mDependencyDao.hasPrerequisites(work.getId()), is(true)); 2235643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2245643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria new WorkerWrapper.Builder(mContext, mDatabase, prerequisiteWork.getId()) 225969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .withListener(mMockListener) 2269554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria .withScheduler(mMockScheduler) 227969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .build() 228969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar .run(); 2295643e2e608bf406eaf6a8bc990b9bad7a7deb97dSumir Kataria 2309e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarin assertThat(mWorkSpecDao.getWorkSpecStatus(prerequisiteWork.getId()), is(STATUS_SUCCEEDED)); 2319e3c28e0e843b84a93cc6912ada4be871c10562dJan Clarin assertThat(mWorkSpecDao.getWorkSpecStatus(work.getId()), is(STATUS_ENQUEUED)); 232e89fa65672b38c2f8c80f0e89e592a0b175d24aeSumir Kataria assertThat(mDependencyDao.hasPrerequisites(work.getId()), is(false)); 2339554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria 2349554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria ArgumentCaptor<WorkSpec> captor = ArgumentCaptor.forClass(WorkSpec.class); 2359554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria verify(mMockScheduler).schedule(captor.capture()); 2369554b668dcde4dde34b5b273bea2e6f64a192ec8Sumir Kataria assertThat(captor.getValue().getId(), is(work.getId())); 2376463bebf1255dabbe9b5efd1c3be20e7dfd74551Xyan Bhatnagar } 238969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar 239969025c012f4a8bd7bccda7216d76fc4636590feXyan Bhatnagar @Test 240367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @LargeTest 241ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin public void testPeriodicWork() throws InterruptedException { 2423f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria PeriodicWork periodicWork = new PeriodicWork.Builder( 2433f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria TestWorker.class, 2443f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria PeriodicWork.MIN_PERIODIC_INTERVAL_DURATION) 245ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .build(); 246ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 247ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin final String periodicWorkId = periodicWork.getId(); 248ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin mWorkSpecDao.insertWorkSpec(periodicWork.getWorkSpec()); 249ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin new WorkerWrapper.Builder(mContext, mDatabase, periodicWorkId) 250ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .withListener(mMockListener) 251ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .build() 252ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin .run(); 253ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 254ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin Thread.sleep(LISTENER_SLEEP_DURATION); 255ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 256ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin WorkSpec periodicWorkSpecAfterFirstRun = mWorkSpecDao.getWorkSpec(periodicWorkId); 257ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin verify(mMockListener).onExecuted(periodicWorkId, WorkerWrapper.RESULT_SUCCEEDED); 258ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin assertThat(periodicWorkSpecAfterFirstRun.getRunAttemptCount(), is(0)); 259ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin assertThat(periodicWorkSpecAfterFirstRun.getStatus(), is(Work.STATUS_ENQUEUED)); 260ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin } 261ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin 262ee302e19355ede7dde7d607940d5bd686d164baeJan Clarin @Test 263367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar @SmallTest 264a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar public void testScheduler() throws InterruptedException { 265a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar Work work = new Work.Builder(TestWorker.class).build(); 266a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar mWorkSpecDao.insertWorkSpec(work.getWorkSpec()); 267a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar Scheduler mockScheduler = mock(Scheduler.class); 268a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar 269a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar new WorkerWrapper.Builder(mContext, mDatabase, work.getId()) 270a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar .withScheduler(mockScheduler) 271a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar .build() 272a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar .run(); 273a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar 274a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar verify(mockScheduler).schedule(); 275a1af78b16d275b98dd13f8df852d568f13c4ec0cXyan Bhatnagar } 276b8909f2c9c62261181e8270be8de44a69ac2b75fXyan Bhatnagar} 277