diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/AdaptiveStreamBufferTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/AdaptiveStreamBufferTest.java index 82557673079..fd9a10ff7b5 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/AdaptiveStreamBufferTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/AdaptiveStreamBufferTest.java @@ -21,7 +21,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Arrays; -import junit.framework.Assert; +import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/DeleteTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/DeleteTest.java index 1b1e42c9f8f..592c7f1584a 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/DeleteTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/DeleteTest.java @@ -23,12 +23,10 @@ import com.google.firebase.storage.network.NetworkLayerMock; import com.google.firebase.testing.FirebaseAppRule; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @@ -59,19 +57,12 @@ public void tearDown() { @SuppressWarnings("ConstantConditions") @Test public void deleteBlob() throws Exception { - final MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("deleteBlob", false); - + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("deleteBlob", false); Task task = TestCommandHelper.deleteBlob(); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("deleteBlob", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("deleteBlob", task.getResult().toString()); } } diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/DependencyTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/DependencyTest.java index 1d7a2e4192e..1e4aee0023e 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/DependencyTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/DependencyTest.java @@ -20,7 +20,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import junit.framework.Assert; +import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/DownloadTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/DownloadTest.java index 4ce813aae8e..8f47147ef90 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/DownloadTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/DownloadTest.java @@ -33,8 +33,8 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; -import junit.framework.Assert; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -74,8 +74,7 @@ public void tearDown() { public void streamDownload() throws Exception { System.out.println("Starting test streamDownload."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("streamDownload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("streamDownload", true); final boolean[] completeHandlerInvoked = new boolean[] {false}; Task task = @@ -90,18 +89,11 @@ public void streamDownload() throws Exception { "image.jpg", -1); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("streamDownload", task.getResult()); - assertTrue(completeHandlerInvoked[0]); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("streamDownload", task.getResult()); + assertTrue(completeHandlerInvoked[0]); } @Test @@ -158,7 +150,7 @@ public void streamDownloadStateVerification() throws Exception { public void streamDownloadWithResume() throws Exception { System.out.println("Starting test streamDownloadWithResume."); - final MockConnectionFactory factory = + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("streamDownloadWithResume", true); final boolean[] completeHandlerInvoked = new boolean[] {false}; @@ -174,97 +166,67 @@ public void streamDownloadWithResume() throws Exception { "image.jpg", -1); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("streamDownloadWithResume", task.getResult()); - assertTrue(completeHandlerInvoked[0]); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("streamDownloadWithResume", task.getResult()); + assertTrue(completeHandlerInvoked[0]); } @Test public void streamDownloadWithResumeAndCancel() throws Exception { System.out.println("Starting test streamDownloadWithResumeAndCancel."); - final MockConnectionFactory factory = + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("streamDownloadWithResumeAndCancel", true); Task task = TestDownloadHelper.streamDownload( bitmap -> fail("Should not get called since we cancelled."), null, "image.jpg", 260000); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("streamDownloadWithResumeAndCancel", task.getResult()); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("streamDownloadWithResumeAndCancel", task.getResult()); } @Test public void streamDownloadCanceled() throws Exception { System.out.println("Starting test streamDownloadCanceled."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("streamDownload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("streamDownload", true); Task task = TestDownloadHelper.streamDownload( bitmap -> fail("Should not get called since we cancelled."), null, "image.jpg", 0); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("streamDownloadCanceled", task.getResult()); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("streamDownloadCanceled", task.getResult()); } @Test public void streamDownloadWithETagChange() throws Exception { System.out.println("Starting test streamDownloadWithETagChange."); - final MockConnectionFactory factory = + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("streamDownloadWithETagChange", true); Task task = TestDownloadHelper.streamDownload(null, null, "image.jpg", -1); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("streamDownloadWithETagChange", task.getResult()); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("streamDownloadWithETagChange", task.getResult()); } @Test public void emptyStreamDownload() throws Exception { System.out.println("Starting test emptyStreamDownload."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("emptyStreamDownload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("emptyStreamDownload", true); final boolean[] completeHandlerInvoked = new boolean[] {false}; Task task = @@ -277,26 +239,18 @@ public void emptyStreamDownload() throws Exception { "empty.dat", -1); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("emptyStreamDownload", task.getResult()); - assertTrue(completeHandlerInvoked[0]); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("emptyStreamDownload", task.getResult()); + assertTrue(completeHandlerInvoked[0]); } @Test public void byteDownload() throws Exception { System.out.println("Starting test byteDownload."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("streamDownload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("streamDownload", true); Semaphore semaphore = TestDownloadHelper.byteDownload( @@ -322,7 +276,7 @@ public void fileDownload() throws Exception { outputFile.delete(); } Uri destinationUri = Uri.fromFile(outputFile); - final MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileDownload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileDownload", true); final boolean[] completeHandlerInvoked = new boolean[] {false}; @@ -336,18 +290,11 @@ public void fileDownload() throws Exception { }, -1); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("fileDownload", task.getResult().toString()); - assertTrue(completeHandlerInvoked[0]); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("fileDownload", task.getResult().toString()); + assertTrue(completeHandlerInvoked[0]); } @Test @@ -360,8 +307,7 @@ public void fileDownloadResume() throws Exception { outputFile.delete(); } Uri destinationUri = Uri.fromFile(outputFile); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("fileDownloadResume", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileDownloadResume", true); final boolean[] completeHandlerInvoked = new boolean[] {false}; @@ -375,18 +321,11 @@ public void fileDownloadResume() throws Exception { }, -1); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("fileDownloadResume", task.getResult().toString()); - assertTrue(completeHandlerInvoked[0]); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("fileDownloadResume", task.getResult().toString()); + assertTrue(completeHandlerInvoked[0]); } @Test @@ -399,7 +338,7 @@ public void emptyDownload() throws Exception { outputFile.delete(); } Uri destinationUri = Uri.fromFile(outputFile); - final MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("emptyDownload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("emptyDownload", true); final boolean[] completeHandlerInvoked = new boolean[] {false}; Task task = @@ -412,18 +351,11 @@ public void emptyDownload() throws Exception { }, -1); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("emptyDownload", task.getResult().toString()); - assertTrue(completeHandlerInvoked[0]); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("emptyDownload", task.getResult().toString()); + assertTrue(completeHandlerInvoked[0]); } @Test @@ -436,21 +368,15 @@ public void fileDownloadCanceledImmediately() throws Exception { outputFile.delete(); } Uri destinationUri = Uri.fromFile(outputFile); - final MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileDownload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileDownload", true); Task task = TestDownloadHelper.fileDownload( destinationUri, () -> fail("Should not run since we cancelled the task."), 0); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("fileDownloadCanceled", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - fail(); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("fileDownloadCanceled", task.getResult().toString()); } } diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/ListTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/ListTest.java index c4222bca2e4..bcaf5ab2851 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/ListTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/ListTest.java @@ -29,7 +29,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @@ -80,63 +79,34 @@ public void validateListOptions() { @Test public void listResultsWithSinglePage() throws InterruptedException { - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("listSinglePage", true); - + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("listSinglePage", true); Task task = TestCommandHelper.listFiles(/* pageSize= */ 10, /* pageCount= */ 1); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("listSinglePage", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("listSinglePage", task.getResult().toString()); } @Test public void listResultsWithMultiplePages() throws InterruptedException { - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("listMultiplePages", true); - - int pageSize = 10; - int pageCount = 10; - - Task task = TestCommandHelper.listFiles(pageSize, pageCount); - - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("listMultiplePages", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - fail(); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("listMultiplePages", true); + Task task = TestCommandHelper.listFiles(/* pageSize= */ 10, /* pageCount= */ 10); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("listMultiplePages", task.getResult().toString()); } @Test public void listAll() throws InterruptedException { - final MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("listAll", true); - + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("listAll", true); Task task = TestCommandHelper.listAllFiles(); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("listAll", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - fail(); + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("listAll", task.getResult().toString()); } } diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/MetadataTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/MetadataTest.java index 2d20ec14960..0dbfbcf0330 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/MetadataTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/MetadataTest.java @@ -23,12 +23,10 @@ import com.google.firebase.storage.network.NetworkLayerMock; import com.google.firebase.testing.FirebaseAppRule; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @@ -59,56 +57,33 @@ public void tearDown() { @Test public void updateMetadata() throws Exception { MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("updateMetadata", true); - Task task = TestCommandHelper.testUpdateMetadata(); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("updateMetadata", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("updateMetadata", task.getResult().toString()); } @Test public void unicodeMetadata() throws Exception { MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("unicodeMetadata", true); - Task task = TestCommandHelper.testUnicodeMetadata(); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("unicodeMetadata", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - - Assert.fail("Task did not complete"); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("unicodeMetadata", task.getResult().toString()); } @Test public void clearMetadata() throws Exception { MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("clearMetadata", true); - Task task = TestCommandHelper.testClearMetadata(); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("clearMetadata", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - - Assert.fail("Task did not complete"); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("clearMetadata", task.getResult().toString()); } } diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/PathingTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/PathingTest.java index 0b088695a72..a1f7f3397d7 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/PathingTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/PathingTest.java @@ -24,8 +24,8 @@ import com.google.firebase.storage.internal.MockClockHelper; import com.google.firebase.storage.internal.RobolectricThreadFix; import com.google.firebase.testing.FirebaseAppRule; -import junit.framework.Assert; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/StorageReferenceTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/StorageReferenceTest.java index bda6efecbbe..1af586873c9 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/StorageReferenceTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/StorageReferenceTest.java @@ -31,7 +31,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -264,19 +263,12 @@ public void badURL2() throws Exception { public void downloadUrl() throws Exception { MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("downloadUrl", true); final StorageReference ref = FirebaseStorage.getInstance().getReference("flubbertest.txt"); - Task task = TestCommandHelper.testDownloadUrl(ref); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("downloadUrl", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("downloadUrl", task.getResult().toString()); } @Test diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/TestUtil.java b/firebase-storage/src/test/java/com/google/firebase/storage/TestUtil.java index a11c24a27b5..6b48ec33c0b 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/TestUtil.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/TestUtil.java @@ -15,6 +15,7 @@ package com.google.firebase.storage; import android.support.annotation.Nullable; +import com.google.android.gms.tasks.Task; import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import java.io.BufferedReader; @@ -22,7 +23,9 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; -import junit.framework.Assert; +import java.util.concurrent.TimeUnit; +import org.junit.Assert; +import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; /** Test helpers. */ @@ -130,4 +133,31 @@ private static void verifyTaskStateChanges(@Nullable InputStream inputStream, St e.printStackTrace(); } } + + /** + * Awaits for a Task until `timeout` expires, but flushes the Robolectric scheduler to allow newly + * added Tasks to be executed. + */ + static void await(Task task, int timeout, TimeUnit timeUnit) throws InterruptedException { + long timeoutMillis = timeUnit.toMillis(timeout); + + for (int i = 0; i < timeoutMillis; i++) { + Robolectric.flushForegroundThreadScheduler(); + if (task.isComplete()) { + // success! + return; + } + Thread.sleep(1); + } + + Assert.fail("Timeout occurred"); + } + + /** + * Awaits for a Task for 3 seconds, but flushes the Robolectric scheduler to allow newly added + * Tasks to be executed. + */ + static void await(Task task) throws InterruptedException { + await(task, 3, TimeUnit.SECONDS); + } } diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/UploadTest.java b/firebase-storage/src/test/java/com/google/firebase/storage/UploadTest.java index 34c3be44fa9..fac3917a468 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/UploadTest.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/UploadTest.java @@ -44,8 +44,8 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; -import junit.framework.Assert; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -91,21 +91,13 @@ public void tearDown() { public void smallTextUpload() throws Exception { System.out.println("Starting test smallTextUpload."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("smallTextUpload", true); - + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("smallTextUpload", true); Task task = TestUploadHelper.smallTextUpload(); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("smallTextUpload", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("smallTextUpload", task.getResult().toString()); } @Test @@ -137,33 +129,24 @@ public void cantUploadToRoot() throws Exception { taskException.set(exception); }); - for (int i = 0; i < 300000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (taskException.get() != null) { - // Test the various exception accessors. - try { - task.getResult(); - Assert.fail(); - } catch (RuntimeExecutionException e) { - Assert.assertEquals(taskException.get().getCause(), e.getCause().getCause()); - // Task failed. - } - - try { - task.getResult(StorageException.class); - Assert.fail(); - } catch (StorageException e) { - Assert.assertEquals(taskException.get().getCause(), e.getCause()); - // Task failed. - } - - Assert.assertEquals(taskException.get().getCause(), task.getException().getCause()); - - return; - } - Thread.sleep(1); + // TODO(mrschmidt): Lower the timeout + TestUtil.await(task, 300, TimeUnit.SECONDS); + + try { + task.getResult(); + Assert.fail(); + } catch (RuntimeExecutionException e) { + Assert.assertEquals(taskException.get().getCause(), e.getCause().getCause()); + } + + try { + task.getResult(StorageException.class); + Assert.fail(); + } catch (StorageException e) { + Assert.assertEquals(taskException.get().getCause(), e.getCause()); } - Assert.fail(); + + Assert.assertEquals(taskException.get().getCause(), task.getException().getCause()); } @Test @@ -266,13 +249,7 @@ public void addAndRemoveListeners() throws Exception { activityController.stop(); - for (int i = 0; i < 5000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (Tasks.whenAllComplete(pendingTasks).isComplete()) { - break; - } - Thread.sleep(1); - } + TestUtil.await(Tasks.whenAll(pendingTasks), 5, TimeUnit.SECONDS); Assert.assertTrue( StorageTaskManager.getInstance().getUploadTasksUnder(storage.getParent()).isEmpty()); @@ -282,69 +259,48 @@ public void addAndRemoveListeners() throws Exception { public void cancelledUpload() throws Exception { System.out.println("Starting test cancelledUpload."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("cancelledUpload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("cancelledUpload", true); Task task = TestUploadHelper.byteUploadCancel(); - for (int i = 0; i < 500000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("cancelledUpload", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + // TODO(mrschmidt): Lower the timeout + TestUtil.await(task, 500, TimeUnit.SECONDS); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("cancelledUpload", task.getResult().toString()); } @Test public void uploadWithSpace() throws Exception { System.out.println("Starting test uploadWithSpace."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("uploadWithSpace", true); - + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("uploadWithSpace", true); Task task = TestUploadHelper.uploadWithSpace(); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("uploadWithSpace", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("uploadWithSpace", task.getResult().toString()); } @Test public void smallTextUpload2() throws Exception { System.out.println("Starting test smallTextUpload2."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("smallTextUpload2", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("smallTextUpload2", true); Task task = TestUploadHelper.smallTextUpload2(); - for (int i = 0; i < 3000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("smallTextUpload2", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("smallTextUpload2", task.getResult().toString()); } @Test public void fileUpload() throws Exception { System.out.println("Starting test fileUpload."); - final MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileUpload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileUpload", true); String filename = TEST_ASSET_ROOT + "image.jpg"; ClassLoader classLoader = UploadTest.class.getClassLoader(); @@ -356,24 +312,18 @@ public void fileUpload() throws Exception { Shadows.shadowOf(resolver).registerInputStream(sourceFile, imageStream); Task task = TestUploadHelper.fileUpload(sourceFile, "image.jpg"); - for (int i = 0; i < 5000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("fileUpload", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task, 5, TimeUnit.SECONDS); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("fileUpload", task.getResult().toString()); } @Test public void emptyUpload() throws Exception { System.out.println("Starting test emptyUpload."); - final MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("emptyUpload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("emptyUpload", true); String filename = TEST_ASSET_ROOT + "empty.dat"; ClassLoader classLoader = UploadTest.class.getClassLoader(); @@ -385,17 +335,11 @@ public void emptyUpload() throws Exception { Shadows.shadowOf(resolver).registerInputStream(sourceFile, imageStream); Task task = TestUploadHelper.fileUpload(sourceFile, "empty.dat"); - for (int i = 0; i < 5000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("emptyUpload", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task, 5, TimeUnit.SECONDS); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("emptyUpload", task.getResult().toString()); } @Test @@ -404,7 +348,7 @@ public void fileUploadWithPauseCancel() throws Exception { ResumableUploadCancelRequest.CANCEL_CALLED = false; - final MockConnectionFactory factory = + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileUploadWithPauseCancel", true); factory.setPauseRecord(4); @@ -420,25 +364,19 @@ public void fileUploadWithPauseCancel() throws Exception { Task task = TestUploadHelper.fileUploadWithPauseCancel(factory.getSemaphore(), sourceFile); + // This is 20 seconds due to a fairness bug where resumed tasks can be put at the end. - for (int i = 0; i < 20000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - TestUtil.verifyTaskStateChanges("fileUploadWithPauseCancel", task.getResult().toString()); - Assert.assertTrue(ResumableUploadCancelRequest.CANCEL_CALLED); - return; - } - Thread.sleep(1); - } - Assert.fail(); + TestUtil.await(task, 20, TimeUnit.SECONDS); + + TestUtil.verifyTaskStateChanges("fileUploadWithPauseCancel", task.getResult().toString()); + Assert.assertTrue(ResumableUploadCancelRequest.CANCEL_CALLED); } @Test public void fileUploadWithPauseResume() throws Exception { System.out.println("Starting test fileUploadWithPauseResume."); - final MockConnectionFactory factory = + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileUploadWithPauseResume", true); factory.setPauseRecord(4); @@ -454,17 +392,11 @@ public void fileUploadWithPauseResume() throws Exception { Task task = TestUploadHelper.fileUploadWithPauseResume(factory.getSemaphore(), sourceFile); + // This is 20 seconds due to a fairness bug where resumed tasks can be put at the end. - for (int i = 0; i < 20000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - TestUtil.verifyTaskStateChanges("fileUploadWithPauseResume", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + TestUtil.await(task, 20, TimeUnit.SECONDS); + + TestUtil.verifyTaskStateChanges("fileUploadWithPauseResume", task.getResult().toString()); } @Test @@ -485,46 +417,33 @@ public void fileUploadWithQueueCancel() throws Exception { RuntimeEnvironment.application.getApplicationContext().getContentResolver(); Shadows.shadowOf(resolver).registerInputStream(sourceFile, imageStream); - Semaphore semaphore = TestUploadHelper.fileUploadQueuedCancel(taskOutput, sourceFile); - for (int i = 0; i < 2000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (semaphore.tryAcquire(1, 1, TimeUnit.MILLISECONDS)) { - // success! - TestUtil.verifyTaskStateChanges("fileUploadWithQueueCancel", taskOutput.toString()); - Assert.assertFalse(ResumableUploadCancelRequest.CANCEL_CALLED); - return; - } - } - Assert.fail(); + Task task = TestUploadHelper.fileUploadQueuedCancel(taskOutput, sourceFile); + + TestUtil.await(task, 2, TimeUnit.SECONDS); + + TestUtil.verifyTaskStateChanges("fileUploadWithQueueCancel", taskOutput.toString()); + Assert.assertFalse(ResumableUploadCancelRequest.CANCEL_CALLED); } @Test public void adaptiveChunking() throws Exception { System.out.println("Starting test adaptiveChunking."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("adaptiveChunking", false); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("adaptiveChunking", false); Task task = TestUploadHelper.adaptiveChunking(); - for (int i = 0; i < 5000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("adaptiveChunking", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("adaptiveChunking", task.getResult().toString()); } @Test public void fileUploadRecovery() throws Exception { System.out.println("Starting test fileUploadRecovery."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("fileUploadRecovery", false); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileUploadRecovery", false); String filename = TEST_ASSET_ROOT + "flubbertest.jpg"; ClassLoader classLoader = UploadTest.class.getClassLoader(); @@ -536,24 +455,18 @@ public void fileUploadRecovery() throws Exception { Shadows.shadowOf(resolver).registerInputStream(sourceFile, imageStream); Task task = TestUploadHelper.fileUpload(sourceFile, "flubbertest.jpg"); - for (int i = 0; i < 5000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("fileUploadRecovery", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task, 5, TimeUnit.SECONDS); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("fileUploadRecovery", task.getResult().toString()); } @Test public void fileUploadNoRecovery() throws Exception { System.out.println("Starting test fileUploadNoRecovery."); - final MockConnectionFactory factory = + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("fileUploadNoRecovery", false); String filename = TEST_ASSET_ROOT + "flubbertest.jpg"; @@ -566,39 +479,26 @@ public void fileUploadNoRecovery() throws Exception { Shadows.shadowOf(resolver).registerInputStream(sourceFile, imageStream); Task task = TestUploadHelper.fileUpload(sourceFile, "flubbertest.jpg"); - for (int i = 0; i < 5000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("fileUploadNoRecovery", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task, 5, TimeUnit.SECONDS); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("fileUploadNoRecovery", task.getResult().toString()); } @Test public void streamUploadWithInterruptions() throws InterruptedException { System.out.println("Starting test streamUploadWithInterruptions."); - final MockConnectionFactory factory = + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("streamUploadWithInterruptions", false); Task task = TestUploadHelper.streamUploadWithInterruptions(); - for (int i = 0; i < 5000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges( - "streamUploadWithInterruptions", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + TestUtil.await(task, 5, TimeUnit.SECONDS); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("streamUploadWithInterruptions", task.getResult().toString()); } @Test @@ -663,8 +563,7 @@ public void removeListeners() throws InterruptedException { public void badConnectivitySmallUpload() throws Exception { System.out.println("Starting test badConnectivitySmallUpload."); - final MockConnectionFactory factory = - NetworkLayerMock.ensureNetworkMock("smallTextUpload", true); + MockConnectionFactory factory = NetworkLayerMock.ensureNetworkMock("smallTextUpload", true); ConnectivityManager connectivityManager = (ConnectivityManager) @@ -693,17 +592,12 @@ public void advance(int millis) { }); Task task = TestUploadHelper.smallTextUpload(); - for (int i = 0; i < 300000; i++) { - Robolectric.flushForegroundThreadScheduler(); - if (task.isComplete()) { - // success! - factory.verifyOldMock(); - TestUtil.verifyTaskStateChanges("smallTextUpload", task.getResult().toString()); - return; - } - Thread.sleep(1); - } - Assert.fail(); + + // TODO(mrschmidt): Lower the timeout + TestUtil.await(task, 300, TimeUnit.SECONDS); + + factory.verifyOldMock(); + TestUtil.verifyTaskStateChanges("smallTextUpload", task.getResult().toString()); } finally { MockClockHelper.install(new MockClockHelper()); Shadows.shadowOf(connectivityManager).setActiveNetworkInfo(originalNetwork); diff --git a/firebase-storage/src/test/java/com/google/firebase/storage/network/MockConnectionFactory.java b/firebase-storage/src/test/java/com/google/firebase/storage/network/MockConnectionFactory.java index c5f7cfdfb73..9e09054aa04 100644 --- a/firebase-storage/src/test/java/com/google/firebase/storage/network/MockConnectionFactory.java +++ b/firebase-storage/src/test/java/com/google/firebase/storage/network/MockConnectionFactory.java @@ -36,8 +36,8 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.Semaphore; -import junit.framework.Assert; -import junit.framework.ComparisonFailure; +import org.junit.Assert; +import org.junit.ComparisonFailure; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.mockito.exceptions.base.MockitoAssertionError; diff --git a/firebase-storage/src/testUtil/java/com/google/firebase/storage/TestUploadHelper.java b/firebase-storage/src/testUtil/java/com/google/firebase/storage/TestUploadHelper.java index 118eb99f5d2..76b61e9b64c 100644 --- a/firebase-storage/src/testUtil/java/com/google/firebase/storage/TestUploadHelper.java +++ b/firebase-storage/src/testUtil/java/com/google/firebase/storage/TestUploadHelper.java @@ -509,8 +509,10 @@ public static Task fileUploadWithPauseResume( return task.continueWith(ignored -> builder); } - public static Semaphore fileUploadQueuedCancel( + public static Task fileUploadQueuedCancel( final StringBuilder builder, final Uri sourcefile) { + TaskCompletionSource result = new TaskCompletionSource<>(); + final StorageReference storage = FirebaseStorage.getInstance().getReference("image.jpg"); StorageMetadata metadata = new StorageMetadata.Builder() @@ -534,7 +536,7 @@ public static Semaphore fileUploadQueuedCancel( String statusMessage = "\nonComplete:Success=\n" + completedTask.isSuccessful(); Log.i(TAG, statusMessage); builder.append(statusMessage); - semaphore.release(); + result.setResult(null); }); // cancel while the task is still queued. @@ -542,7 +544,7 @@ public static Semaphore fileUploadQueuedCancel( ControllableSchedulerHelper.getInstance().resume(); - return semaphore; + return result.getTask(); } public static Task adaptiveChunking() {