From 2716ff89db44c388bd0692b7d0f9bf37e5bfca6b Mon Sep 17 00:00:00 2001 From: samrobinson Date: Fri, 23 Dec 2022 10:29:28 +0000 Subject: [PATCH] Simplify TransformerEndToEndTest and TransformerTestRunner. PiperOrigin-RevId: 497335605 --- .../transformer/TransformerEndToEndTest.java | 96 +++++++++---------- .../transformer/TransformerTestRunner.java | 68 +++++-------- 2 files changed, 68 insertions(+), 96 deletions(-) diff --git a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerEndToEndTest.java b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerEndToEndTest.java index 470cb324d5..eb1d905cbb 100644 --- a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerEndToEndTest.java +++ b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerEndToEndTest.java @@ -77,7 +77,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import org.checkerframework.checker.nullness.compatqual.NullableType; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -131,7 +130,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_VIDEO_ONLY)); } @@ -143,7 +142,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, testMuxer, getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_ENCODER)); @@ -161,7 +160,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_ENCODER); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, testMuxer, getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_ENCODER + ".aac")); @@ -173,7 +172,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO)); } @@ -194,7 +193,7 @@ public final class TransformerEndToEndTest { .build(); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, @@ -212,7 +211,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SUBTITLES); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_WITH_SUBTITLES)); } @@ -225,12 +224,12 @@ public final class TransformerEndToEndTest { // Transform first media item. transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); Files.delete(Paths.get(outputPath)); // Transform second media item. transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO)); } @@ -253,7 +252,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO + ".noaudio")); @@ -266,7 +265,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO + ".novideo")); @@ -281,7 +280,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO + ".silentaudio")); @@ -298,7 +297,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO + ".48000hz")); @@ -318,7 +317,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); verify(mockListener1).onTransformationCompleted(eq(mediaItem), any()); verify(mockListener2).onTransformationCompleted(eq(mediaItem), any()); @@ -341,7 +340,9 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER); transformer.startTransformation(mediaItem, outputPath); - TransformationException exception = TransformerTestRunner.runUntilError(transformer); + TransformationException exception = + assertThrows( + TransformationException.class, () -> TransformerTestRunner.runLooper(transformer)); verify(mockListener1).onTransformationError(eq(mediaItem), any(), eq(exception)); verify(mockListener2).onTransformationError(eq(mediaItem), any(), eq(exception)); @@ -366,7 +367,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); verify(mockListener1) .onFallbackApplied(mediaItem, originalTransformationRequest, fallbackTransformationRequest); @@ -392,7 +393,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer2.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer2); + TransformerTestRunner.runLooper(transformer2); verify(mockListener1).onTransformationCompleted(eq(mediaItem), any()); verify(mockListener2, never()).onTransformationCompleted(eq(mediaItem), any()); @@ -409,31 +410,19 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_WITH_SEF_SLOW_MOTION); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_WITH_SEF_SLOW_MOTION)); } @Test public void startTransformation_completesWithValidBitrate() throws Exception { - AtomicReference<@NullableType TransformationResult> resultReference = new AtomicReference<>(); - Transformer.Listener listener = - new Transformer.Listener() { - @Override - public void onTransformationCompleted( - MediaItem inputMediaItem, TransformationResult transformationResult) { - resultReference.set(transformationResult); - } - }; - Transformer transformer = - createTransformerBuilder(/* enableFallback= */ false).addListener(listener).build(); + Transformer transformer = createTransformerBuilder(/* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformationResult result = TransformerTestRunner.runLooper(transformer); - @Nullable TransformationResult result = resultReference.get(); - assertThat(result).isNotNull(); assertThat(result.averageAudioBitrate).isGreaterThan(0); assertThat(result.averageVideoBitrate).isGreaterThan(0); } @@ -452,8 +441,9 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); transformer.startTransformation(mediaItem, outputPath); - TransformationException exception = TransformerTestRunner.runUntilError(transformer); - + TransformationException exception = + assertThrows( + TransformationException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(exception).hasCauseThat().isInstanceOf(IllegalArgumentException.class); assertThat(exception.errorCode) .isEqualTo(TransformationException.ERROR_CODE_ENCODING_FORMAT_UNSUPPORTED); @@ -472,8 +462,9 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_DECODER); transformer.startTransformation(mediaItem, outputPath); - TransformationException exception = TransformerTestRunner.runUntilError(transformer); - + TransformationException exception = + assertThrows( + TransformationException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(exception).hasCauseThat().isInstanceOf(IllegalArgumentException.class); assertThat(exception.errorCode) .isEqualTo(TransformationException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED); @@ -485,8 +476,9 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri("asset:///non-existing-path.mp4"); transformer.startTransformation(mediaItem, outputPath); - TransformationException exception = TransformerTestRunner.runUntilError(transformer); - + TransformationException exception = + assertThrows( + TransformationException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(exception).hasCauseThat().hasCauseThat().isInstanceOf(IOException.class); assertThat(exception.errorCode).isEqualTo(TransformationException.ERROR_CODE_IO_FILE_NOT_FOUND); } @@ -505,7 +497,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, testMuxer, getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_MUXER + ".fallback")); @@ -526,7 +518,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_UNSUPPORTED_BY_MUXER); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, testMuxer, getDumpFileName(FILE_AUDIO_UNSUPPORTED_BY_MUXER + ".fallback")); @@ -549,8 +541,9 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformationException exception = TransformerTestRunner.runUntilError(transformer); - + TransformationException exception = + assertThrows( + TransformationException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(exception).hasCauseThat().isInstanceOf(IllegalStateException.class); assertThat(exception.errorCode).isEqualTo(TransformationException.ERROR_CODE_MUXING_FAILED); } @@ -564,7 +557,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO)); } @@ -580,7 +573,7 @@ public final class TransformerEndToEndTest { // This would throw if the previous transformation had not been cancelled. transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput(context, testMuxer, getDumpFileName(FILE_AUDIO_VIDEO)); } @@ -601,7 +594,7 @@ public final class TransformerEndToEndTest { () -> { try { transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); } catch (Exception e) { exception.set(e); } finally { @@ -670,7 +663,8 @@ public final class TransformerEndToEndTest { transformer.startTransformation(mediaItem, outputPath); TransformationException transformationException = - TransformerTestRunner.runUntilError(transformer); + assertThrows( + TransformationException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(transformationException).hasCauseThat().isInstanceOf(IllegalStateException.class); } @@ -716,7 +710,7 @@ public final class TransformerEndToEndTest { transformer.startTransformation(mediaItem, outputPath); progressHandler.sendEmptyMessage(0); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); assertThat(foundInconsistentState.get()).isFalse(); } @@ -745,7 +739,7 @@ public final class TransformerEndToEndTest { transformer.startTransformation(mediaItem, outputPath); progressHandler.sendEmptyMessage(0); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); assertThat(progresses).isInOrder(); if (!progresses.isEmpty()) { @@ -763,7 +757,7 @@ public final class TransformerEndToEndTest { @Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); @Transformer.ProgressState int stateAfterTransform = transformer.getProgress(progressHolder); assertThat(stateBeforeTransform).isEqualTo(PROGRESS_STATE_NOT_STARTED); @@ -808,7 +802,7 @@ public final class TransformerEndToEndTest { transformer.startTransformation(mediaItem, outputPath); progressHandler.sendEmptyMessage(0); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); assertThat(foundInconsistentState.get()).isFalse(); } @@ -843,7 +837,7 @@ public final class TransformerEndToEndTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); transformer.startTransformation(mediaItem, outputPath); - TransformerTestRunner.runUntilCompleted(transformer); + TransformerTestRunner.runLooper(transformer); transformer.cancel(); } diff --git a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerTestRunner.java b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerTestRunner.java index 5da8063694..b414131124 100644 --- a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerTestRunner.java +++ b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerTestRunner.java @@ -17,12 +17,12 @@ package com.google.android.exoplayer2.transformer; import static com.google.android.exoplayer2.robolectric.RobolectricUtil.runLooperUntil; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; -import androidx.annotation.Nullable; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.robolectric.RobolectricUtil; +import java.util.Objects; import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import org.checkerframework.checker.nullness.compatqual.NullableType; @@ -32,55 +32,27 @@ public final class TransformerTestRunner { private TransformerTestRunner() {} /** - * Runs tasks of the {@link Transformer#getApplicationLooper() transformer Looper} until the - * current {@link Transformer transformation} completes. + * Runs tasks of the {@linkplain Transformer#getApplicationLooper() transformer Looper} until the + * {@linkplain Transformer transformation} ends. * * @param transformer The {@link Transformer}. + * @return The {@link TransformationResult}. + * @throws TransformationException If the transformation threw an exception. * @throws TimeoutException If the {@link RobolectricUtil#DEFAULT_TIMEOUT_MS default timeout} is * exceeded. - * @throws IllegalStateException If the method is not called from the main thread, or if the - * transformation completes with error. + * @throws IllegalStateException If the method is not called from the main thread. */ - public static void runUntilCompleted(Transformer transformer) throws TimeoutException { - @Nullable Exception exception = runUntilListenerCalled(transformer); - if (exception != null) { - throw new IllegalStateException(exception); - } - } - - /** - * Runs tasks of the {@link Transformer#getApplicationLooper() transformer Looper} until a {@link - * Transformer} error occurs. - * - * @param transformer The {@link Transformer}. - * @return The raised exception. - * @throws TimeoutException If the {@link RobolectricUtil#DEFAULT_TIMEOUT_MS default timeout} is - * exceeded. - * @throws IllegalStateException If the method is not called from the main thread, or if the - * transformation completes without error. - */ - public static TransformationException runUntilError(Transformer transformer) - throws TimeoutException { - @Nullable TransformationException exception = runUntilListenerCalled(transformer); - if (exception == null) { - throw new IllegalStateException("The transformation completed without error."); - } - return exception; - } - - @Nullable - private static TransformationException runUntilListenerCalled(Transformer transformer) - throws TimeoutException { - AtomicBoolean transformationCompleted = new AtomicBoolean(); - AtomicReference<@NullableType TransformationException> transformationException = + public static TransformationResult runLooper(Transformer transformer) + throws TransformationException, TimeoutException { + AtomicReference<@NullableType TransformationResult> transformationResultRef = new AtomicReference<>(); transformer.addListener( new Transformer.Listener() { @Override public void onTransformationCompleted( - MediaItem inputMediaItem, TransformationResult transformationResult) { - transformationCompleted.set(true); + MediaItem inputMediaItem, TransformationResult result) { + transformationResultRef.set(result); } @Override @@ -88,13 +60,19 @@ public final class TransformerTestRunner { MediaItem inputMediaItem, TransformationResult result, TransformationException exception) { - transformationException.set(exception); + if (!Objects.equals(result.transformationException, exception)) { + result = result.buildUpon().setTransformationException(exception).build(); + } + transformationResultRef.set(result); } }); - runLooperUntil( - transformer.getApplicationLooper(), - () -> transformationCompleted.get() || transformationException.get() != null); + runLooperUntil(transformer.getApplicationLooper(), () -> transformationResultRef.get() != null); - return transformationException.get(); + TransformationResult result = checkNotNull(transformationResultRef.get()); + if (result.transformationException != null) { + throw result.transformationException; + } + + return result; } }