Merge "Fix long comparison overflow issue in AlarmQueue." into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2022-09-22 17:49:55 +00:00
committed by Android (Google) Code Review
2 changed files with 26 additions and 1 deletions

View File

@@ -34,6 +34,7 @@ import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.function.Predicate;
@@ -58,8 +59,11 @@ public abstract class AlarmQueue<K> implements AlarmManager.OnAlarmListener {
* The pair is the key and its associated alarm time (in the elapsed realtime timebase).
*/
private static class AlarmPriorityQueue<Q> extends PriorityQueue<Pair<Q, Long>> {
private static final Comparator<Pair<?, Long>> sTimeComparator =
(o1, o2) -> Long.compare(o1.second, o2.second);
AlarmPriorityQueue() {
super(1, (o1, o2) -> (int) (o1.second - o2.second));
super(1, sTimeComparator);
}
/**

View File

@@ -155,6 +155,27 @@ public class AlarmQueueTest {
anyInt(), eq(nowElapsed + HOUR_IN_MILLIS), eq(ALARM_TAG), any(), any());
}
@Test
public void testAddingLargeAlarmTimes() {
final AlarmQueue<String> alarmQueue = createAlarmQueue(true, 0);
final long nowElapsed = mInjector.getElapsedRealtime();
InOrder inOrder = inOrder(mAlarmManager);
alarmQueue.addAlarm("com.android.test.1", Long.MAX_VALUE - 5);
inOrder.verify(mAlarmManager, timeout(1000).times(1))
.setExact(anyInt(), eq(Long.MAX_VALUE - 5), eq(ALARM_TAG), any(), any());
alarmQueue.addAlarm("com.android.test.2", Long.MAX_VALUE - 4);
inOrder.verify(mAlarmManager, never())
.setExact(anyInt(), anyLong(), eq(ALARM_TAG), any(), any());
alarmQueue.addAlarm("com.android.test.3", nowElapsed + 5);
inOrder.verify(mAlarmManager, timeout(1000).times(1))
.setExact(anyInt(), eq(nowElapsed + 5), eq(ALARM_TAG), any(), any());
alarmQueue.addAlarm("com.android.test.4", nowElapsed + 6);
inOrder.verify(mAlarmManager, never())
.setExact(anyInt(), anyLong(), eq(ALARM_TAG), any(), any());
}
/**
* Verify that updating the alarm time for a key will result in the AlarmManager alarm changing,
* if needed.