/*package*/ JobRequest reschedule(boolean failure, boolean newJob) { JobRequest newRequest = new Builder(this.mBuilder, newJob).build(); if (failure) { newRequest.mFailureCount = mFailureCount + 1; } try { newRequest.schedule(); } catch (Exception e) { CAT.e(e); // this may crash (e.g. more than 100 jobs with JobScheduler), but it's not catchable for the user, wait for reschedule } return newRequest; }
/** * Schedules the daily job only once and runs it immediately. This is helpful if you want to reuse your job * and want to trigger the execution immediately. It's possible to schedule a daily job normally with * {@link #schedule(JobRequest.Builder, long, long)} and this method at the same time to trigger the * execution immediately. * * @param baseBuilder The builder of your daily job. * @return The unique ID for this job. */ public static int startNowOnce(@NonNull JobRequest.Builder baseBuilder) { PersistableBundleCompat extras = new PersistableBundleCompat(); extras.putBoolean(EXTRA_ONCE, true); return baseBuilder .startNow() .addExtras(extras) .build() .schedule(); }
@Test(expected = SQLException.class) public void testInsertFails() { SQLiteDatabase database = mock(SQLiteDatabase.class); when(database.insert(anyString(), nullable(String.class), any(ContentValues.class))).thenReturn(-1L); when(database.insertWithOnConflict(anyString(), nullable(String.class), any(ContentValues.class), anyInt())).thenThrow(SQLException.class); manager().getJobStorage().injectDatabase(database); DummyJobs.createOneOff().schedule(); }
@Test public void testTransientExtras() { Bundle extras = new Bundle(); extras.putInt("key", 5); JobRequest.Builder builder = new JobRequest.Builder(TAG) .setExecutionWindow(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(5)) .setTransientExtras(extras); int jobId = builder.build().schedule(); Bundle bundle = TransientBundleHolder.getBundle(jobId); assertThat(bundle).isNotNull(); assertThat(bundle.getInt("key")).isEqualTo(5); mWorkManagerRule.getManager().cancel(jobId); assertThat(TransientBundleHolder.getBundle(jobId)).isNull(); jobId = builder.build().schedule(); mWorkManagerRule.runJob(JobProxyWorkManager.createTag(jobId)); assertThat(TransientBundleHolder.getBundle(jobId)).isNull(); }
@Test public void testCancel() { int jobId = new JobRequest.Builder(TAG) .setExecutionWindow(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(5)) .build() .schedule(); JobRequest request = mWorkManagerRule.getManager().getJobRequest(jobId); JobProxyWorkManager jobProxyWorkManager = new JobProxyWorkManager(InstrumentationRegistry.getTargetContext()); assertThat(jobProxyWorkManager.isPlatformJobScheduled(request)).isTrue(); String tag = JobProxyWorkManager.createTag(jobId); List<WorkInfo> statuses = mWorkManagerRule.getWorkStatus(tag); assertThat(statuses).isNotNull().hasSize(1); assertThat(statuses.get(0).getState()).isEqualTo(WorkInfo.State.ENQUEUED); mWorkManagerRule.getManager().cancel(jobId); assertThat(mWorkManagerRule.getWorkStatus(tag).get(0).getState()).isEqualTo(WorkInfo.State.CANCELLED); assertThat(jobProxyWorkManager.isPlatformJobScheduled(request)).isFalse(); }
@Override public void createPeriodic() { for (int i = 0; i < 10; i++) { JobRequest.Builder builder = new JobRequest.Builder("tag") .setPeriodic(TimeUnit.MINUTES.toMillis(1)) .setRequiresCharging(random()) .setRequiresDeviceIdle(random()) .setRequiredNetworkType(random() ? JobRequest.NetworkType.ANY : JobRequest.NetworkType.CONNECTED) .setRequirementsEnforced(random()); if (random()) { PersistableBundleCompat extras = new PersistableBundleCompat(); extras.putString("key", "Hello world"); builder.setExtras(extras); } builder.build().schedule(); } } }
@Test public void testPeriodicJobNotInStartedState() throws Throwable { int jobId = DummyJobs.createBuilder(DummyJobs.TwoSecondPauseJob.class) .setPeriodic(TimeUnit.MINUTES.toMillis(15)) .build() .schedule(); executeJobAsync(jobId, Job.Result.SUCCESS); // wait until the job is started Thread.sleep(100); // request should be in started state, running but not removed from DB JobRequest startedRequest = manager().getJobRequest(jobId, true); assertThat(startedRequest).isNotNull(); assertThat(startedRequest.isStarted()).isFalse(); }
private void testPeriodic() { mLastJobId = new JobRequest.Builder(DemoSyncJob.TAG) .setPeriodic(JobRequest.MIN_INTERVAL, JobRequest.MIN_FLEX) .setRequiresCharging(mRequiresCharging.isChecked()) .setRequiresDeviceIdle(mRequiresDeviceIdle.isChecked()) .setRequiredNetworkType(JobRequest.NetworkType.values()[mNetworkTypeSpinner.getSelectedItemPosition()]) .build() .schedule(); }
@Test public void testStartNow() throws Exception { mJob = new TestJob(PlatformAlarmService.class); new JobRequest.Builder("tag") .startNow() .build() .schedule(); mJob.verifyJob(3, TimeUnit.SECONDS); }
@Test public void testPeriodicJob() throws Exception { int jobId = DummyJobs.createBuilder(DummyJobs.SuccessJob.class) .setPeriodic(TimeUnit.MINUTES.toMillis(15)) .build() .schedule(); executeJob(jobId, Job.Result.SUCCESS); // make sure job request is still around assertThat(manager().getAllJobRequestsForTag(DummyJobs.SuccessJob.TAG)).hasSize(1); }
@Test public void verifyPendingRequestNullWhenMarkedStated() { final int jobId = DummyJobs.createBuilder(DummyJobs.SuccessJob.class) .setPeriodic(TimeUnit.MINUTES.toMillis(15)) .build() .schedule(); final JobProxy.Common common = new JobProxy.Common(context(), TestLogger.INSTANCE, jobId); assertThat(common.getPendingRequest(true, false)).isNotNull(); assertThat(common.getPendingRequest(true, false)).isNotNull(); JobRequest request = common.getPendingRequest(true, false); assertThat(request).isNotNull(); common.markStarting(request); assertThat(common.getPendingRequest(true, false)).isNull(); }
@Test public void incrementPeriodicJobFailureCount() { int jobId = DummyJobs.createBuilder(DummyJobs.FailureJob.class) .setPeriodic(TimeUnit.MINUTES.toMillis(15)) .build() .schedule(); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getJobRequest(jobId).getFailureCount()).isEqualTo(1); resetJob(jobId); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getJobRequest(jobId).getFailureCount()).isEqualTo(2); }
@Test public void testStartNow() throws Exception { mJob = new TestJob(); new JobRequest.Builder("tag") .startNow() .setTransientExtras(createTransientBundle()) .build() .schedule(); mJob.verifyJob(3, TimeUnit.SECONDS); }
@Test @Config(sdk = Build.VERSION_CODES.M) public void verifyNotFoundJobCanceledPeriodicFlexSupport() { final String tag = "something"; final int jobId = new JobRequest.Builder(tag) .setPeriodic(TimeUnit.HOURS.toMillis(4)) .build() .schedule(); assertThat(manager().getAllJobRequestsForTag(tag)).hasSize(1); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getAllJobRequestsForTag(tag)).isEmpty(); } }
@Test public void verifyNotFoundJobCanceledOneOff() { final String tag = "something"; final int jobId = new JobRequest.Builder(tag) .setExecutionWindow(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(5)) .build() .schedule(); assertThat(manager().getAllJobRequestsForTag(tag)).hasSize(1); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getAllJobRequestsForTag(tag)).isEmpty(); }
@Test public void testSameIdAfterCancel() { JobRequest request = DummyJobs.createOneOff(); int jobId = request.getJobId(); assertThat(request.getScheduledAt()).isEqualTo(0L); manager().schedule(request); assertThat(request.getScheduledAt()).isGreaterThan(0L); JobRequest requestNew = request.cancelAndEdit().build(); assertThat(request.getScheduledAt()).isEqualTo(0L); int newId = requestNew.schedule(); assertThat(newId).isEqualTo(jobId); assertThat(request.getScheduledAt()).isEqualTo(0L); assertThat(requestNew.getScheduledAt()).isGreaterThan(0L); }
@Test public void verifyNotFoundJobCanceledExact() { final String tag = "something"; final int jobId = new JobRequest.Builder(tag) .setExact(TimeUnit.HOURS.toMillis(4)) .build() .schedule(); assertThat(manager().getAllJobRequestsForTag(tag)).hasSize(1); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getAllJobRequestsForTag(tag)).isEmpty(); }
@Test public void verifyNotFoundJobCanceledPeriodic() { final String tag = "something"; final int jobId = new JobRequest.Builder(tag) .setPeriodic(TimeUnit.HOURS.toMillis(4)) .build() .schedule(); assertThat(manager().getAllJobRequestsForTag(tag)).hasSize(1); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getAllJobRequestsForTag(tag)).isEmpty(); }
private void testPeriodicJob(Class<? extends Job> clazz, Job.Result result) throws Exception { int jobId = DummyJobs.createBuilder(clazz) .setPeriodic(TimeUnit.MINUTES.toMillis(15)) .build() .schedule(); assertThat(manager().getJobRequest(jobId).getLastRun()).isEqualTo(0); executeJob(jobId, result); long lastRun = manager().getJobRequest(jobId).getLastRun(); assertThat(lastRun).isGreaterThan(0); Thread.sleep(2L); resetJob(jobId); executeJob(jobId, result); assertThat(manager().getJobRequest(jobId).getLastRun()).isGreaterThan(lastRun); }
@Test public void testScheduleAndCancel() { JobRequest request = DummyJobs.createOneOff(); int jobId = request.schedule(); assertThat(manager().getJobRequest(jobId)).isNotNull(); assertThat(manager().getJob(jobId)).isNull(); assertThat(manager().cancel(jobId)).isTrue(); assertThat(manager().getAllJobRequests()).isEmpty(); assertThat(manager().getAllJobs()).isEmpty(); request.schedule(); assertThat(manager().getAllJobRequests()).hasSize(1); assertThat(manager().cancelAll()).isEqualTo(1); assertThat(manager().getAllJobRequests()).isEmpty(); assertThat(manager().getAllJobs()).isEmpty(); }