diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/CompositionExportTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/CompositionExportTest.java index 8b14c736f4..3910209b53 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/CompositionExportTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/CompositionExportTest.java @@ -32,16 +32,15 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Context; import androidx.media3.common.MediaItem; import androidx.media3.common.MimeTypes; -import androidx.media3.common.util.Util; import androidx.media3.test.utils.DumpFileAsserts; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.common.collect.ImmutableList; -import java.nio.file.Files; -import java.nio.file.Paths; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; /** @@ -50,23 +49,19 @@ import org.junit.runner.RunWith; */ @RunWith(AndroidJUnit4.class) public class CompositionExportTest { + @Rule public final TemporaryFolder outputDir = new TemporaryFolder(); - private Context context; - private String outputPath; - private CapturingMuxer.Factory muxerFactory; + private final Context context = ApplicationProvider.getApplicationContext(); + private final CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(); @Before - public void setUp() throws Exception { - context = ApplicationProvider.getApplicationContext(); - outputPath = Util.createTempFile(context, "TransformerTest").getPath(); - muxerFactory = new CapturingMuxer.Factory(); + public void setUp() { addAudioDecoders(MimeTypes.AUDIO_RAW); addAudioEncoders(MimeTypes.AUDIO_AAC); } @After - public void tearDown() throws Exception { - Files.delete(Paths.get(outputPath)); + public void tearDown() { removeEncodersAndDecoders(); } @@ -76,7 +71,7 @@ public class CompositionExportTest { Transformer transformer = createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); ExportResult expectedExportResult = TransformerTestRunner.runLooper(transformer); EditedMediaItem audioEditedMediaItem = @@ -91,7 +86,7 @@ public class CompositionExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); // We can't compare the muxer output against a dump file because the asset loaders in each @@ -122,7 +117,7 @@ public class CompositionExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); assertThat(exportResult.processedInputs).hasSize(6); @@ -152,7 +147,7 @@ public class CompositionExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); assertThat(exportResult.processedInputs).hasSize(7); @@ -182,7 +177,7 @@ public class CompositionExportTest { Composition composition = new Composition.Builder(loopingAudioSequence, videoSequence).setTransmuxVideo(true).build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); assertThat(exportResult.durationMs).isEqualTo(31_053); @@ -205,7 +200,7 @@ public class CompositionExportTest { new EditedMediaItemSequence(rawAudioEditedMediaItem)) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); assertThat(exportResult.processedInputs).hasSize(2); @@ -234,7 +229,7 @@ public class CompositionExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); assertThat(exportResult.processedInputs).hasSize(2); @@ -263,7 +258,7 @@ public class CompositionExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); assertThat(exportResult.processedInputs).hasSize(7); diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java index bebd4b67b0..1b89e444a1 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java @@ -64,7 +64,6 @@ import androidx.media3.common.Format; import androidx.media3.common.MediaItem; import androidx.media3.common.MimeTypes; import androidx.media3.common.audio.SonicAudioProcessor; -import androidx.media3.common.util.Util; import androidx.media3.effect.Presentation; import androidx.media3.effect.ScaleAndRotateTransformation; import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; @@ -84,8 +83,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -97,7 +94,9 @@ import java.util.concurrent.atomic.AtomicReference; import org.junit.After; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.robolectric.shadows.ShadowMediaCodec; @@ -108,27 +107,22 @@ import org.robolectric.shadows.ShadowMediaCodec; */ @RunWith(AndroidJUnit4.class) public final class MediaItemExportTest { + @Rule public final TemporaryFolder outputDir = new TemporaryFolder(); - private Context context; - private String outputPath; - private CapturingMuxer.Factory muxerFactory; - private ProgressHolder progressHolder; - private ArgumentCaptor compositionArgumentCaptor; + private final Context context = ApplicationProvider.getApplicationContext(); + private final CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(); + private final ProgressHolder progressHolder = new ProgressHolder(); + private final ArgumentCaptor compositionArgumentCaptor = + ArgumentCaptor.forClass(Composition.class); @Before - public void setUp() throws Exception { - context = ApplicationProvider.getApplicationContext(); - outputPath = Util.createTempFile(context, "TransformerTest").getPath(); - muxerFactory = new CapturingMuxer.Factory(); - progressHolder = new ProgressHolder(); - compositionArgumentCaptor = ArgumentCaptor.forClass(Composition.class); + public void setUp() { addAudioDecoders(MimeTypes.AUDIO_RAW); addAudioEncoders(MimeTypes.AUDIO_AAC); } @After - public void tearDown() throws Exception { - Files.delete(Paths.get(outputPath)); + public void tearDown() { removeEncodersAndDecoders(); } @@ -138,7 +132,7 @@ public final class MediaItemExportTest { createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -152,7 +146,7 @@ public final class MediaItemExportTest { // No decoders or encoders for AMR NB. MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_AMR_NB); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -167,7 +161,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -182,7 +176,7 @@ public final class MediaItemExportTest { createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -205,7 +199,7 @@ public final class MediaItemExportTest { .build()) .build(); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -227,7 +221,7 @@ public final class MediaItemExportTest { .setRemoveAudio(true) .build(); - transformer.start(editedMediaItem, outputPath); + transformer.start(editedMediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -244,12 +238,11 @@ public final class MediaItemExportTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); // Transform first media item. - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile("first").getPath()); TransformerTestRunner.runLooper(transformer); - Files.delete(Paths.get(outputPath)); // Transform second media item. - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile("second").getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -257,14 +250,16 @@ public final class MediaItemExportTest { } @Test - public void start_concurrentExports_throwsError() { + public void start_concurrentExports_throwsError() throws Exception { Transformer transformer = createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile("first").getPath()); - assertThrows(IllegalStateException.class, () -> transformer.start(mediaItem, outputPath)); + assertThrows( + IllegalStateException.class, + () -> transformer.start(mediaItem, outputDir.newFile("second").getPath())); } @Test @@ -276,7 +271,7 @@ public final class MediaItemExportTest { .setRemoveAudio(true) .build(); - transformer.start(editedMediaItem, outputPath); + transformer.start(editedMediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -295,7 +290,7 @@ public final class MediaItemExportTest { .setRemoveVideo(true) .build(); - transformer.start(editedMediaItem, outputPath); + transformer.start(editedMediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -316,7 +311,7 @@ public final class MediaItemExportTest { .experimentalSetForceAudioTrack(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -334,7 +329,7 @@ public final class MediaItemExportTest { .experimentalSetForceAudioTrack(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -354,7 +349,7 @@ public final class MediaItemExportTest { .experimentalSetForceAudioTrack(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -381,7 +376,7 @@ public final class MediaItemExportTest { .experimentalSetForceAudioTrack(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -406,7 +401,7 @@ public final class MediaItemExportTest { .experimentalSetForceAudioTrack(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, @@ -426,7 +421,7 @@ public final class MediaItemExportTest { .experimentalSetForceAudioTrack(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -449,7 +444,7 @@ public final class MediaItemExportTest { .setEffects(createAudioEffects(sonicAudioProcessor)) .build(); - transformer.start(editedMediaItem, outputPath); + transformer.start(editedMediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -474,7 +469,7 @@ public final class MediaItemExportTest { .setTransmuxAudio(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( context, @@ -495,7 +490,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); verify(mockListener1).onCompleted(compositionArgumentCaptor.capture(), any()); @@ -505,7 +500,7 @@ public final class MediaItemExportTest { } @Test - public void start_withMultipleListeners_callsEachOnError() { + public void start_withMultipleListeners_callsEachOnError() throws Exception { Transformer.Listener mockListener1 = mock(Transformer.Listener.class); Transformer.Listener mockListener2 = mock(Transformer.Listener.class); Transformer.Listener mockListener3 = mock(Transformer.Listener.class); @@ -519,7 +514,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_AMR_WB); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); ExportException exception = assertThrows(ExportException.class, () -> TransformerTestRunner.runLooper(transformer)); @@ -546,7 +541,8 @@ public final class MediaItemExportTest { .build(); // No RAW encoder/muxer support, so fallback. - transformer.start(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW), outputPath); + transformer.start( + MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW), outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); verify(mockListener1) @@ -587,7 +583,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); assertThat(deprecatedFallbackCalled1.get()).isTrue(); @@ -629,7 +625,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri("invalid.uri"); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); try { TransformerTestRunner.runLooper(transformer); } catch (ExportException exportException) { @@ -659,7 +655,8 @@ public final class MediaItemExportTest { .build(); // No RAW encoder/muxer support, so fallback. - transformer.start(MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW), outputPath); + transformer.start( + MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW), outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); assertThat(deprecatedFallbackCalled.get()).isTrue(); @@ -680,7 +677,7 @@ public final class MediaItemExportTest { Transformer transformer2 = transformer1.buildUpon().removeListener(mockListener2).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer2.start(mediaItem, outputPath); + transformer2.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer2); verify(mockListener1).onCompleted(compositionArgumentCaptor.capture(), any()); @@ -698,7 +695,7 @@ public final class MediaItemExportTest { .setRemoveAudio(true) .build(); - transformer.start(editedMediaItem, outputPath); + transformer.start(editedMediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -714,7 +711,7 @@ public final class MediaItemExportTest { createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); assertThat(exportResult.averageAudioBitrate).isGreaterThan(0); @@ -722,7 +719,7 @@ public final class MediaItemExportTest { } @Test - public void start_whenCodecFailsToConfigure_completesWithError() { + public void start_whenCodecFailsToConfigure_completesWithError() throws Exception { String expectedFailureMessage = "Format not valid. AMR NB (3gpp)"; ShadowMediaCodec.CodecConfig throwOnConfigureCodecConfig = new ShadowMediaCodec.CodecConfig( @@ -751,7 +748,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); ExportException exception = assertThrows(ExportException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(exception.errorCode) @@ -761,14 +758,14 @@ public final class MediaItemExportTest { } @Test - public void start_withAudioFormatUnsupportedByDecoder_completesWithError() { + public void start_withAudioFormatUnsupportedByDecoder_completesWithError() throws Exception { Transformer transformer = createTransformerBuilder(muxerFactory, /* enableFallback= */ false) .setAudioMimeType(MimeTypes.AUDIO_AAC) // supported by encoder and muxer .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_AMR_WB); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); ExportException exception = assertThrows(ExportException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(exception).hasCauseThat().isInstanceOf(IllegalArgumentException.class); @@ -798,7 +795,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -832,7 +829,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_RAW); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -847,12 +844,12 @@ public final class MediaItemExportTest { } @Test - public void start_withIoError_completesWithError() { + public void start_withIoError_completesWithError() throws Exception { Transformer transformer = createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri("asset:///non-existing-path.mp4"); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); ExportException exception = assertThrows(ExportException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(exception).hasCauseThat().hasCauseThat().isInstanceOf(IOException.class); @@ -860,7 +857,7 @@ public final class MediaItemExportTest { } @Test - public void start_withSlowOutputSampleRate_completesWithError() { + public void start_withSlowOutputSampleRate_completesWithError() throws Exception { MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory( context, new SlowExtractorsFactory(/* delayBetweenReadsMs= */ 10)); @@ -880,7 +877,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); ExportException exception = assertThrows(ExportException.class, () -> TransformerTestRunner.runLooper(transformer)); assertThat(exception).hasCauseThat().isInstanceOf(IllegalStateException.class); @@ -895,7 +892,7 @@ public final class MediaItemExportTest { createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -908,12 +905,11 @@ public final class MediaItemExportTest { createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile("first").getPath()); transformer.cancel(); - Files.delete(Paths.get(outputPath)); // This would throw if the previous export had not been cancelled. - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile("second").getPath()); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); // TODO(b/264974805): Make export output deterministic and check it against dump file. @@ -937,7 +933,7 @@ public final class MediaItemExportTest { .post( () -> { try { - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); } catch (Exception e) { exception.set(e); @@ -961,6 +957,7 @@ public final class MediaItemExportTest { AtomicReference illegalStateException = new AtomicReference<>(); CountDownLatch countDownLatch = new CountDownLatch(1); + String outputPath = outputDir.newFile().getPath(); anotherThread.start(); new Handler(anotherThread.getLooper()) .post( @@ -989,7 +986,7 @@ public final class MediaItemExportTest { .build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); runLooperUntil(transformer.getApplicationLooper(), () -> sampleConsumerRef.get() != null); // Can never be false. @@ -997,7 +994,8 @@ public final class MediaItemExportTest { } @Test - public void start_withAssetLoaderNotDecodingAndDecodingNeeded_completesWithError() { + public void start_withAssetLoaderNotDecodingAndDecodingNeeded_completesWithError() + throws Exception { Transformer transformer = createTransformerBuilder(muxerFactory, /* enableFallback= */ false) .setAssetLoaderFactory( @@ -1010,7 +1008,7 @@ public final class MediaItemExportTest { .setEffects(createAudioEffects(createPitchChangingAudioProcessor(/* pitch= */ 2f))) .build(); - transformer.start(editedMediaItem, outputPath); + transformer.start(editedMediaItem, outputDir.newFile().getPath()); ExportException exportException = assertThrows(ExportException.class, () -> TransformerTestRunner.runLooper(transformer)); @@ -1031,7 +1029,7 @@ public final class MediaItemExportTest { EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); - transformer.start(editedMediaItem, outputPath); + transformer.start(editedMediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); // Video transcoding in unit tests is not supported. @@ -1051,7 +1049,7 @@ public final class MediaItemExportTest { EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); - transformer.start(editedMediaItem, outputPath); + transformer.start(editedMediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); // Video transcoding in unit tests is not supported. @@ -1102,7 +1100,7 @@ public final class MediaItemExportTest { } }; - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); progressHandler.sendEmptyMessage(0); TransformerTestRunner.runLooper(transformer); @@ -1132,7 +1130,7 @@ public final class MediaItemExportTest { } }; - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); progressHandler.sendEmptyMessage(0); TransformerTestRunner.runLooper(transformer); @@ -1151,7 +1149,7 @@ public final class MediaItemExportTest { MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); @Transformer.ProgressState int stateBeforeTransform = transformer.getProgress(progressHolder); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); @Transformer.ProgressState int stateAfterTransform = transformer.getProgress(progressHolder); @@ -1196,7 +1194,7 @@ public final class MediaItemExportTest { } }; - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); progressHandler.sendEmptyMessage(0); TransformerTestRunner.runLooper(transformer); @@ -1234,7 +1232,7 @@ public final class MediaItemExportTest { createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ONLY); - transformer.start(mediaItem, outputPath); + transformer.start(mediaItem, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); transformer.cancel(); } @@ -1334,7 +1332,7 @@ public final class MediaItemExportTest { } } - public static final class FakeAssetLoader implements AssetLoader { + private static final class FakeAssetLoader implements AssetLoader { public static final class Factory implements AssetLoader.Factory { diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/ParameterizedAudioExportTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/ParameterizedAudioExportTest.java index a4352ceb0e..c1e3637847 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/ParameterizedAudioExportTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/ParameterizedAudioExportTest.java @@ -114,6 +114,7 @@ public final class ParameterizedAudioExportTest { /* removeVideo= */ false)); @Rule public final TemporaryFolder outputDir = new TemporaryFolder(); + @Parameter public SequenceConfig sequence; private final CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(); diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/SequenceExportTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/SequenceExportTest.java index a702a02ed7..7954e49f00 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/SequenceExportTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/SequenceExportTest.java @@ -33,17 +33,16 @@ import static androidx.media3.transformer.TestUtil.removeEncodersAndDecoders; import android.content.Context; import androidx.media3.common.MediaItem; import androidx.media3.common.MimeTypes; -import androidx.media3.common.util.Util; import androidx.media3.effect.RgbFilter; import androidx.media3.test.utils.DumpFileAsserts; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.common.collect.ImmutableList; -import java.nio.file.Files; -import java.nio.file.Paths; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; /** @@ -59,23 +58,19 @@ import org.junit.runner.RunWith; */ @RunWith(AndroidJUnit4.class) public final class SequenceExportTest { + @Rule public final TemporaryFolder outputDir = new TemporaryFolder(); - private Context context; - private String outputPath; - private CapturingMuxer.Factory muxerFactory; + private final Context context = ApplicationProvider.getApplicationContext(); + private final CapturingMuxer.Factory muxerFactory = new CapturingMuxer.Factory(); @Before - public void setUp() throws Exception { - context = ApplicationProvider.getApplicationContext(); - outputPath = Util.createTempFile(context, "TransformerTest").getPath(); - muxerFactory = new CapturingMuxer.Factory(); + public void setUp() { addAudioDecoders(MimeTypes.AUDIO_RAW); addAudioEncoders(MimeTypes.AUDIO_AAC); } @After - public void tearDown() throws Exception { - Files.delete(Paths.get(outputPath)); + public void tearDown() { removeEncodersAndDecoders(); } @@ -91,7 +86,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -123,7 +118,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -169,7 +164,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -198,7 +193,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -226,7 +221,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -260,7 +255,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -294,7 +289,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -320,7 +315,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -351,7 +346,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -382,7 +377,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -416,7 +411,7 @@ public final class SequenceExportTest { .setTransmuxVideo(true) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -438,7 +433,7 @@ public final class SequenceExportTest { new Composition.Builder(new EditedMediaItemSequence(editedMediaItem, editedMediaItem)) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -464,7 +459,7 @@ public final class SequenceExportTest { new Composition.Builder(new EditedMediaItemSequence(editedMediaItem, editedMediaItem)) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -496,7 +491,7 @@ public final class SequenceExportTest { new Composition.Builder(new EditedMediaItemSequence(highPitchMediaItem, lowPitchMediaItem)) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -522,7 +517,7 @@ public final class SequenceExportTest { new EditedMediaItem.Builder(mono44100Audio).build())) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -553,7 +548,7 @@ public final class SequenceExportTest { new Composition.Builder(new EditedMediaItemSequence(stereo48000Audio, mono44100Audio)) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( @@ -585,7 +580,7 @@ public final class SequenceExportTest { new EditedMediaItemSequence(stereo48000AudioHighPitch, mono44100AudioLowPitch)) .build(); - transformer.start(composition, outputPath); + transformer.start(composition, outputDir.newFile().getPath()); TransformerTestRunner.runLooper(transformer); DumpFileAsserts.assertOutput( diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java index 9b3adac45f..dfd8d0b78d 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java @@ -35,29 +35,25 @@ import androidx.media3.test.utils.FakeClock; import androidx.media3.test.utils.FakeExtractorOutput; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import java.nio.file.Files; -import java.nio.file.Paths; -import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; /** End-to-end test for {@link Transformer} with {@link InAppMuxer}. */ @RunWith(AndroidJUnit4.class) public class TransformerWithInAppMuxerEndToEndTest { private static final String XMP_SAMPLE_DATA = "media/xmp/sample_datetime_xmp.xmp"; - private Context context; + + @Rule public final TemporaryFolder outputDir = new TemporaryFolder(); + + private final Context context = ApplicationProvider.getApplicationContext(); private String outputPath; @Before - public void setUp() throws Exception { - context = ApplicationProvider.getApplicationContext(); - outputPath = Util.createTempFile(context, "TransformerTest").getPath(); - } - - @After - public void tearDown() throws Exception { - Files.delete(Paths.get(outputPath)); + public void setup() throws Exception { + outputPath = outputDir.newFile().getPath(); } @Test