Stop ConnectivityController from processing non-network jobs.

Jobs that don't require network won't have a NetworkRequest object, so
trying to process them fully in ConnectivityController will lead to
NPEs.

Bug: 148218476
Test: atest com.android.server.job.controllers.ConnectivityControllerTest#testRestrictedJobTracking
Change-Id: Ibcb4162c19fc97d09f860bb1732e465de5c8374e
This commit is contained in:
Kweku Adams
2020-01-23 11:27:44 -08:00
parent c4035ef38d
commit 0090ddc834
2 changed files with 52 additions and 2 deletions

View File

@@ -144,14 +144,18 @@ public final class ConnectivityController extends RestrictingController implemen
public void startTrackingRestrictedJobLocked(JobStatus jobStatus) {
// Don't need to start tracking the job. If the job needed network, it would already be
// tracked.
updateConstraintsSatisfied(jobStatus);
if (jobStatus.hasConnectivityConstraint()) {
updateConstraintsSatisfied(jobStatus);
}
}
@Override
public void stopTrackingRestrictedJobLocked(JobStatus jobStatus) {
// Shouldn't stop tracking the job here. If the job was tracked, it still needs network,
// even after being unrestricted.
updateConstraintsSatisfied(jobStatus);
if (jobStatus.hasConnectivityConstraint()) {
updateConstraintsSatisfied(jobStatus);
}
}
/**

View File

@@ -20,6 +20,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -27,6 +28,9 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.inOrder;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static com.android.server.job.JobSchedulerService.FREQUENT_INDEX;
import static com.android.server.job.JobSchedulerService.RARE_INDEX;
import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -568,6 +572,48 @@ public class ConnectivityControllerTest {
assertFalse(controller.isStandbyExceptionRequestedLocked(UID_RED));
}
@Test
public void testRestrictedJobTracking() {
final JobStatus networked = createJobStatus(createJob()
.setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1), 0)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_CELLULAR), UID_RED);
final JobStatus unnetworked = createJobStatus(createJob(), UID_BLUE);
networked.setStandbyBucket(FREQUENT_INDEX);
unnetworked.setStandbyBucket(FREQUENT_INDEX);
final Network cellularNet = new Network(101);
final NetworkCapabilities cellularCaps =
createCapabilities().addTransportType(TRANSPORT_CELLULAR);
reset(mConnManager);
answerNetwork(UID_RED, cellularNet, cellularCaps);
answerNetwork(UID_BLUE, cellularNet, cellularCaps);
final ConnectivityController controller = new ConnectivityController(mService);
controller.maybeStartTrackingJobLocked(networked, null);
controller.maybeStartTrackingJobLocked(unnetworked, null);
assertTrue(networked.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
assertFalse(unnetworked.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
networked.setStandbyBucket(RESTRICTED_INDEX);
unnetworked.setStandbyBucket(RESTRICTED_INDEX);
controller.startTrackingRestrictedJobLocked(networked);
controller.startTrackingRestrictedJobLocked(unnetworked);
assertFalse(networked.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
// Unnetworked shouldn't be affected by ConnectivityController since it doesn't have a
// connectivity constraint.
assertFalse(unnetworked.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
networked.setStandbyBucket(RARE_INDEX);
unnetworked.setStandbyBucket(RARE_INDEX);
controller.stopTrackingRestrictedJobLocked(networked);
controller.stopTrackingRestrictedJobLocked(unnetworked);
assertTrue(networked.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
// Unnetworked shouldn't be affected by ConnectivityController since it doesn't have a
// connectivity constraint.
assertFalse(unnetworked.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
}
private void answerNetwork(int uid, Network net, NetworkCapabilities caps) {
when(mConnManager.getActiveNetworkForUid(eq(uid))).thenReturn(net);
when(mConnManager.getNetworkCapabilities(eq(net))).thenReturn(caps);