Search in sources :

Example 1 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSourceTest method testOverread.

@Test
public void testOverread() throws HttpDataSourceException {
    testDataSpec = new DataSpec(Uri.parse(TEST_URL), 0, 16, null);
    testResponseHeader.put("Content-Length", Long.toString(16L));
    mockResponseStartSuccess();
    mockReadSuccess(0, 16);
    dataSourceUnderTest.open(testDataSpec);
    byte[] returnedBuffer = new byte[8];
    int bytesRead = dataSourceUnderTest.read(returnedBuffer, 0, 8);
    assertEquals(8, bytesRead);
    assertArrayEquals(buildTestDataArray(0, 8), returnedBuffer);
    // The current buffer is kept if not completely consumed by DataSource reader.
    returnedBuffer = new byte[8];
    bytesRead += dataSourceUnderTest.read(returnedBuffer, 0, 6);
    assertEquals(14, bytesRead);
    assertArrayEquals(suffixZeros(buildTestDataArray(8, 6), 8), returnedBuffer);
    // 2 bytes left at this point.
    returnedBuffer = new byte[8];
    bytesRead += dataSourceUnderTest.read(returnedBuffer, 0, 8);
    assertEquals(16, bytesRead);
    assertArrayEquals(suffixZeros(buildTestDataArray(14, 2), 8), returnedBuffer);
    // Should have only called read on cronet once.
    verify(mockUrlRequest, times(1)).read(any(ByteBuffer.class));
    verify(mockTransferListener, times(1)).onBytesTransferred(dataSourceUnderTest, 8);
    verify(mockTransferListener, times(1)).onBytesTransferred(dataSourceUnderTest, 6);
    verify(mockTransferListener, times(1)).onBytesTransferred(dataSourceUnderTest, 2);
    // Now we already returned the 16 bytes initially asked.
    // Try to read again even though all requested 16 bytes are already returned.
    // Return C.RESULT_END_OF_INPUT
    returnedBuffer = new byte[16];
    int bytesOverRead = dataSourceUnderTest.read(returnedBuffer, 0, 16);
    assertEquals(C.RESULT_END_OF_INPUT, bytesOverRead);
    assertArrayEquals(new byte[16], returnedBuffer);
    // C.RESULT_END_OF_INPUT should not be reported though the TransferListener.
    verify(mockTransferListener, never()).onBytesTransferred(dataSourceUnderTest, C.RESULT_END_OF_INPUT);
    // There should still be only one call to read on cronet.
    verify(mockUrlRequest, times(1)).read(any(ByteBuffer.class));
    // Check for connection not automatically closed.
    verify(mockUrlRequest, never()).cancel();
    assertEquals(16, bytesRead);
}
Also used : DataSpec(com.google.android.exoplayer2.upstream.DataSpec) ByteBuffer(java.nio.ByteBuffer) Test(org.junit.Test)

Example 2 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSourceTest method testRedirectIncreasesConnectionTimeout.

@Test
public void testRedirectIncreasesConnectionTimeout() throws InterruptedException {
    when(mockClock.elapsedRealtime()).thenReturn(0L);
    final ConditionVariable startCondition = buildUrlRequestStartedCondition();
    final ConditionVariable timedOutCondition = new ConditionVariable();
    final AtomicInteger openExceptions = new AtomicInteger(0);
    new Thread() {

        @Override
        public void run() {
            try {
                dataSourceUnderTest.open(testDataSpec);
                fail();
            } catch (HttpDataSourceException e) {
                // Expected.
                assertTrue(e instanceof CronetDataSource.OpenException);
                assertTrue(e.getCause() instanceof SocketTimeoutException);
                openExceptions.getAndIncrement();
                timedOutCondition.open();
            }
        }
    }.start();
    startCondition.block();
    // We should still be trying to open.
    assertFalse(timedOutCondition.block(50));
    // We should still be trying to open as we approach the timeout.
    when(mockClock.elapsedRealtime()).thenReturn((long) TEST_CONNECT_TIMEOUT_MS - 1);
    assertFalse(timedOutCondition.block(50));
    // A redirect arrives just in time.
    dataSourceUnderTest.onRedirectReceived(mockUrlRequest, testUrlResponseInfo, "RandomRedirectedUrl1");
    long newTimeoutMs = 2 * TEST_CONNECT_TIMEOUT_MS - 1;
    when(mockClock.elapsedRealtime()).thenReturn(newTimeoutMs - 1);
    // Give the thread some time to run.
    assertFalse(timedOutCondition.block(newTimeoutMs));
    // We should still be trying to open as we approach the new timeout.
    assertFalse(timedOutCondition.block(50));
    // A redirect arrives just in time.
    dataSourceUnderTest.onRedirectReceived(mockUrlRequest, testUrlResponseInfo, "RandomRedirectedUrl2");
    newTimeoutMs = 3 * TEST_CONNECT_TIMEOUT_MS - 2;
    when(mockClock.elapsedRealtime()).thenReturn(newTimeoutMs - 1);
    // Give the thread some time to run.
    assertFalse(timedOutCondition.block(newTimeoutMs));
    // We should still be trying to open as we approach the new timeout.
    assertFalse(timedOutCondition.block(50));
    // Now we timeout.
    when(mockClock.elapsedRealtime()).thenReturn(newTimeoutMs);
    timedOutCondition.block();
    verify(mockTransferListener, never()).onTransferStart(dataSourceUnderTest, testDataSpec);
    assertEquals(1, openExceptions.get());
}
Also used : ConditionVariable(android.os.ConditionVariable) SocketTimeoutException(java.net.SocketTimeoutException) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) HttpDataSourceException(com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException) Test(org.junit.Test)

