Home | History | Annotate | Download | only in job
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.server.job;
     18 
     19 import android.annotation.TargetApi;
     20 import android.app.job.JobInfo;
     21 import android.app.job.JobScheduler;
     22 import android.content.ComponentName;
     23 import android.content.Context;
     24 import android.test.AndroidTestCase;
     25 import com.android.server.job.MockPriorityJobService.TestEnvironment;
     26 import com.android.server.job.MockPriorityJobService.TestEnvironment.Event;
     27 
     28 import java.util.ArrayList;
     29 
     30 @TargetApi(24)
     31 public class PrioritySchedulingTest extends AndroidTestCase {
     32     /** Environment that notifies of JobScheduler callbacks. */
     33     static TestEnvironment kTestEnvironment = TestEnvironment.getTestEnvironment();
     34     /** Handle for the service which receives the execution callbacks from the JobScheduler. */
     35     static ComponentName kJobServiceComponent;
     36     JobScheduler mJobScheduler;
     37 
     38     @Override
     39     public void setUp() throws Exception {
     40         super.setUp();
     41         kTestEnvironment.setUp();
     42         kJobServiceComponent = new ComponentName(getContext(), MockPriorityJobService.class);
     43         mJobScheduler = (JobScheduler) getContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
     44         mJobScheduler.cancelAll();
     45     }
     46 
     47     @Override
     48     public void tearDown() throws Exception {
     49         mJobScheduler.cancelAll();
     50         super.tearDown();
     51     }
     52 
     53     public void testLowerPriorityJobPreempted() throws Exception {
     54         JobInfo job1 = new JobInfo.Builder(111, kJobServiceComponent)
     55                 .setPriority(1)
     56                 .setOverrideDeadline(7000L)
     57                 .build();
     58         JobInfo job2 = new JobInfo.Builder(222, kJobServiceComponent)
     59                 .setPriority(1)
     60                 .setOverrideDeadline(7000L)
     61                 .build();
     62         JobInfo job3 = new JobInfo.Builder(333, kJobServiceComponent)
     63                 .setPriority(1)
     64                 .setOverrideDeadline(7000L)
     65                 .build();
     66         JobInfo job4 = new JobInfo.Builder(444, kJobServiceComponent)
     67                 .setPriority(2)
     68                 .setMinimumLatency(2000L)
     69                 .setOverrideDeadline(7000L)
     70                 .build();
     71         mJobScheduler.schedule(job1);
     72         mJobScheduler.schedule(job2);
     73         mJobScheduler.schedule(job3);
     74         mJobScheduler.schedule(job4);
     75         Thread.sleep(10000);  // Wait for job 4 to preempt one of the lower priority jobs
     76 
     77         Event job4Execution = new Event(TestEnvironment.EVENT_START_JOB, 444);
     78         ArrayList<Event> executedEvents = kTestEnvironment.getExecutedEvents();
     79         boolean wasJob4Executed = executedEvents.contains(job4Execution);
     80         boolean wasSomeJobPreempted = false;
     81         for (Event event: executedEvents) {
     82             if (event.event == TestEnvironment.EVENT_PREEMPT_JOB) {
     83                 wasSomeJobPreempted = true;
     84                 break;
     85             }
     86         }
     87         assertTrue("No job was preempted.", wasSomeJobPreempted);
     88         assertTrue("Lower priority jobs were not preempted.",  wasJob4Executed);
     89     }
     90 
     91     public void testHigherPriorityJobNotPreempted() throws Exception {
     92         JobInfo job1 = new JobInfo.Builder(111, kJobServiceComponent)
     93                 .setPriority(2)
     94                 .setOverrideDeadline(7000L)
     95                 .build();
     96         JobInfo job2 = new JobInfo.Builder(222, kJobServiceComponent)
     97                 .setPriority(2)
     98                 .setOverrideDeadline(7000L)
     99                 .build();
    100         JobInfo job3 = new JobInfo.Builder(333, kJobServiceComponent)
    101                 .setPriority(2)
    102                 .setOverrideDeadline(7000L)
    103                 .build();
    104         JobInfo job4 = new JobInfo.Builder(444, kJobServiceComponent)
    105                 .setPriority(1)
    106                 .setMinimumLatency(2000L)
    107                 .setOverrideDeadline(7000L)
    108                 .build();
    109         mJobScheduler.schedule(job1);
    110         mJobScheduler.schedule(job2);
    111         mJobScheduler.schedule(job3);
    112         mJobScheduler.schedule(job4);
    113         Thread.sleep(10000);  // Wait for job 4 to preempt one of the higher priority jobs
    114 
    115         Event job4Execution = new Event(TestEnvironment.EVENT_START_JOB, 444);
    116         boolean wasJob4Executed = kTestEnvironment.getExecutedEvents().contains(job4Execution);
    117         assertFalse("Higher priority job was preempted.", wasJob4Executed);
    118     }
    119 }
    120