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