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