From 4a8d28cef8034d65cba877925354b9773302fb87 Mon Sep 17 00:00:00 2001 From: shahddaghash Date: Mon, 17 Feb 2025 06:00:09 -0800 Subject: [PATCH] Add `EditingMetricsCollector` test for export error PiperOrigin-RevId: 727835981 (cherry picked from commit 6f60aa2548c556370f1e0bb1aaf33a42c460f33c) --- .../EditingMetricsCollectorTest.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/EditingMetricsCollectorTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/EditingMetricsCollectorTest.java index 78483b330a..5317a93cd2 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/EditingMetricsCollectorTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/EditingMetricsCollectorTest.java @@ -20,17 +20,26 @@ import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET; import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET; import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; import static org.junit.Assume.assumeTrue; import android.content.Context; +import android.media.MediaCodec; import android.media.metrics.EditingEndedEvent; import android.media.metrics.MediaItemInfo; import android.util.Size; +import androidx.media3.common.C; +import androidx.media3.common.Format; import androidx.media3.common.MediaItem; import androidx.media3.common.MediaLibraryInfo; +import androidx.media3.common.Metadata; import androidx.media3.common.util.Util; +import androidx.media3.muxer.MuxerException; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Range; +import java.nio.ByteBuffer; import java.util.concurrent.atomic.AtomicReference; import org.junit.Before; import org.junit.Rule; @@ -179,6 +188,41 @@ public class EditingMetricsCollectorTest { new Size(exportTestResult.exportResult.width, exportTestResult.exportResult.height)); } + @Test + public void exportError_populatesEditingEndedEvent() throws Exception { + assumeTrue("Reporting metrics requires API 35", Util.SDK_INT >= 35); + assumeFormatsSupported( + context, + testId, + /* inputFormat= */ MP4_ASSET.videoFormat, + /* outputFormat= */ MP4_ASSET.videoFormat); + AtomicReference editingEndedEventAtomicReference = new AtomicReference<>(); + Transformer transformer = + new Transformer.Builder(context) + .setUsePlatformDiagnostics(true) + .setMetricsReporterFactory( + new TestMetricsReporterFactory(context, editingEndedEventAtomicReference::set)) + .setMuxerFactory(new FailingMuxerFactory()) + .build(); + EditedMediaItem audioVideoItem = + new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri)).build(); + + assertThrows( + ExportException.class, + () -> + new TransformerAndroidTestRunner.Builder(context, transformer) + .build() + .run(testId, audioVideoItem)); + + EditingEndedEvent editingEndedEvent = editingEndedEventAtomicReference.get(); + assertThat(editingEndedEvent.getFinalState()).isEqualTo(EditingEndedEvent.FINAL_STATE_ERROR); + assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0); + assertThat(editingEndedEvent.getExporterName()).isEqualTo(EXPORTER_NAME); + assertThat(editingEndedEvent.getFinalProgressPercent()).isIn(Range.closed(0f, 100f)); + assertThat(editingEndedEvent.getErrorCode()) + .isEqualTo(EditingEndedEvent.ERROR_CODE_MUXING_FAILED); + } + private static final class TestMetricsReporterFactory implements EditingMetricsCollector.MetricsReporter.Factory { @@ -224,4 +268,58 @@ public class EditingMetricsCollectorTest { wrappedMetricsReporter.close(); } } + + private static final class FailingMuxerFactory implements Muxer.Factory { + + private final Muxer.Factory wrappedMuxerFactory; + + public FailingMuxerFactory() { + this.wrappedMuxerFactory = new DefaultMuxer.Factory(); + } + + @Override + public Muxer create(String path) throws MuxerException { + return new FailingMuxer(wrappedMuxerFactory.create(path)); + } + + @Override + public ImmutableList getSupportedSampleMimeTypes(@C.TrackType int trackType) { + return wrappedMuxerFactory.getSupportedSampleMimeTypes(trackType); + } + } + + private static final class FailingMuxer implements Muxer { + private final Muxer wrappedMuxer; + private boolean firstSampleWritten; + + public FailingMuxer(Muxer wrappedMuxer) { + this.wrappedMuxer = wrappedMuxer; + } + + @Override + public int addTrack(Format format) throws MuxerException { + return wrappedMuxer.addTrack(format); + } + + @Override + public void writeSampleData( + int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) + throws MuxerException { + if (firstSampleWritten) { + throw new MuxerException("Failed to write sample data", new RuntimeException()); + } + wrappedMuxer.writeSampleData(trackId, byteBuffer, bufferInfo); + firstSampleWritten = true; + } + + @Override + public void addMetadataEntry(Metadata.Entry metadataEntry) { + wrappedMuxer.addMetadataEntry(metadataEntry); + } + + @Override + public void close() throws MuxerException { + wrappedMuxer.close(); + } + } }