From 63730ba33c0ffde974b0bf8603ce0c12dab84ee9 Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Tue, 24 Jan 2023 21:24:13 +0000 Subject: [PATCH] Add test for PendingJobQueue. Test that removing while iterating doesn't negatively affect iteration. Bug: 141645789 Test: atest FrameworksServicesTests:PendingJobQueueTest Change-Id: I13d3d5ffe4946bbc4851e18a622de9f2fb63e948 --- .../android/server/job/PendingJobQueue.java | 2 ++ .../server/job/PendingJobQueueTest.java | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/apex/jobscheduler/service/java/com/android/server/job/PendingJobQueue.java b/apex/jobscheduler/service/java/com/android/server/job/PendingJobQueue.java index 0a305a2633639..4f4096f69ad5e 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/PendingJobQueue.java +++ b/apex/jobscheduler/service/java/com/android/server/job/PendingJobQueue.java @@ -219,6 +219,8 @@ class PendingJobQueue { ajq.clear(); mAppJobQueuePool.release(ajq); } else if (prevTimestamp != ajq.peekNextTimestamp()) { + // Removing the job changed the "next timestamp" in the queue, so we need to reinsert + // it to fix the ordering. mOrderedQueues.remove(ajq); mOrderedQueues.offer(ajq); } diff --git a/services/tests/servicestests/src/com/android/server/job/PendingJobQueueTest.java b/services/tests/servicestests/src/com/android/server/job/PendingJobQueueTest.java index 8c3838b939ece..23d708227e4f2 100644 --- a/services/tests/servicestests/src/com/android/server/job/PendingJobQueueTest.java +++ b/services/tests/servicestests/src/com/android/server/job/PendingJobQueueTest.java @@ -201,6 +201,32 @@ public class PendingJobQueueTest { } } assertNull(jobQueue.next()); + assertEquals(0, jobQueue.size()); + } + + @Test + public void testRemove_duringIteration() { + List jobs = new ArrayList<>(); + jobs.add(createJobStatus("testRemove", createJobInfo(1), 1)); + jobs.add(createJobStatus("testRemove", createJobInfo(2), 2)); + jobs.add(createJobStatus("testRemove", createJobInfo(3).setExpedited(true), 3)); + jobs.add(createJobStatus("testRemove", createJobInfo(4), 4)); + jobs.add(createJobStatus("testRemove", createJobInfo(5).setExpedited(true), 5)); + + PendingJobQueue jobQueue = new PendingJobQueue(); + jobQueue.addAll(jobs); + + ArraySet removed = new ArraySet<>(); + JobStatus job; + jobQueue.resetIterator(); + while ((job = jobQueue.next()) != null) { + jobQueue.remove(job); + removed.add(job); + assertFalse("Queue retained a removed job " + testJobToString(job), + jobQueue.contains(job)); + } + assertNull(jobQueue.next()); + assertEquals(0, jobQueue.size()); } @Test