Watch for explicit download IDs instead of count.

When watching for completed downloads, wait for specific set of known
IDs, instead of simply counting.

Bug: 6306007
Change-Id: Ifd844643dca665f0cf09c02048866e668efd7c59
diff --git a/tests/tests/app/src/android/app/cts/DownloadManagerTest.java b/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
index 1da6af9..d3029ea 100644
--- a/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
@@ -27,10 +27,16 @@
 import android.net.Uri;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
+import android.os.SystemClock;
 import android.test.AndroidTestCase;
+import android.text.format.DateUtils;
 import android.webkit.cts.CtsTestServer;
 
+import com.google.android.collect.Sets;
+
 import java.io.File;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -42,6 +48,9 @@
      */
     private static final int MINIMUM_DOWNLOAD_BYTES = 55 * 1024 * 1024;
 
+    private static final long SHORT_TIMEOUT = 5 * DateUtils.SECOND_IN_MILLIS;
+    private static final long LONG_TIMEOUT = 2 * DateUtils.MINUTE_IN_MILLIS;
+
     private DownloadManager mDownloadManager;
 
     private CtsTestServer mWebServer;
@@ -61,8 +70,7 @@
     }
 
     public void testDownloadManager() throws Exception {
-        DownloadCompleteReceiver receiver =
-                new DownloadCompleteReceiver(2, TimeUnit.SECONDS.toMillis(3));
+        final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
         try {
             IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
             mContext.registerReceiver(receiver, intentFilter);
@@ -76,7 +84,7 @@
             assertDownloadQueryableById(goodId);
             assertDownloadQueryableById(badId);
 
-            receiver.waitForDownloadComplete();
+            receiver.waitForDownloadComplete(SHORT_TIMEOUT, goodId, badId);
 
             assertDownloadQueryableByStatus(DownloadManager.STATUS_SUCCESSFUL);
             assertDownloadQueryableByStatus(DownloadManager.STATUS_FAILED);
@@ -89,14 +97,13 @@
     }
 
     public void testMinimumDownload() throws Exception {
-        DownloadCompleteReceiver receiver =
-                new DownloadCompleteReceiver(1, TimeUnit.MINUTES.toMillis(2));
+        final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
         try {
             IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
             mContext.registerReceiver(receiver, intentFilter);
 
             long id = mDownloadManager.enqueue(new Request(getMinimumDownloadUrl()));
-            receiver.waitForDownloadComplete();
+            receiver.waitForDownloadComplete(LONG_TIMEOUT, id);
 
             ParcelFileDescriptor fileDescriptor = mDownloadManager.openDownloadedFile(id);
             assertEquals(MINIMUM_DOWNLOAD_BYTES, fileDescriptor.getStatSize());
@@ -146,8 +153,7 @@
             assertTrue(publicLocation.delete());
         }
 
-        DownloadCompleteReceiver receiver =
-            new DownloadCompleteReceiver(3, TimeUnit.SECONDS.toMillis(5));
+        final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
         try {
             IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
             mContext.registerReceiver(receiver, intentFilter);
@@ -168,7 +174,7 @@
             int allDownloads = getTotalNumberDownloads();
             assertEquals(3, allDownloads);
 
-            receiver.waitForDownloadComplete();
+            receiver.waitForDownloadComplete(SHORT_TIMEOUT, uriId, extFileId, publicId);
 
             assertSuccessfulDownload(uriId, uriLocation);
             assertSuccessfulDownload(extFileId, extFileLocation);
@@ -198,8 +204,7 @@
             assertTrue(wrongExtLocation.delete());
         }
 
-        DownloadCompleteReceiver receiver =
-            new DownloadCompleteReceiver(2, TimeUnit.SECONDS.toMillis(5));
+        final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
         try {
             IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
             mContext.registerReceiver(receiver, intentFilter);
@@ -215,7 +220,7 @@
             int allDownloads = getTotalNumberDownloads();
             assertEquals(2, allDownloads);
 
-            receiver.waitForDownloadComplete();
+            receiver.waitForDownloadComplete(SHORT_TIMEOUT, noExtId, wrongExtId);
 
             assertSuccessfulDownload(noExtId, noExtLocation);
             assertSuccessfulDownload(wrongExtId, wrongExtLocation);
@@ -228,24 +233,45 @@
     }
 
     private class DownloadCompleteReceiver extends BroadcastReceiver {
+        private HashSet<Long> mCompleteIds = Sets.newHashSet();
 
-        private final CountDownLatch mReceiveLatch;
-
-        private final long waitTimeMs;
-
-        public DownloadCompleteReceiver(int numDownload, long waitTimeMs) {
-            this.mReceiveLatch = new CountDownLatch(numDownload);
-            this.waitTimeMs = waitTimeMs;
+        public DownloadCompleteReceiver() {
         }
 
         @Override
         public void onReceive(Context context, Intent intent) {
-            mReceiveLatch.countDown();
+            synchronized (mCompleteIds) {
+                mCompleteIds.add(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1));
+                mCompleteIds.notifyAll();
+            }
         }
 
-        public void waitForDownloadComplete() throws InterruptedException {
-            assertTrue("Make sure you have WiFi or some other connectivity for this test.",
-                    mReceiveLatch.await(waitTimeMs, TimeUnit.MILLISECONDS));
+        private boolean isCompleteLocked(long... ids) {
+            for (long id : ids) {
+                if (!mCompleteIds.contains(id)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public void waitForDownloadComplete(long timeoutMillis, long... waitForIds)
+                throws InterruptedException {
+            if (waitForIds.length == 0) {
+                throw new IllegalArgumentException("Missing IDs to wait for");
+            }
+
+            final long startTime = SystemClock.elapsedRealtime();
+            do {
+                synchronized (mCompleteIds) {
+                    mCompleteIds.wait(timeoutMillis);
+                    if (isCompleteLocked(waitForIds)) return;
+                }
+            } while ((SystemClock.elapsedRealtime() - startTime) < timeoutMillis);
+
+            throw new InterruptedException("Timeout waiting for IDs " + Arrays.toString(waitForIds)
+                    + "; received " + mCompleteIds.toString()
+                    + ".  Make sure you have WiFi or some other connectivity for this test.");
         }
     }