@Test public void testConstraintsPeriodic() { testConstraints(new JobRequest.Builder(TAG) .setPeriodic(TimeUnit.HOURS.toMillis(4), TimeUnit.HOURS.toMillis(2)) ); }
@Test public void verifyAlarmNotCanceledForPeriodicAfterStart() throws Exception { assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP); JobConfig.forceApi(JobApi.V_21); Bundle extras = new Bundle(); extras.putString("key", "value"); int jobId = new JobRequest.Builder("tag") .setPeriodic(TimeUnit.DAYS.toMillis(1)) .setTransientExtras(extras) .build() .schedule(); assertThat(mJobManagerRule.getAllPendingJobsFromScheduler()).isNotNull().isNotEmpty(); JobRequest request = mJobManagerRule.getManager().getJobRequest(jobId); assertThat(request.isTransient()).isTrue(); final Intent intent = PlatformAlarmServiceExact.createIntent(context(), jobId, null); PendingIntent pendingIntent = PendingIntent.getService(context(), jobId, intent, PendingIntent.FLAG_NO_CREATE); assertThat(pendingIntent).isNotNull(); boolean started = TransientBundleCompat.startWithTransientBundle(context(), request); assertThat(started).isTrue(); pendingIntent = PendingIntent.getService(context(), jobId, intent, PendingIntent.FLAG_NO_CREATE); assertThat(pendingIntent).isNotNull(); }
@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 manageUnified(boolean start) { if (start) { final JobRequest.Builder b= new JobRequest.Builder(DemoUnifiedJob.JOB_TAG); PersistableBundleCompat extras=new PersistableBundleCompat(); if (download.isChecked()) { extras.putBoolean(KEY_DOWNLOAD, true); b .setExtras(extras) .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED); } else { b.setRequiredNetworkType(JobRequest.NetworkType.ANY); } b .setPeriodic(getPeriod()) .setRequiresCharging(false) .setRequiresDeviceIdle(true); unifiedJobId=b.build().schedule(); } else { JobManager.instance().cancel(unifiedJobId); } }
@Test public void testPeriodic() { long interval = JobRequest.MIN_INTERVAL * 5; JobRequest request = getBuilder() .setPeriodic(interval) .setExtras(new PersistableBundleCompat()) .build(); assertThat(request.getJobId()).isGreaterThan(0); assertThat(request.getTag()).isEqualTo(DummyJobs.SuccessJob.TAG); assertThat(request.getIntervalMs()).isEqualTo(interval); assertThat(request.getFlexMs()).isEqualTo(interval); assertThat(request.isPeriodic()).isTrue(); assertThat(request.isFlexSupport()).isFalse(); assertThat(request.getStartMs()).isNegative(); assertThat(request.getEndMs()).isNegative(); assertThat(request.getBackoffMs()).isEqualTo(JobRequest.DEFAULT_BACKOFF_MS); assertThat(request.getBackoffPolicy()).isEqualTo(JobRequest.DEFAULT_BACKOFF_POLICY); assertThat(request.getExtras()).isNotNull(); assertThat(request.isExact()).isFalse(); assertThat(request.requiredNetworkType()).isEqualTo(JobRequest.DEFAULT_NETWORK_TYPE); assertThat(request.requirementsEnforced()).isFalse(); assertThat(request.requiresCharging()).isFalse(); assertThat(request.requiresDeviceIdle()).isFalse(); }
@Override public void createPeriodic() { for (int i = 0; i < 10; i++) { JobRequest.Builder builder = new JobRequest.Builder("tag") .setRequiresCharging(random()) .setRequiresDeviceIdle(random()) .setRequiresBatteryNotLow(random()) .setRequiresStorageNotLow(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); } if (random()) { builder.setPeriodic(JobRequest.MIN_INTERVAL); } else { builder.setPeriodic(JobRequest.MIN_INTERVAL, JobRequest.MIN_FLEX); } builder.build().schedule(); } } } }
@Override public void createPeriodic() { for (int i = 0; i < 10; i++) { JobRequest.Builder builder = new JobRequest.Builder("tag") .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); } if (random()) { builder.setPeriodic(JobRequest.MIN_INTERVAL); } else { builder.setPeriodic(JobRequest.MIN_INTERVAL, JobRequest.MIN_FLEX); } builder.build().schedule(); } } }
@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 @Config(sdk = 21) public void verifyPeriodicJobRescheduled() throws Exception { assertThat(manager().getAllJobRequests()).isEmpty(); ContentValues contentValues = new JobRequest.Builder("tag") .setPeriodic(TimeUnit.HOURS.toMillis(1)) .build() .toContentValues(); manager().getJobStorage().getDatabase() .insert(JobStorage.JOB_TABLE_NAME, null, contentValues); Set<JobRequest> requests = manager().getAllJobRequests(); assertThat(requests).isNotEmpty(); JobScheduler scheduler = (JobScheduler) context().getSystemService(Context.JOB_SCHEDULER_SERVICE); assertThat(scheduler.getAllPendingJobs()).isEmpty(); int rescheduledJobs = new JobRescheduleService().rescheduleJobs(manager()); assertThat(rescheduledJobs).isEqualTo(1); }
/** * Specify that this job should recur with the provided interval, not more than once per period. As * default a job isn't periodic. * * <br> * <br> * * It isn't allowed to specify a time window for a periodic job. Instead you set an interval * with this function. Since {@link Job.Result#RESCHEDULE} is ignored for periodic jobs, * setting a back-off criteria is illegal as well. * * @param intervalMs The job should run at most once every {@code intervalMs}. The minimum value is {@code 15min}. */ public Builder setPeriodic(long intervalMs) { return setPeriodic(intervalMs, intervalMs); }
@Test public void testFlex() { JobConfig.forceApi(JobApi.V_14); long interval = JobRequest.MIN_INTERVAL * 5; long flex = JobRequest.MIN_FLEX * 5; JobRequest request = getBuilder() .setPeriodic(interval, flex) .build(); JobManager.instance().schedule(request); assertThat(request.getJobId()).isGreaterThan(0); assertThat(request.getTag()).isEqualTo(DummyJobs.SuccessJob.TAG); assertThat(request.getIntervalMs()).isEqualTo(interval); assertThat(request.getFlexMs()).isEqualTo(flex); assertThat(request.isPeriodic()).isTrue(); assertThat(request.isFlexSupport()).isTrue(); }
@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(); }
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(expected = Exception.class) public void testPeriodicTooLittleFlex() { getBuilder() .setPeriodic(JobRequest.MIN_FLEX - 1) .build(); }
@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(expected = Exception.class) public void testPeriodicTooLittleInterval() { getBuilder() .setPeriodic(JobRequest.MIN_INTERVAL - 1) .build(); }
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 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(); }
@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 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); }