From d9aee0f6a4b99831f20ed6b386c25eb6a65c2807 Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 11 Mar 2021 12:29:30 +0000 Subject: [PATCH] Add DataSource contract test for transfer listeners when opening fails. TransferListener has the contract to have exactly one onTransferEnd per onTransferStart, so the test can both assert that onTransferInitializing is called, but not onTransferEnd (even after calling close). PiperOrigin-RevId: 362262078 --- .../ByteArrayDataSourceContractTest.java | 5 +++ .../testutil/DataSourceContractTest.java | 36 +++++++++++++++---- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java index 1aa2198fc5..f1ffc48d9a 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java @@ -54,4 +54,9 @@ public class ByteArrayDataSourceContractTest extends DataSourceContractTest { @Test @Ignore public void resourceNotFound() {} + + @Override + @Test + @Ignore + public void resourceNotFound_transferListenerCallbacks() {} } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java index 144c2aa344..6e086878ed 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java @@ -20,8 +20,13 @@ import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Util.castNonNull; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import android.net.Uri; import androidx.annotation.Nullable; @@ -381,11 +386,8 @@ public abstract class DataSourceContractTest { @Test public void resourceNotFound() throws Exception { DataSource dataSource = createDataSource(); - try { - assertThrows(IOException.class, () -> dataSource.open(new DataSpec(getNotFoundUri()))); - } finally { - dataSource.close(); - } + assertThrows(IOException.class, () -> dataSource.open(new DataSpec(getNotFoundUri()))); + dataSource.close(); } @Test @@ -411,7 +413,7 @@ public abstract class DataSourceContractTest { try { dataSource.open(dataSpec); - // Verify onTransferInitializing() and onTransferStart() have been called exactly after + // Verify onTransferInitializing() and onTransferStart() have been called exactly from // DataSource.open(). ArgumentCaptor dataSpecArgumentCaptor = ArgumentCaptor.forClass(DataSpec.class); ArgumentCaptor isNetworkArgumentCaptor = ArgumentCaptor.forClass(Boolean.class); @@ -435,7 +437,7 @@ public abstract class DataSourceContractTest { } // Verify sufficient onBytesTransferred() callbacks have been triggered before closing the // DataSource. - assertThat(listener.bytesTransferred).isEqualTo(resource.getExpectedBytes().length); + assertThat(listener.bytesTransferred).isAtLeast(resource.getExpectedBytes().length); } finally { dataSource.close(); @@ -448,6 +450,26 @@ public abstract class DataSourceContractTest { } } + @Test + public void resourceNotFound_transferListenerCallbacks() throws Exception { + DataSource dataSource = createDataSource(); + TransferListener listener = mock(TransferListener.class); + dataSource.addTransferListener(listener); + @Nullable DataSource callbackSource = getTransferListenerDataSource(); + if (callbackSource == null) { + callbackSource = dataSource; + } + + assertThrows(IOException.class, () -> dataSource.open(new DataSpec(getNotFoundUri()))); + + // Verify onTransferInitializing() has been called exactly from DataSource.open(). + verify(listener).onTransferInitializing(eq(callbackSource), any(), anyBoolean()); + verifyNoMoreInteractions(listener); + + dataSource.close(); + verifyNoMoreInteractions(listener); + } + /** Build a label to make it clear which resource caused a given test failure. */ private static String getFailureLabel(List resources, int i) { if (resources.size() == 1) {