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