summaryrefslogtreecommitdiffstats
path: root/services/tests
diff options
context:
space:
mode:
authorMatthew Williams <mjwilliams@google.com>2015-10-15 15:59:12 -0700
committerMatthew Williams <mjwilliams@google.com>2015-10-16 21:56:55 +0000
commit1f0ec16b6d5f20ed8b6156eb1b5abf4c73548645 (patch)
treed9b99d522007f913dccce8160d67e320dc7ae396 /services/tests
parent5362f273e91885041b7cb246667cff3ceca74703 (diff)
downloadframeworks_base-1f0ec16b6d5f20ed8b6156eb1b5abf4c73548645.zip
frameworks_base-1f0ec16b6d5f20ed8b6156eb1b5abf4c73548645.tar.gz
frameworks_base-1f0ec16b6d5f20ed8b6156eb1b5abf4c73548645.tar.bz2
DO NOT MERGE Sanity check loaded periodics and cap runtime.
BUG: 24900376 We've seen an issue where periodic run times can be massively inflated after loading from disk. As a safeguard, cap the period's loaded runtime to be [p, 2p] from the time of loading. Change-Id: Ie4464490c8d6702fee8efe9190c3da5dc5f013f6 (cherry picked from commit fa8e5084eed63ab8d92c71fcff656690a30293c3)
Diffstat (limited to 'services/tests')
-rw-r--r--services/tests/servicestests/src/com/android/server/job/JobStoreTest.java39
1 files changed, 39 insertions, 0 deletions
diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
index bd64392..0b73beb 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
@@ -6,6 +6,7 @@ import android.content.Context;
import android.app.job.JobInfo;
import android.app.job.JobInfo.Builder;
import android.os.PersistableBundle;
+import android.os.SystemClock;
import android.test.AndroidTestCase;
import android.test.RenamingDelegatingContext;
import android.util.Log;
@@ -102,6 +103,14 @@ public class JobStoreTest extends AndroidTestCase {
Iterator<JobStatus> it = jobStatusSet.iterator();
JobStatus loaded1 = it.next();
JobStatus loaded2 = it.next();
+
+ // Reverse them so we know which comparison to make.
+ if (loaded1.getJobId() != 8) {
+ JobStatus tmp = loaded1;
+ loaded1 = loaded2;
+ loaded2 = tmp;
+ }
+
assertTasksEqual(task1, loaded1.getJob());
assertTasksEqual(task2, loaded2.getJob());
assertTrue("JobStore#contains invalid.", mTaskStoreUnderTest.containsJob(taskStatus1));
@@ -143,6 +152,36 @@ public class JobStoreTest extends AndroidTestCase {
assertTasksEqual(task, loaded.getJob());
}
+ public void testMassivePeriodClampedOnRead() throws Exception {
+ final long TEN_SECONDS = 10000L;
+ JobInfo.Builder b = new Builder(8, mComponent)
+ .setPeriodic(TEN_SECONDS)
+ .setPersisted(true);
+ final long invalidLateRuntimeElapsedMillis =
+ SystemClock.elapsedRealtime() + (TEN_SECONDS * 2) + 5000; // >2P from now.
+ final long invalidEarlyRuntimeElapsedMillis =
+ invalidLateRuntimeElapsedMillis - TEN_SECONDS; // Early is (late - period).
+ final JobStatus js = new JobStatus(b.build(), SOME_UID,
+ invalidEarlyRuntimeElapsedMillis, invalidLateRuntimeElapsedMillis);
+
+ mTaskStoreUnderTest.add(js);
+ Thread.sleep(IO_WAIT);
+
+ final ArraySet<JobStatus> jobStatusSet = new ArraySet<JobStatus>();
+ mTaskStoreUnderTest.readJobMapFromDisk(jobStatusSet);
+ assertEquals("Incorrect # of persisted tasks.", 1, jobStatusSet.size());
+ JobStatus loaded = jobStatusSet.iterator().next();
+
+ // Assert early runtime was clamped to be under now + period. We can do <= here b/c we'll
+ // call SystemClock.elapsedRealtime after doing the disk i/o.
+ final long newNowElapsed = SystemClock.elapsedRealtime();
+ assertTrue("Early runtime wasn't correctly clamped.",
+ loaded.getEarliestRunTime() <= newNowElapsed + TEN_SECONDS);
+ // Assert late runtime was clamped to be now + period*2.
+ assertTrue("Early runtime wasn't correctly clamped.",
+ loaded.getEarliestRunTime() <= newNowElapsed + TEN_SECONDS*2);
+ }
+
/**
* Helper function to throw an error if the provided task and TaskStatus objects are not equal.
*/