Example 3 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSourceTest method testRequestHeadersSet.

@Test
public void testRequestHeadersSet() throws HttpDataSourceException {
    testDataSpec = new DataSpec(Uri.parse(TEST_URL), 1000, 5000, null);
    mockResponseStartSuccess();
    dataSourceUnderTest.setRequestProperty("firstHeader", "firstValue");
    dataSourceUnderTest.setRequestProperty("secondHeader", "secondValue");
    dataSourceUnderTest.open(testDataSpec);
    // The header value to add is current position to current position + length - 1.
    verify(mockUrlRequestBuilder).addHeader("Range", "bytes=1000-5999");
    verify(mockUrlRequestBuilder).addHeader("firstHeader", "firstValue");
    verify(mockUrlRequestBuilder).addHeader("secondHeader", "secondValue");
    verify(mockUrlRequest).start();
}
Also used : DataSpec(com.google.android.exoplayer2.upstream.DataSpec) Test(org.junit.Test)

Example 4 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSourceTest method testConnectTimeout.

@Test
public void testConnectTimeout() {
    when(mockClock.elapsedRealtime()).thenReturn(0L);
    final ConditionVariable startCondition = buildUrlRequestStartedCondition();
    final ConditionVariable timedOutCondition = new ConditionVariable();
    new Thread() {

        @Override
        public void run() {
            try {
                dataSourceUnderTest.open(testDataSpec);
                fail();
            } catch (HttpDataSourceException e) {
                // Expected.
                assertTrue(e instanceof CronetDataSource.OpenException);
                assertTrue(e.getCause() instanceof SocketTimeoutException);
                assertEquals(TEST_CONNECTION_STATUS, ((CronetDataSource.OpenException) e).cronetConnectionStatus);
                timedOutCondition.open();
            }
        }
    }.start();
    startCondition.block();
    // We should still be trying to open.
    assertFalse(timedOutCondition.block(50));
    // We should still be trying to open as we approach the timeout.
    when(mockClock.elapsedRealtime()).thenReturn((long) TEST_CONNECT_TIMEOUT_MS - 1);
    assertFalse(timedOutCondition.block(50));
    // Now we timeout.
    when(mockClock.elapsedRealtime()).thenReturn((long) TEST_CONNECT_TIMEOUT_MS);
    timedOutCondition.block();
    verify(mockTransferListener, never()).onTransferStart(dataSourceUnderTest, testDataSpec);
}
Also used : ConditionVariable(android.os.ConditionVariable) SocketTimeoutException(java.net.SocketTimeoutException) HttpDataSourceException(com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException) Test(org.junit.Test)

Example 5 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSourceTest method testConnectResponseBeforeTimeout.

@Test
public void testConnectResponseBeforeTimeout() {
    when(mockClock.elapsedRealtime()).thenReturn(0L);
    final ConditionVariable startCondition = buildUrlRequestStartedCondition();
    final ConditionVariable openCondition = new ConditionVariable();
    new Thread() {

        @Override
        public void run() {
            try {
                dataSourceUnderTest.open(testDataSpec);
                openCondition.open();
            } catch (HttpDataSourceException e) {
                fail();
            }
        }
    }.start();
    startCondition.block();
    // We should still be trying to open.
    assertFalse(openCondition.block(50));
    // We should still be trying to open as we approach the timeout.
    when(mockClock.elapsedRealtime()).thenReturn((long) TEST_CONNECT_TIMEOUT_MS - 1);
    assertFalse(openCondition.block(50));
    // The response arrives just in time.
    dataSourceUnderTest.onResponseStarted(mockUrlRequest, testUrlResponseInfo);
    openCondition.block();
}
Also used : ConditionVariable(android.os.ConditionVariable) HttpDataSourceException(com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)8 DataSpec (com.google.android.exoplayer2.upstream.DataSpec)5 ConditionVariable (android.os.ConditionVariable)3 HttpDataSourceException (com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException)3 SocketTimeoutException (java.net.SocketTimeoutException)3 DataSourceException (com.google.android.exoplayer2.upstream.DataSourceException)2 IOException (java.io.IOException)1 InterruptedIOException (java.io.InterruptedIOException)1 ByteBuffer (java.nio.ByteBuffer)1 List (java.util.List)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 MediaType (okhttp3.MediaType)1 Request (okhttp3.Request)1