blob: 6dd23cbfa81d1e336469cc61c444db3aded9aab3 [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.work;
import static androidx.work.State.BLOCKED;
import static androidx.work.State.FAILED;
import static androidx.work.State.SUCCEEDED;
import static androidx.work.impl.Scheduler.MAX_SCHEDULER_LIMIT;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.work.impl.model.WorkSpec;
import androidx.work.impl.model.WorkSpecDao;
import androidx.work.worker.TestWorker;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.List;
import java.util.concurrent.TimeUnit;
@RunWith(AndroidJUnit4.class)
public class WorkSpecDaoTest extends DatabaseTest {
@Test
@SmallTest
public void testEligibleWorkSpecsForScheduling() {
long startTime = System.currentTimeMillis();
OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(TestWorker.class)
.setPeriodStartTime(
startTime + TimeUnit.HOURS.toMillis(1),
TimeUnit.MILLISECONDS)
.build();
OneTimeWorkRequest succeeded = new OneTimeWorkRequest.Builder(TestWorker.class)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.setInitialState(SUCCEEDED)
.build();
OneTimeWorkRequest scheduled = new OneTimeWorkRequest.Builder(TestWorker.class)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.build();
OneTimeWorkRequest enqueued = new OneTimeWorkRequest.Builder(TestWorker.class)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.build();
insertWork(work);
insertWork(succeeded);
insertWork(scheduled);
insertWork(enqueued);
WorkSpecDao workSpecDao = mDatabase.workSpecDao();
// Treat the scheduled request as previously scheduled
workSpecDao.markWorkSpecScheduled(scheduled.getStringId(), System.currentTimeMillis());
List<WorkSpec> eligibleWorkSpecs =
workSpecDao.getEligibleWorkForScheduling(MAX_SCHEDULER_LIMIT);
assertThat(eligibleWorkSpecs.size(), equalTo(2));
assertThat(eligibleWorkSpecs,
containsInAnyOrder(work.getWorkSpec(), enqueued.getWorkSpec()));
}
@Test
@SmallTest
public void testScheduledWorkSpecCount() {
WorkSpecDao workSpecDao = mDatabase.workSpecDao();
long startTime = System.currentTimeMillis();
OneTimeWorkRequest enqueued = new OneTimeWorkRequest.Builder(TestWorker.class)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.build();
OneTimeWorkRequest succeeded = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.setInitialState(SUCCEEDED)
.build();
OneTimeWorkRequest failed = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.setInitialState(FAILED)
.build();
insertWork(enqueued);
insertWork(succeeded);
insertWork(failed);
List<WorkSpec> eligibleWorkSpecs =
workSpecDao.getEligibleWorkForScheduling(MAX_SCHEDULER_LIMIT);
assertThat(eligibleWorkSpecs, notNullValue());
assertThat(eligibleWorkSpecs.size(), is(1));
assertThat(eligibleWorkSpecs, containsInAnyOrder(enqueued.getWorkSpec()));
}
@Test
@SmallTest
public void testAlreadyScheduledWorkIsNotRescheduled() {
WorkSpecDao workSpecDao = mDatabase.workSpecDao();
long startTime = System.currentTimeMillis();
OneTimeWorkRequest enqueued = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS) // already scheduled
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.build();
OneTimeWorkRequest succeeded = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.setInitialState(SUCCEEDED)
.build();
OneTimeWorkRequest failed = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.setInitialState(FAILED)
.build();
insertWork(enqueued);
insertWork(succeeded);
insertWork(failed);
List<WorkSpec> eligibleWorkSpecs =
workSpecDao.getEligibleWorkForScheduling(MAX_SCHEDULER_LIMIT);
assertThat(eligibleWorkSpecs, notNullValue());
assertThat(eligibleWorkSpecs.size(), is(0));
}
@Test
@SmallTest
public void testResetScheduledState() {
WorkSpecDao workSpecDao = mDatabase.workSpecDao();
long startTime = System.currentTimeMillis();
OneTimeWorkRequest enqueued = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.build();
OneTimeWorkRequest succeeded = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.setInitialState(SUCCEEDED)
.build();
OneTimeWorkRequest blocked = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.setInitialState(BLOCKED)
.build();
OneTimeWorkRequest failed = new OneTimeWorkRequest.Builder(TestWorker.class)
.setScheduleRequestedAt(startTime, TimeUnit.MILLISECONDS)
.setPeriodStartTime(startTime, TimeUnit.MILLISECONDS)
.setInitialState(FAILED)
.build();
insertWork(enqueued);
workSpecDao.markWorkSpecScheduled(enqueued.getStringId(), startTime);
insertWork(succeeded);
insertWork(failed);
insertWork(blocked);
workSpecDao.resetScheduledState();
List<WorkSpec> eligibleWorkSpecs =
workSpecDao.getEligibleWorkForScheduling(MAX_SCHEDULER_LIMIT);
assertThat(eligibleWorkSpecs.size(), is(1));
// Not using contains in any order as the scheduleRequestedAt changes post reset.
assertThat(eligibleWorkSpecs.get(0).id, is(enqueued.getStringId()));
}
}