am ecdce8c6: am e21ff23d: am 77ae9511: Further refinement of the alarm batching test

* commit 'ecdce8c6955e8a664813cffa9254a24a77d89453':
  Further refinement of the alarm batching test
diff --git a/tests/tests/app/src/android/app/cts/AlarmManagerTest.java b/tests/tests/app/src/android/app/cts/AlarmManagerTest.java
index e78c266..bfc3e1d 100644
--- a/tests/tests/app/src/android/app/cts/AlarmManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/AlarmManagerTest.java
@@ -25,19 +25,17 @@
 import android.cts.util.PollingCheck;
 import android.os.SystemClock;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
 public class AlarmManagerTest extends AndroidTestCase {
     public static final String MOCKACTION = "android.app.AlarmManagerTest.TEST_ALARMRECEIVER";
     public static final String MOCKACTION2 = "android.app.AlarmManagerTest.TEST_ALARMRECEIVER2";
-    private static final String DUMMYACTION = "android.app.AlarmManagerTest.DUMMY";
 
     private AlarmManager mAm;
     private Intent mIntent;
     private PendingIntent mSender;
     private Intent mIntent2;
     private PendingIntent mSender2;
-    private Intent mDummyIntent;
-    private PendingIntent mDummySender;
 
     /*
      *  The default snooze delay: 5 seconds
@@ -67,19 +65,13 @@
     // exact alarm.
     //
     // The test essentially amounts to requiring that the inexact MOCKACTION alarm and
-    // the much later exact MOCKACTION2 alarm fire far apart, always.
+    // the much later exact MOCKACTION2 alarm fire far apart, always; with an implicit
+    // insistence that alarm batches are delivered at the head of their window.
     private static final long TEST_WINDOW_LENGTH = 5 * 1000L;
-    private static final long TEST_EXACT_OFFSET = TEST_WINDOW_LENGTH * 9 / 10;
-    private static final long TEST_DUMMY_OFFSET = TEST_WINDOW_LENGTH / 10;
     private static final long TEST_ALARM_FUTURITY = 6 * 1000L;
-    private static final long REQUIRED_DELTA = (TEST_EXACT_OFFSET - TEST_DUMMY_OFFSET)/2;
-    private static final long NUM_TRIALS = 4;
-
-    // Delta between the center of the window and the exact alarm's trigger time.  We expect
-    // that on average the delta between the exact and windowed alarm will average at least
-    // this much; we conservatively check for it to average at least half this.
-    private static final long AVERAGE_WINDOWED_TO_EXACT_SKEW =
-            TEST_EXACT_OFFSET - (TEST_WINDOW_LENGTH / 2);
+    private static final long FAIL_DELTA = 50;
+    private static final long NUM_TRIALS = 5;
+    private static final long MAX_NEAR_DELIVERIES = 2;
 
     @Override
     protected void setUp() throws Exception {
@@ -97,10 +89,6 @@
         mSender2 = PendingIntent.getBroadcast(mContext, 0, mIntent2, 0);
         mMockAlarmReceiver2 = new MockAlarmReceiver(mIntent2.getAction());
 
-        mDummyIntent = new Intent(DUMMYACTION)
-                .addFlags(Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_REGISTERED_ONLY);
-        mDummySender = PendingIntent.getBroadcast(mContext, 0, mDummyIntent, 0);
-
         IntentFilter filter = new IntentFilter(mIntent.getAction());
         mContext.registerReceiver(mMockAlarmReceiver, filter);
 
@@ -188,17 +176,16 @@
     }
 
     public void testExactAlarmBatching() throws Exception {
+        int deliveriesTogether = 0;
         for (int i = 0; i < NUM_TRIALS; i++) {
             final long now = System.currentTimeMillis();
             final long windowStart = now + TEST_ALARM_FUTURITY;
-            final long exactStart = windowStart + TEST_EXACT_OFFSET;
-            final long dummyStart = windowStart + TEST_DUMMY_OFFSET;
+            final long exactStart = windowStart + TEST_WINDOW_LENGTH - 1;
 
             mMockAlarmReceiver.setAlarmedFalse();
             mMockAlarmReceiver2.setAlarmedFalse();
             mAm.setWindow(AlarmManager.RTC_WAKEUP, windowStart, TEST_WINDOW_LENGTH, mSender);
             mAm.setExact(AlarmManager.RTC_WAKEUP, exactStart, mSender2);
-            mAm.setExact(AlarmManager.RTC_WAKEUP, dummyStart, mDummySender);
 
             // Wait until a half-second beyond its target window, just to provide a
             // little safety slop.
@@ -222,9 +209,13 @@
             // Success when we observe that the exact and windowed alarm are not being often
             // delivered close together -- that is, when we can be confident that they are not
             // being coalesced.
-            final long delta = mMockAlarmReceiver2.rtcTime - mMockAlarmReceiver.rtcTime;
-            assertTrue("Exact alarms appear to be coalescing with inexact alarms",
-                    delta >= REQUIRED_DELTA);
+            final long delta = Math.abs(mMockAlarmReceiver2.rtcTime - mMockAlarmReceiver.rtcTime);
+            Log.i("TEST", "[" + i + "]  delta = " + delta);
+            if (delta < FAIL_DELTA) {
+                deliveriesTogether++;
+                assertTrue("Exact alarms appear to be coalescing with inexact alarms",
+                        deliveriesTogether <= MAX_NEAR_DELIVERIES);
+            }
         }
     }