return schedule(baseBuilder, true, startMs, endMs, false);
/** * Helper method to schedule a daily job on a background thread. This is helpful to avoid IO operations * on the main thread. For more information about scheduling daily jobs see {@link #schedule(JobRequest.Builder, long, long)}. * * <br> * <br> * * In case of a failure an error is logged, but the application doesn't crash. */ public static void scheduleAsync(@NonNull JobRequest.Builder baseBuilder, long startMs, long endMs) { scheduleAsync(baseBuilder, startMs, endMs, JobRequest.DEFAULT_JOB_SCHEDULED_CALLBACK); }
if (meetsRequirements(true)) { result = onRunDailyJob(params); } else { int newJobId = schedule(request.createBuilder(), false, extras.getLong(EXTRA_START_MS, 0) % DAY, extras.getLong(EXTRA_END_MS, 0L) % DAY, true);
@Test public void verifyScheduledImmediatelyIsNotOverridden() { long time = 1L; DailyJob.startNowOnce(DummyJobs.createBuilder(DummyJobs.SuccessJob.class)); DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), time, time); Set<JobRequest> requests = manager().getAllJobRequests(); assertThat(requests).hasSize(2); for (JobRequest request : requests) { assertThat(request.getTag()).isEqualTo(DummyJobs.SuccessJob.TAG); } }
if (meetsRequirements(true)) { result = onRunDailyJob(params); } else { int newJobId = schedule(request.createBuilder(), false, extras.getLong(EXTRA_START_MS, 0) % DAY, extras.getLong(EXTRA_END_MS, 0L) % DAY, true);
@Test public void verifyImmediateExecution() { long time = 1L; int nowJobId = DailyJob.startNowOnce(DummyJobs.createBuilder(DummyJobs.SuccessJob.class)); int normalJobId = DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), time, time); assertThat(manager().getAllJobRequests()).hasSize(2); executeJob(nowJobId, Job.Result.SUCCESS); assertThat(manager().getAllJobRequests()).hasSize(1); assertThat(manager().getJobRequest(normalJobId)).isNotNull(); }
@Override public void run() { try { int jobId = schedule(baseBuilder, startMs, endMs); callback.onJobScheduled(jobId, baseBuilder.mTag, null); } catch (Exception e) { callback.onJobScheduled(JobRequest.JobScheduledCallback.JOB_ID_ERROR, baseBuilder.mTag, e); } } });
@Test public void verifyErrorAsyncDailyJob() throws Exception { JobConfig.setClock(new TestClock()); JobScheduler jobScheduler = mock(JobScheduler.class); when(jobScheduler.schedule(any(JobInfo.class))).thenThrow(new RuntimeException("test")); when(context().getSystemService(Context.JOB_SCHEDULER_SERVICE)).thenReturn(jobScheduler); final AtomicReference<Exception> reference = new AtomicReference<>(); DailyJob.scheduleAsync(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), 1000, 2000, new JobRequest.JobScheduledCallback() { @Override public void onJobScheduled(int jobId, @NonNull String tag, @Nullable Exception exception) { assertThat(jobId).isEqualTo(JOB_ID_ERROR); reference.set(exception); } }); waitUntilScheduled(); assertThat(reference.get()).isInstanceOf(RuntimeException.class); }
@Test(expected = IllegalArgumentException.class) public void verifyTooLargeValue() { long start = TimeUnit.HOURS.toMillis(24); long end = 1L; DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), start, end); }
@Test public void verifyJobIdAsyncDailyJob() throws Exception { JobConfig.setClock(new TestClock()); final AtomicInteger jobId = new AtomicInteger(-2); DailyJob.scheduleAsync(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), 1000, 2000, new JobRequest.JobScheduledCallback() { @Override public void onJobScheduled(int id, @NonNull String tag, @Nullable Exception exception) { jobId.set(id); } }); waitUntilScheduled(); assertThat(manager().getJobRequest(jobId.get())).isNotNull(); }
private void verifyScheduleInNextHour(Clock clock) { JobConfig.setClock(clock); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(clock.currentTimeMillis()); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); long start = TimeUnit.HOURS.toMillis(hour + 1) + TimeUnit.MINUTES.toMillis(minute); long end = start + TimeUnit.HOURS.toMillis(1); DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), start, end); assertThat(manager().getAllJobRequests()).hasSize(1); JobRequest request = manager().getAllJobRequests().iterator().next(); assertThat(request.getStartMs()).isEqualTo(TimeUnit.HOURS.toMillis(1)); assertThat(request.getEndMs()).isEqualTo(TimeUnit.HOURS.toMillis(2)); }
/** * Helper method to schedule a daily job on a background thread. This is helpful to avoid IO operations * on the main thread. For more information about scheduling daily jobs see {@link #schedule(JobRequest.Builder, long, long)}. * * <br> * <br> * * In case of a failure an error is logged, but the application doesn't crash. */ public static void scheduleAsync(@NonNull JobRequest.Builder baseBuilder, long startMs, long endMs) { scheduleAsync(baseBuilder, startMs, endMs, JobRequest.DEFAULT_JOB_SCHEDULED_CALLBACK); }
@Test public void verifyScheduledTwiceOverridesExisting() { long time = 1L; DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), time, time); DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), time, time); Set<JobRequest> requests = manager().getAllJobRequests(); assertThat(requests).hasSize(1); assertThat(requests.iterator().next().getTag()).isEqualTo(DummyJobs.SuccessJob.TAG); }
@SuppressWarnings("ConstantConditions") @Test public void verifyEarlyExecution() { TestClock clock = new TestClock(); clock.setTime(13, 0); JobRequest request = verifyExecutionAndSuccessfulReschedule(clock, TimeUnit.HOURS.toMillis(14), TimeUnit.HOURS.toMillis(15)); assertThat(request.getStartMs()).isEqualTo(TimeUnit.HOURS.toMillis(25)); assertThat(request.getEndMs()).isEqualTo(TimeUnit.HOURS.toMillis(26)); int id = DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessDailyJob.class), TimeUnit.HOURS.toMillis(14), TimeUnit.HOURS.toMillis(15)); request = manager().getJobRequest(id); assertThat(request.getStartMs()).isEqualTo(TimeUnit.HOURS.toMillis(1)); assertThat(request.getEndMs()).isEqualTo(TimeUnit.HOURS.toMillis(2)); }
@Test public void verifyDailyJobIsNotExact() { long time = 1L; int jobId = DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), time, time); JobRequest request = manager().getJobRequest(jobId); assertThat(request).isNotNull(); assertThat(request.isExact()).isFalse(); }
private void verifyScheduleOverMidnight(Clock clock) { JobConfig.setClock(clock); long start = TimeUnit.HOURS.toMillis(24) - 1L; long end = 1L; DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), start, end); assertThat(manager().getAllJobRequests()).hasSize(1); JobRequest request = manager().getAllJobRequests().iterator().next(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(clock.currentTimeMillis()); int hour = calendar.get(Calendar.HOUR_OF_DAY); long maxStart = TimeUnit.HOURS.toMillis(24 - hour); assertThat(request.getStartMs()).isLessThan(maxStart); assertThat(request.getEndMs()).isLessThan(maxStart + 3); }
@Test public void verifyHasExtras() { long start = 0; long end = 1L; int jobId = DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), start, end); JobRequest request = manager().getJobRequest(jobId); assertThat(request).isNotNull(); assertThat(request.getExtras().getLong(DailyJob.EXTRA_START_MS, -1)).isEqualTo(0L); assertThat(request.getExtras().getLong(DailyJob.EXTRA_END_MS, -1)).isEqualTo(1L); assertThat(request.getExtras().size()).isEqualTo(2); }
@Test public void verifyNotFoundJobCanceledDailyJob() { final String tag = "something"; int jobId = DailyJob.schedule(new JobRequest.Builder(tag), TimeUnit.HOURS.toMillis(5), TimeUnit.HOURS.toMillis(6)); assertThat(manager().getAllJobRequestsForTag(tag)).hasSize(1); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getAllJobRequestsForTag(tag)).isEmpty(); }
@Test public void verifyScheduledAtMidnight() { long start = 0; long end = 1L; DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), start, end); assertThat(manager().getAllJobRequests()).hasSize(1); }
private JobRequest verifyExecutionAndSuccessfulReschedule(Clock clock, long start, long end) { JobConfig.setClock(clock); int jobId = DailyJob.schedule(DummyJobs.createBuilder(DummyJobs.SuccessDailyJob.class), start, end); assertThat(jobId).isEqualTo(1); executeJob(jobId, Job.Result.SUCCESS); assertThat(manager().getAllJobRequests()).hasSize(1); JobRequest newRequest = manager().getJobRequest(jobId + 1); assertThat(newRequest).isNotNull(); return newRequest; }