diff --git a/library/core/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java b/library/core/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java index 08b0c52fe5..2d74175265 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java @@ -38,7 +38,7 @@ public class VersionTableTest { @Before public void setUp() { - databaseProvider = TestUtil.getTestDatabaseProvider(); + databaseProvider = TestUtil.getInMemoryDatabaseProvider(); database = databaseProvider.getWritableDatabase(); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorTest.java index 54a14abeef..b80c8d3892 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorTest.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.extractor.ogg; -import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.testutil.ExtractorAsserts; @@ -59,7 +58,7 @@ public final class OggExtractorTest { OggTestData.buildOggHeader(0x02, 0, 1000, 1), TestUtil.createByteArray(7), // Laces new byte[] {0x01, 'v', 'o', 'r', 'b', 'i', 's'}); - assertThat(sniff(data)).isTrue(); + assertSniff(data, /* expectedResult= */ true); } @Test @@ -69,7 +68,7 @@ public final class OggExtractorTest { OggTestData.buildOggHeader(0x02, 0, 1000, 1), TestUtil.createByteArray(5), // Laces new byte[] {0x7F, 'F', 'L', 'A', 'C'}); - assertThat(sniff(data)).isTrue(); + assertSniff(data, /* expectedResult= */ true); } @Test @@ -77,13 +76,13 @@ public final class OggExtractorTest { byte[] data = TestUtil.joinByteArrays( OggTestData.buildOggHeader(0x02, 0, 1000, 0x00), new byte[] {'O', 'p', 'u', 's'}); - assertThat(sniff(data)).isFalse(); + assertSniff(data, /* expectedResult= */ false); } @Test public void testSniffFailsInvalidOggHeader() throws Exception { byte[] data = OggTestData.buildOggHeader(0x00, 0, 1000, 0x00); - assertThat(sniff(data)).isFalse(); + assertSniff(data, /* expectedResult= */ false); } @Test @@ -93,16 +92,17 @@ public final class OggExtractorTest { OggTestData.buildOggHeader(0x02, 0, 1000, 1), TestUtil.createByteArray(7), // Laces new byte[] {0x7F, 'X', 'o', 'r', 'b', 'i', 's'}); - assertThat(sniff(data)).isFalse(); + assertSniff(data, /* expectedResult= */ false); } @Test public void testSniffFailsEOF() throws Exception { byte[] data = OggTestData.buildOggHeader(0x02, 0, 1000, 0x00); - assertThat(sniff(data)).isFalse(); + assertSniff(data, /* expectedResult= */ false); } - private boolean sniff(byte[] data) throws InterruptedException, IOException { + private void assertSniff(byte[] data, boolean expectedResult) + throws InterruptedException, IOException { FakeExtractorInput input = new FakeExtractorInput.Builder() .setData(data) @@ -110,6 +110,6 @@ public final class OggExtractorTest { .setSimulateUnknownLength(true) .setSimulatePartialReads(true) .build(); - return TestUtil.sniffTestData(OGG_EXTRACTOR_FACTORY.create(), input); + ExtractorAsserts.assertSniff(OGG_EXTRACTOR_FACTORY.create(), input, expectedResult); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java index 3a3067853e..452f20e957 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java @@ -81,7 +81,7 @@ public class DownloadManagerTest { uri2 = Uri.parse("http://abc.com/media2"); uri3 = Uri.parse("http://abc.com/media3"); dummyMainThread = new DummyMainThread(); - downloadIndex = new DefaultDownloadIndex(TestUtil.getTestDatabaseProvider()); + downloadIndex = new DefaultDownloadIndex(TestUtil.getInMemoryDatabaseProvider()); downloaderFactory = new FakeDownloaderFactory(); setUpDownloadManager(100); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java index e28277d945..fda57cbce4 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java @@ -334,7 +334,7 @@ public class CachedContentIndexTest { } private CachedContentIndex newInstance() { - return new CachedContentIndex(TestUtil.getTestDatabaseProvider()); + return new CachedContentIndex(TestUtil.getInMemoryDatabaseProvider()); } private CachedContentIndex newLegacyInstance() { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTrackerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTrackerTest.java index 73780f56f3..a1c4d2b59d 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTrackerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTrackerTest.java @@ -66,7 +66,7 @@ public final class CachedRegionTrackerTest { tracker = new CachedRegionTracker(cache, CACHE_KEY, CHUNK_INDEX); cacheDir = Util.createTempDirectory(ApplicationProvider.getApplicationContext(), "ExoPlayerTest"); - index = new CachedContentIndex(TestUtil.getTestDatabaseProvider()); + index = new CachedContentIndex(TestUtil.getInMemoryDatabaseProvider()); } @After diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java index 39be9fbcd8..5908c7db20 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java @@ -51,7 +51,7 @@ public class SimpleCacheSpanTest { public void setUp() throws Exception { cacheDir = Util.createTempDirectory(ApplicationProvider.getApplicationContext(), "ExoPlayerTest"); - index = new CachedContentIndex(TestUtil.getTestDatabaseProvider()); + index = new CachedContentIndex(TestUtil.getInMemoryDatabaseProvider()); } @After diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java index fc229d9dc6..a8dbfe3b42 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java @@ -322,7 +322,7 @@ public class SimpleCacheTest { @Test public void testExceptionDuringEvictionByLeastRecentlyUsedCacheEvictorNotHang() throws Exception { CachedContentIndex contentIndex = - Mockito.spy(new CachedContentIndex(TestUtil.getTestDatabaseProvider())); + Mockito.spy(new CachedContentIndex(TestUtil.getInMemoryDatabaseProvider())); SimpleCache simpleCache = new SimpleCache( cacheDir, new LeastRecentlyUsedCacheEvictor(20), contentIndex, /* fileIndex= */ null); diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java index 5eec84408b..264b5d39e1 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java @@ -97,7 +97,7 @@ public class DownloadManagerDashTest { fakeStreamKey1 = new StreamKey(0, 0, 0); fakeStreamKey2 = new StreamKey(0, 1, 0); - downloadIndex = new DefaultDownloadIndex(TestUtil.getTestDatabaseProvider()); + downloadIndex = new DefaultDownloadIndex(TestUtil.getInMemoryDatabaseProvider()); createDownloadManager(); } diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java index 1527c5a544..fd295ea18d 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java @@ -112,7 +112,7 @@ public class DownloadServiceDashTest { dummyMainThread.runTestOnMainThread( () -> { DefaultDownloadIndex downloadIndex = - new DefaultDownloadIndex(TestUtil.getTestDatabaseProvider()); + new DefaultDownloadIndex(TestUtil.getInMemoryDatabaseProvider()); final DownloadManager dashDownloadManager = new DownloadManager( ApplicationProvider.getApplicationContext(), diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java index cf363f6266..b1ab3f94bb 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java @@ -467,6 +467,7 @@ public final class ActionSchedule { return apply(new ThrowPlaybackException(tag, exception)); } + /** Builds the schedule. */ public ActionSchedule build() { CallbackAction callbackAction = new CallbackAction(tag); apply(callbackAction); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java index a933121bc5..1ca4f1fb18 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java @@ -45,6 +45,29 @@ public final class ExtractorAsserts { private static final String DUMP_EXTENSION = ".dump"; private static final String UNKNOWN_LENGTH_EXTENSION = ".unklen" + DUMP_EXTENSION; + /** + * Asserts that {@link Extractor#sniff(ExtractorInput)} returns the {@code expectedResult} for a + * given {@code input}, retrying repeatedly when {@link SimulatedIOException} is thrown. + * + * @param extractor The extractor to test. + * @param input The extractor input. + * @param expectedResult The expected return value. + * @throws IOException If reading from the input fails. + * @throws InterruptedException If interrupted while reading from the input. + */ + public static void assertSniff( + Extractor extractor, FakeExtractorInput input, boolean expectedResult) + throws IOException, InterruptedException { + while (true) { + try { + assertThat(extractor.sniff(input)).isEqualTo(expectedResult); + return; + } catch (SimulatedIOException e) { + // Ignore. + } + } + } + /** * Asserts that an extractor behaves correctly given valid input data. Can only be used from * Robolectric tests. @@ -164,7 +187,7 @@ public final class ExtractorAsserts { .setSimulatePartialReads(simulatePartialReads).build(); if (sniffFirst) { - assertThat(TestUtil.sniffTestData(extractor, input)).isTrue(); + assertSniff(extractor, input, /* expectedResult= */ true); input.resetPeekPosition(); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java index facfa0d7e4..66ea480cc3 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java @@ -33,7 +33,6 @@ import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.SeekMap; -import com.google.android.exoplayer2.testutil.FakeExtractorInput.SimulatedIOException; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Assertions; @@ -50,17 +49,14 @@ public class TestUtil { private TestUtil() {} - public static boolean sniffTestData(Extractor extractor, FakeExtractorInput input) - throws IOException, InterruptedException { - while (true) { - try { - return extractor.sniff(input); - } catch (SimulatedIOException e) { - // Ignore. - } - } - } - + /** + * Given an open {@link DataSource}, repeatedly calls {@link DataSource#read(byte[], int, int)} + * until {@link C#RESULT_END_OF_INPUT} is returned. + * + * @param dataSource The source from which to read. + * @return The concatenation of all read data. + * @throws IOException If an error occurs reading from the source. + */ public static byte[] readToEnd(DataSource dataSource) throws IOException { byte[] data = new byte[1024]; int position = 0; @@ -77,6 +73,14 @@ public class TestUtil { return Arrays.copyOf(data, position); } + /** + * Given an open {@link DataSource}, repeatedly calls {@link DataSource#read(byte[], int, int)} + * until exactly {@code length} bytes have been read. + * + * @param dataSource The source from which to read. + * @return The read data. + * @throws IOException If an error occurs reading from the source. + */ public static byte[] readExactly(DataSource dataSource, int length) throws IOException { byte[] data = new byte[length]; int position = 0; @@ -91,22 +95,49 @@ public class TestUtil { return data; } + /** + * Equivalent to {@code buildTestData(length, length)}. + * + * @param length The length of the array. + * @return The generated array. + */ public static byte[] buildTestData(int length) { return buildTestData(length, length); } + /** + * Generates an array of random bytes with the specified length. + * + * @param length The length of the array. + * @param seed A seed for an internally created {@link Random source of randomness}. + * @return The generated array. + */ public static byte[] buildTestData(int length, int seed) { return buildTestData(length, new Random(seed)); } + /** + * Generates an array of random bytes with the specified length. + * + * @param length The length of the array. + * @param random A source of randomness. + * @return The generated array. + */ public static byte[] buildTestData(int length, Random random) { byte[] source = new byte[length]; random.nextBytes(source); return source; } - public static String buildTestString(int maxLength, Random random) { - int length = random.nextInt(maxLength); + /** + * Generates a random string with the specified maximum length. + * + * @param maximumLength The maximum length of the string. + * @param random A source of randomness. + * @return The generated string. + */ + public static String buildTestString(int maximumLength, Random random) { + int length = random.nextInt(maximumLength); StringBuilder builder = new StringBuilder(length); for (int i = 0; i < length; i++) { builder.append((char) random.nextInt()); @@ -129,6 +160,12 @@ public class TestUtil { return byteArray; } + /** + * Concatenates the provided byte arrays. + * + * @param byteArrays The byte arrays to concatenate. + * @return The concatenated result. + */ public static byte[] joinByteArrays(byte[]... byteArrays) { int length = 0; for (byte[] byteArray : byteArrays) { @@ -143,24 +180,28 @@ public class TestUtil { return joined; } + /** Returns the bytes of an asset file. */ public static byte[] getByteArray(Context context, String fileName) throws IOException { return Util.toByteArray(getInputStream(context, fileName)); } + /** Returns an {@link InputStream} for reading from an asset file. */ public static InputStream getInputStream(Context context, String fileName) throws IOException { return context.getResources().getAssets().open(fileName); } + /** Returns a {@link String} read from an asset file. */ public static String getString(Context context, String fileName) throws IOException { return Util.fromUtf8Bytes(getByteArray(context, fileName)); } - public static Bitmap readBitmapFromFile(Context context, String fileName) throws IOException { + /** Returns a {@link Bitmap} read from an asset file. */ + public static Bitmap getBitmap(Context context, String fileName) throws IOException { return BitmapFactory.decodeStream(getInputStream(context, fileName)); } - public static DatabaseProvider getTestDatabaseProvider() { - // Provides an in-memory database. + /** Returns a {@link DatabaseProvider} that provides an in-memory database. */ + public static DatabaseProvider getInMemoryDatabaseProvider() { return new DefaultDatabaseProvider( new SQLiteOpenHelper( /* context= */ null, /* name= */ null, /* factory= */ null, /* version= */ 1) {