Add tests around enabling/disabling jobs.

Bug: 138469672
Test: atest CtsJobSchedulerTestCases
Change-Id: I5a45a451fd33d10984587618af28b1671cc3dacb
diff --git a/tests/JobScheduler/src/android/jobscheduler/cts/ComponentConstraintTest.java b/tests/JobScheduler/src/android/jobscheduler/cts/ComponentConstraintTest.java
new file mode 100644
index 0000000..1bbc61e
--- /dev/null
+++ b/tests/JobScheduler/src/android/jobscheduler/cts/ComponentConstraintTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2020 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 android.jobscheduler.cts;
+
+import android.app.job.JobInfo;
+import android.content.pm.PackageManager;
+
+/**
+ * Schedules jobs with various component-enabled states.
+ */
+public class ComponentConstraintTest extends BaseJobSchedulerTest {
+    private static final String TAG = "ComponentConstraintTest";
+    /** Unique identifier for the job scheduled by this suite of tests. */
+    private static final int COMPONENT_JOB_ID = ComponentConstraintTest.class.hashCode();
+
+    private JobInfo.Builder mBuilder;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mBuilder = new JobInfo.Builder(COMPONENT_JOB_ID, kJobServiceComponent);
+    }
+
+    public void testScheduleAfterComponentEnabled() throws Exception {
+        setJobServiceEnabled(true);
+        kTestEnvironment.setExpectedExecutions(1);
+        mJobScheduler.schedule(mBuilder.setOverrideDeadline(0).build());
+
+        assertTrue("Job with enabled service didn't fire.", kTestEnvironment.awaitExecution());
+    }
+
+    /*
+        Test intentionally disabled but kept here to acknowledge the case wasn't accidentally
+        forgotten. Historically, JobScheduler has thrown an exception when an app called schedule()
+        with a disabled service. That behavior cannot be changed easily.
+
+        public void testScheduleAfterComponentDisabled() throws Exception {
+            setJobServiceEnabled(false);
+            kTestEnvironment.setExpectedExecutions(0);
+            mJobScheduler.schedule(mBuilder.setOverrideDeadline(0).build());
+
+            assertTrue("Job with disabled service fired.", kTestEnvironment.awaitTimeout());
+        }
+    */
+
+    public void testComponentDisabledAfterSchedule() throws Exception {
+        setJobServiceEnabled(true);
+        kTestEnvironment.setExpectedExecutions(0);
+        mJobScheduler.schedule(mBuilder.setMinimumLatency(1000).setOverrideDeadline(2000).build());
+        setJobServiceEnabled(false);
+
+        assertTrue("Job with disabled service fired.", kTestEnvironment.awaitTimeout());
+    }
+
+    public void testComponentDisabledAndReenabledAfterSchedule() throws Exception {
+        setJobServiceEnabled(true);
+        kTestEnvironment.setExpectedExecutions(1);
+        mJobScheduler.schedule(mBuilder.setMinimumLatency(1000).setOverrideDeadline(2000).build());
+
+        setJobServiceEnabled(false);
+        assertTrue("Job with disabled service fired.", kTestEnvironment.awaitTimeout());
+
+        setJobServiceEnabled(true);
+        assertTrue("Job with enabled service didn't fire.", kTestEnvironment.awaitExecution());
+    }
+
+    private void setJobServiceEnabled(boolean enabled) {
+        final int state = enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+                : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+        getContext().getPackageManager().setComponentEnabledSetting(
+                kJobServiceComponent, state, PackageManager.DONT_KILL_APP);
+    }
+}