/* * Copyright (C) 2015 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 com.android.server.job; import android.annotation.TargetApi; import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; import android.test.AndroidTestCase; import com.android.server.job.MockPriorityJobService.TestEnvironment; import com.android.server.job.MockPriorityJobService.TestEnvironment.Event; import java.util.ArrayList; @TargetApi(24) public class PrioritySchedulingTest extends AndroidTestCase { /** Environment that notifies of JobScheduler callbacks. */ static TestEnvironment kTestEnvironment = TestEnvironment.getTestEnvironment(); /** Handle for the service which receives the execution callbacks from the JobScheduler. */ static ComponentName kJobServiceComponent; JobScheduler mJobScheduler; @Override public void setUp() throws Exception { super.setUp(); kTestEnvironment.setUp(); kJobServiceComponent = new ComponentName(getContext(), MockPriorityJobService.class); mJobScheduler = (JobScheduler) getContext().getSystemService(Context.JOB_SCHEDULER_SERVICE); mJobScheduler.cancelAll(); } @Override public void tearDown() throws Exception { mJobScheduler.cancelAll(); super.tearDown(); } public void testLowerPriorityJobPreempted() throws Exception { JobInfo job1 = new JobInfo.Builder(111, kJobServiceComponent) .setPriority(1) .setOverrideDeadline(7000L) .build(); JobInfo job2 = new JobInfo.Builder(222, kJobServiceComponent) .setPriority(1) .setOverrideDeadline(7000L) .build(); JobInfo job3 = new JobInfo.Builder(333, kJobServiceComponent) .setPriority(1) .setOverrideDeadline(7000L) .build(); JobInfo job4 = new JobInfo.Builder(444, kJobServiceComponent) .setPriority(2) .setMinimumLatency(2000L) .setOverrideDeadline(7000L) .build(); mJobScheduler.schedule(job1); mJobScheduler.schedule(job2); mJobScheduler.schedule(job3); mJobScheduler.schedule(job4); Thread.sleep(10000); // Wait for job 4 to preempt one of the lower priority jobs Event job4Execution = new Event(TestEnvironment.EVENT_START_JOB, 444); ArrayList<Event> executedEvents = kTestEnvironment.getExecutedEvents(); boolean wasJob4Executed = executedEvents.contains(job4Execution); boolean wasSomeJobPreempted = false; for (Event event: executedEvents) { if (event.event == TestEnvironment.EVENT_PREEMPT_JOB) { wasSomeJobPreempted = true; break; } } assertTrue("No job was preempted.", wasSomeJobPreempted); assertTrue("Lower priority jobs were not preempted.", wasJob4Executed); } public void testHigherPriorityJobNotPreempted() throws Exception { JobInfo job1 = new JobInfo.Builder(111, kJobServiceComponent) .setPriority(2) .setOverrideDeadline(7000L) .build(); JobInfo job2 = new JobInfo.Builder(222, kJobServiceComponent) .setPriority(2) .setOverrideDeadline(7000L) .build(); JobInfo job3 = new JobInfo.Builder(333, kJobServiceComponent) .setPriority(2) .setOverrideDeadline(7000L) .build(); JobInfo job4 = new JobInfo.Builder(444, kJobServiceComponent) .setPriority(1) .setMinimumLatency(2000L) .setOverrideDeadline(7000L) .build(); mJobScheduler.schedule(job1); mJobScheduler.schedule(job2); mJobScheduler.schedule(job3); mJobScheduler.schedule(job4); Thread.sleep(10000); // Wait for job 4 to preempt one of the higher priority jobs Event job4Execution = new Event(TestEnvironment.EVENT_START_JOB, 444); boolean wasJob4Executed = kTestEnvironment.getExecutedEvents().contains(job4Execution); assertFalse("Higher priority job was preempted.", wasJob4Executed); } }