• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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 android.jobscheduler.cts;
18 
19 import android.app.job.JobInfo;
20 import android.app.job.JobParameters;
21 import android.content.ClipData;
22 import android.content.Intent;
23 import android.content.pm.PackageManager;
24 import android.os.Bundle;
25 import android.os.PersistableBundle;
26 import android.os.UserHandle;
27 
28 import com.android.compatibility.common.util.BatteryUtils;
29 import com.android.compatibility.common.util.SystemUtil;
30 
31 /**
32  * Tests related to JobParameters objects.
33  */
34 public class JobParametersTest extends BaseJobSchedulerTest {
35     private static final int JOB_ID = JobParametersTest.class.hashCode();
36 
testClipData()37     public void testClipData() throws Exception {
38         final ClipData clipData = ClipData.newPlainText("test", "testText");
39         final int grantFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION;
40         JobInfo ji = new JobInfo.Builder(JOB_ID, kJobServiceComponent)
41                 .setClipData(clipData, grantFlags)
42                 .build();
43 
44         kTestEnvironment.setExpectedExecutions(1);
45         mJobScheduler.schedule(ji);
46         runSatisfiedJob(JOB_ID);
47         assertTrue("Job didn't fire immediately", kTestEnvironment.awaitExecution());
48 
49         JobParameters params = kTestEnvironment.getLastStartJobParameters();
50         assertEquals(clipData.getItemCount(), params.getClipData().getItemCount());
51         assertEquals(clipData.getItemAt(0).getText(), params.getClipData().getItemAt(0).getText());
52         assertEquals(grantFlags, params.getClipGrantFlags());
53     }
54 
testExtras()55     public void testExtras() throws Exception {
56         final PersistableBundle pb = new PersistableBundle();
57         pb.putInt("random_key", 42);
58         JobInfo ji = new JobInfo.Builder(JOB_ID, kJobServiceComponent)
59                 .setExtras(pb)
60                 .build();
61 
62         kTestEnvironment.setExpectedExecutions(1);
63         mJobScheduler.schedule(ji);
64         runSatisfiedJob(JOB_ID);
65         assertTrue("Job didn't fire immediately", kTestEnvironment.awaitExecution());
66 
67         JobParameters params = kTestEnvironment.getLastStartJobParameters();
68         final PersistableBundle extras = params.getExtras();
69         assertNotNull(extras);
70         assertEquals(1, extras.keySet().size());
71         assertEquals(42, extras.getInt("random_key"));
72     }
73 
testExpedited()74     public void testExpedited() throws Exception {
75         JobInfo ji = new JobInfo.Builder(JOB_ID, kJobServiceComponent)
76                 .setExpedited(true)
77                 .build();
78 
79         kTestEnvironment.setExpectedExecutions(1);
80         mJobScheduler.schedule(ji);
81         runSatisfiedJob(JOB_ID);
82         assertTrue("Job didn't fire immediately", kTestEnvironment.awaitExecution());
83 
84         JobParameters params = kTestEnvironment.getLastStartJobParameters();
85         assertTrue(params.isExpeditedJob());
86 
87         ji = new JobInfo.Builder(JOB_ID, kJobServiceComponent)
88                 .setExpedited(false)
89                 .build();
90 
91         kTestEnvironment.setExpectedExecutions(1);
92         mJobScheduler.schedule(ji);
93         runSatisfiedJob(JOB_ID);
94         assertTrue("Job didn't fire immediately", kTestEnvironment.awaitExecution());
95 
96         params = kTestEnvironment.getLastStartJobParameters();
97         assertFalse(params.isExpeditedJob());
98     }
99 
testJobId()100     public void testJobId() throws Exception {
101         JobInfo ji = new JobInfo.Builder(JOB_ID, kJobServiceComponent)
102                 .build();
103 
104         kTestEnvironment.setExpectedExecutions(1);
105         mJobScheduler.schedule(ji);
106         runSatisfiedJob(JOB_ID);
107         assertTrue("Job didn't fire immediately", kTestEnvironment.awaitExecution());
108 
109         JobParameters params = kTestEnvironment.getLastStartJobParameters();
110         assertEquals(JOB_ID, params.getJobId());
111     }
112 
113     // JobParameters.getNetwork() tested in ConnectivityConstraintTest.
114 
testStopReason()115     public void testStopReason() throws Exception {
116         verifyStopReason(new JobInfo.Builder(JOB_ID, kJobServiceComponent).build(),
117                 JobParameters.STOP_REASON_TIMEOUT,
118                 () -> SystemUtil.runShellCommand(getInstrumentation(),
119                         "cmd jobscheduler timeout"
120                                 + " -u " + UserHandle.myUserId()
121                                 + " " + kJobServiceComponent.getPackageName()
122                                 + " " + JOB_ID));
123 
124         // In automotive device, always-on screen and endless battery charging are assumed.
125         if (BatteryUtils.hasBattery() && !isAutomotiveDevice()) {
126             BatteryUtils.runDumpsysBatterySetLevel(100);
127             BatteryUtils.runDumpsysBatteryUnplug();
128             verifyStopReason(new JobInfo.Builder(JOB_ID, kJobServiceComponent)
129                             .setRequiresBatteryNotLow(true).build(),
130                     JobParameters.STOP_REASON_CONSTRAINT_BATTERY_NOT_LOW,
131                     () -> BatteryUtils.runDumpsysBatterySetLevel(5));
132 
133             BatteryUtils.runDumpsysBatterySetPluggedIn(true);
134             BatteryUtils.runDumpsysBatterySetLevel(100);
135             verifyStopReason(new JobInfo.Builder(JOB_ID, kJobServiceComponent)
136                             .setRequiresCharging(true).build(),
137                     JobParameters.STOP_REASON_CONSTRAINT_CHARGING,
138                     BatteryUtils::runDumpsysBatteryUnplug);
139         }
140 
141         setStorageStateLow(false);
142         verifyStopReason(new JobInfo.Builder(JOB_ID, kJobServiceComponent)
143                         .setRequiresStorageNotLow(true).build(),
144                 JobParameters.STOP_REASON_CONSTRAINT_STORAGE_NOT_LOW,
145                 () -> setStorageStateLow(true));
146     }
147 
verifyStopReason(JobInfo ji, int stopReason, ExceptionRunnable stopCode)148     private void verifyStopReason(JobInfo ji, int stopReason, ExceptionRunnable stopCode)
149             throws Exception {
150         kTestEnvironment.setExpectedExecutions(1);
151         kTestEnvironment.setContinueAfterStart();
152         kTestEnvironment.setExpectedStopped();
153         mJobScheduler.schedule(ji);
154         runSatisfiedJob(ji.getId());
155         assertTrue("Job didn't fire immediately", kTestEnvironment.awaitExecution());
156 
157         JobParameters params = kTestEnvironment.getLastStartJobParameters();
158         assertEquals(JobParameters.STOP_REASON_UNDEFINED, params.getStopReason());
159 
160         stopCode.run();
161         assertTrue("Job didn't stop immediately", kTestEnvironment.awaitStopped());
162         params = kTestEnvironment.getLastStopJobParameters();
163         assertEquals(stopReason, params.getStopReason());
164     }
165 
testTransientExtras()166     public void testTransientExtras() throws Exception {
167         final Bundle b = new Bundle();
168         b.putBoolean("random_bool", true);
169         JobInfo ji = new JobInfo.Builder(JOB_ID, kJobServiceComponent)
170                 .setTransientExtras(b)
171                 .build();
172 
173         kTestEnvironment.setExpectedExecutions(1);
174         mJobScheduler.schedule(ji);
175         runSatisfiedJob(JOB_ID);
176         assertTrue("Job didn't fire immediately", kTestEnvironment.awaitExecution());
177 
178         JobParameters params = kTestEnvironment.getLastStartJobParameters();
179         assertEquals(b.size(), params.getTransientExtras().size());
180         for (String key : b.keySet()) {
181             assertEquals(b.get(key), params.getTransientExtras().get(key));
182         }
183     }
184 
185     // JobParameters.getTriggeredContentAuthorities() tested in TriggerContentTest.
186     // JobParameters.getTriggeredContentUris() tested in TriggerContentTest.
187     // JobParameters.isOverrideDeadlineExpired() tested in TimingConstraintTest.
188 
isAutomotiveDevice()189     private boolean isAutomotiveDevice() {
190         return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
191     }
192 
193     private interface ExceptionRunnable {
run()194         void run() throws Exception;
195     }
196 }
197