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