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