13f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria/*
2564e43098c323d1a90be53c190b8fdbdde973505Sumir Kataria * Copyright 2018 The Android Open Source Project
33f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria *
43f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria * Licensed under the Apache License, Version 2.0 (the "License");
53f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria * you may not use this file except in compliance with the License.
63f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria * You may obtain a copy of the License at
73f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria *
83f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria *      http://www.apache.org/licenses/LICENSE-2.0
93f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria *
103f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria * Unless required by applicable law or agreed to in writing, software
113f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria * distributed under the License is distributed on an "AS IS" BASIS,
123f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria * See the License for the specific language governing permissions and
143f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria * limitations under the License.
153f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria */
16564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariapackage androidx.work;
173f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria
183f630c934df9af951f5b209ac98892a840f9aa97Sumir Katariaimport static org.hamcrest.CoreMatchers.is;
193f630c934df9af951f5b209ac98892a840f9aa97Sumir Katariaimport static org.hamcrest.MatcherAssert.assertThat;
203f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria
219598ea6e2427580e555919657530dc18d237c962Rahul Ravikumarimport android.support.test.filters.SdkSuppress;
223f630c934df9af951f5b209ac98892a840f9aa97Sumir Katariaimport android.support.test.filters.SmallTest;
23b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagarimport android.support.test.runner.AndroidJUnit4;
243f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria
2531099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Katariaimport androidx.work.worker.TestWorker;
2631099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
278c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagarimport org.junit.Rule;
283f630c934df9af951f5b209ac98892a840f9aa97Sumir Katariaimport org.junit.Test;
298c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagarimport org.junit.rules.ExpectedException;
30b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagarimport org.junit.runner.RunWith;
313f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria
3211c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Katariaimport java.time.Duration;
33f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Katariaimport java.util.concurrent.TimeUnit;
34f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria
35b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar@RunWith(AndroidJUnit4.class)
361cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Katariapublic class PeriodicWorkTest extends WorkManagerTest {
373f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria
388c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar    @Rule
398c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar    public ExpectedException mThrown = ExpectedException.none();
408c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar
418c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar    @Test
428c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar    @SmallTest
439598ea6e2427580e555919657530dc18d237c962Rahul Ravikumar    @SdkSuppress(minSdkVersion = 23)
448c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar    public void testBuild_backoffAndIdleMode_throwsIllegalArgumentException() {
458c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar        mThrown.expect(IllegalArgumentException.class);
468b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        new PeriodicWorkRequest.Builder(
47f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TestWorker.class,
488b3284fa4a62568df91f706b0b2334284794008fSumir Kataria                PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
49f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS)
5062a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria                .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 20000, TimeUnit.MILLISECONDS)
5162a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria                .setConstraints(new Constraints.Builder()
528c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar                        .setRequiresDeviceIdle(true)
538c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar                        .build())
548c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar                .build();
558c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar    }
568c3896ff33ff4bcaead192786334f63ba609bc41Xyan Bhatnagar
57b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    @Test
58b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    @SmallTest
59b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    public void testBuild_setPeriodic_onlyIntervalDuration_inRange() {
608b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testInterval = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS + 123L;
618b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
62f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TestWorker.class,
63f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testInterval,
64f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS)
65f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                .build();
66b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).intervalDuration, is(testInterval));
67b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).flexDuration, is(testInterval));
68b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    }
69b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar
70b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    @Test
71b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    @SmallTest
72b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    public void testBuild_setPeriodic_onlyIntervalDuration_outOfRange() {
738b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testInterval = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS - 123L;
748b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
75f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TestWorker.class,
76f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testInterval,
77f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS)
78f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                .build();
79b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).intervalDuration,
808b3284fa4a62568df91f706b0b2334284794008fSumir Kataria                is(PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS));
81b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).flexDuration,
828b3284fa4a62568df91f706b0b2334284794008fSumir Kataria                is(PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS));
83b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    }
843f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria
853f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria    @Test
86b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    @SmallTest
87b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    public void testBuild_setPeriodic_intervalAndFlexDurations_inRange() {
888b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testInterval = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS + 123L;
898b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testFlex = PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS + 123L;
908b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
91f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TestWorker.class,
92f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testInterval,
93f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS,
94f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testFlex,
95f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS)
96f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                .build();
97b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).intervalDuration, is(testInterval));
98b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).flexDuration, is(testFlex));
993f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria    }
1003f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria
1013f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria    @Test
102b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    @SmallTest
103b48877ff951dc9617cd6a923f73bcfae8ad243c7Xyan Bhatnagar    public void testBuild_setPeriodic_intervalAndFlexDurations_outOfRange() {
1048b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testInterval = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS - 123L;
1058b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testFlex = PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS - 123L;
1068b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
107f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TestWorker.class,
108f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testInterval,
109f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS,
110f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testFlex,
111f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS)
112f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                .build();
113b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).intervalDuration,
1148b3284fa4a62568df91f706b0b2334284794008fSumir Kataria                is(PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS));
115b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).flexDuration,
1168b3284fa4a62568df91f706b0b2334284794008fSumir Kataria                is(PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS));
1173f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria    }
11860c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar
11960c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar    @Test
12060c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar    @SmallTest
12160c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar    public void testBuild_setPeriodic_intervalInRange_flexOutOfRange() {
1228b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testInterval = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS + 123L;
1238b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testFlex = PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS - 123L;
1248b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
125f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TestWorker.class,
126f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testInterval,
127f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS,
128f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testFlex,
129f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS)
130f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                .build();
131b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).intervalDuration, is(testInterval));
132b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).flexDuration,
1338b3284fa4a62568df91f706b0b2334284794008fSumir Kataria                is(PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS));
13460c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar    }
13560c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar
13660c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar    @Test
13760c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar    @SmallTest
13860c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar    public void testBuild_setPeriodic_intervalOutOfRange_flexInRange() {
1398b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testInterval = PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS - 123L;
1408b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        long testFlex = PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS + 123L;
1418b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
142f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TestWorker.class,
143f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testInterval,
144f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS,
145f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                testFlex,
146f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                TimeUnit.MILLISECONDS)
147f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                .build();
148b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).intervalDuration,
1498b3284fa4a62568df91f706b0b2334284794008fSumir Kataria                is(PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS));
150b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        assertThat(getWorkSpec(periodicWork).flexDuration, is(testFlex));
15160c959c104a73c75a2867a71b23aa2d45f49be30Xyan Bhatnagar    }
15211c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria
15311c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria    @Test
15411c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria    @SmallTest
15511c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria    @SdkSuppress(minSdkVersion = 26)
15611c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria    public void testBuild_setPeriodic_withDurationParameters() {
15711c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        Duration repeatInterval = Duration.ofDays(2).plusHours(3);
15811c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        Duration flexInterval = Duration.ofHours(1).plusMinutes(2);
15911c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
16011c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria                TestWorker.class,
16111c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria                repeatInterval,
16211c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria                flexInterval)
16311c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria                .build();
16411c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        assertThat(
16511c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria                getWorkSpec(periodicWork).intervalDuration,
16611c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria                is(TimeUnit.HOURS.toMillis((2 * 24) + 3)));
16711c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        assertThat(
16811c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria                getWorkSpec(periodicWork).flexDuration,
16911c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria                is(TimeUnit.MINUTES.toMillis((1 * 60) + 2)));
17011c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria    }
1713f630c934df9af951f5b209ac98892a840f9aa97Sumir Kataria}
172