Add unit tests for EditingMetricsCollector

The change includes adding a `MetricsReporter` interface with a default implementation to allow testing the `EditingMetricsCollector`.

PiperOrigin-RevId: 725607330
This commit is contained in:
shahddaghash 2025-02-11 06:32:02 -08:00 committed by Copybara-Service
parent fafd12bcfe
commit 1b882fec0c
3 changed files with 377 additions and 31 deletions

View File

@ -16,7 +16,6 @@
package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Util.usToMs;
import android.content.Context;
@ -37,15 +36,64 @@ import androidx.media3.common.util.SystemClock;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.List;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/**
* A metrics collector that collects editing events and forwards them to an {@link EditingSession}
* created by {@link MediaMetricsManager}.
* A metrics collector that collects editing events and forwards them to {@link MetricsReporter}.
*/
@RequiresApi(35)
/* package */ final class EditingMetricsCollector {
/** Reports the collected metrics. */
public interface MetricsReporter extends AutoCloseable {
/**
* Reports the given {@link EditingEndedEvent}.
*
* <p>The method should be called at most once.
*/
void reportMetrics(EditingEndedEvent editingEndedEvent);
}
/**
* A default implementation of {@link MetricsReporter} that reports metrics to an {@link
* EditingSession}.
*/
static final class DefaultMetricsReporter implements MetricsReporter {
/** The {@link EditingSession} to report collected metrics to. */
@Nullable private EditingSession editingSession;
/**
* Creates an instance.
*
* @param context A {@link Context}.
*/
public DefaultMetricsReporter(Context context) {
@Nullable
MediaMetricsManager mediaMetricsManager =
(MediaMetricsManager) context.getSystemService(Context.MEDIA_METRICS_SERVICE);
if (mediaMetricsManager != null) {
editingSession = mediaMetricsManager.createEditingSession();
}
}
@Override
public void reportMetrics(EditingEndedEvent editingEndedEvent) {
if (editingSession != null) {
editingSession.reportEditingEndedEvent(editingEndedEvent);
close();
}
}
@Override
public void close() {
if (editingSession != null) {
editingSession.close();
editingSession = null;
}
}
}
// TODO: b/386328723 - Add missing error codes to EditingEndedEvent.ErrorCode.
private static final SparseIntArray ERROR_CODE_CONVERSION_MAP = new SparseIntArray();
private static final SparseIntArray DATA_SPACE_STANDARD_CONVERSION_MAP = new SparseIntArray();
@ -128,10 +176,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
}
private static final int SUCCESS_PROGRESS_PERCENTAGE = 100;
private final long startTimeMs;
private final String exporterName;
@Nullable private final String muxerName;
private @MonotonicNonNull EditingSession editingSession;
private long startTimeMs;
private final MetricsReporter metricsReporter;
/**
* Creates an instance.
@ -141,22 +189,18 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
* <p>Both {@code exporterName} and {@code muxerName} should follow the format
* "<packageName>:<version>".
*
* @param context The {@link Context}.
* @param metricsReporter The {@link MetricsReporter} to report metrics.
* @param exporterName Java package name and version of the library or application implementing
* the editing operation.
* @param muxerName Java package name and version of the library or application that writes to the
* output file.
*/
public EditingMetricsCollector(Context context, String exporterName, @Nullable String muxerName) {
@Nullable
MediaMetricsManager mediaMetricsManager =
(MediaMetricsManager) context.getSystemService(Context.MEDIA_METRICS_SERVICE);
if (mediaMetricsManager != null) {
editingSession = checkNotNull(mediaMetricsManager.createEditingSession());
startTimeMs = SystemClock.DEFAULT.elapsedRealtime();
}
public EditingMetricsCollector(
MetricsReporter metricsReporter, String exporterName, @Nullable String muxerName) {
this.metricsReporter = metricsReporter;
this.exporterName = exporterName;
this.muxerName = muxerName;
startTimeMs = SystemClock.DEFAULT.elapsedRealtime();
}
/**
@ -165,9 +209,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
* @param exportResult The {@link ExportResult} of the export.
*/
public void onExportSuccess(ExportResult exportResult) {
if (editingSession == null) {
return;
}
EditingEndedEvent.Builder editingEndedEventBuilder =
createEditingEndedEventBuilder(EditingEndedEvent.FINAL_STATE_SUCCEEDED)
.setFinalProgressPercent(SUCCESS_PROGRESS_PERCENTAGE);
@ -180,8 +221,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
}
editingEndedEventBuilder.setOutputMediaItemInfo(getOutputMediaItemInfo(exportResult));
editingSession.reportEditingEndedEvent(editingEndedEventBuilder.build());
editingSession.close();
metricsReporter.reportMetrics(editingEndedEventBuilder.build());
}
/**
@ -194,9 +234,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
*/
public void onExportError(
int progressPercentage, ExportException exportException, ExportResult exportResult) {
if (editingSession == null) {
return;
}
EditingEndedEvent.Builder editingEndedEventBuilder =
createEditingEndedEventBuilder(EditingEndedEvent.FINAL_STATE_ERROR)
.setErrorCode(getEditingEndedEventErrorCode(exportException.errorCode));
@ -212,8 +249,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
}
editingEndedEventBuilder.setOutputMediaItemInfo(getOutputMediaItemInfo(exportResult));
editingSession.reportEditingEndedEvent(editingEndedEventBuilder.build());
editingSession.close();
metricsReporter.reportMetrics(editingEndedEventBuilder.build());
}
/**
@ -223,16 +259,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
* C#PERCENTAGE_UNSET} if unknown or between 0 and 100 inclusive.
*/
public void onExportCancelled(int progressPercentage) {
if (editingSession == null) {
return;
}
EditingEndedEvent.Builder editingEndedEventBuilder =
createEditingEndedEventBuilder(EditingEndedEvent.FINAL_STATE_CANCELED);
if (progressPercentage != C.PERCENTAGE_UNSET) {
editingEndedEventBuilder.setFinalProgressPercent(progressPercentage);
}
editingSession.reportEditingEndedEvent(editingEndedEventBuilder.build());
editingSession.close();
metricsReporter.reportMetrics(editingEndedEventBuilder.build());
}
private EditingEndedEvent.Builder createEditingEndedEventBuilder(int finalState) {

View File

@ -1588,7 +1588,11 @@ public final class Transformer {
} else if (muxerFactory instanceof DefaultMuxer.Factory) {
muxerName = DefaultMuxer.MUXER_NAME;
}
editingMetricsCollector = new EditingMetricsCollector(context, EXPORTER_NAME, muxerName);
editingMetricsCollector =
new EditingMetricsCollector(
new EditingMetricsCollector.DefaultMetricsReporter(context),
EXPORTER_NAME,
muxerName);
}
transformerInternal =
new TransformerInternal(

View File

@ -0,0 +1,309 @@
/*
* Copyright 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.media3.transformer;
import static androidx.media3.common.util.Util.usToMs;
import static com.google.common.truth.Truth.assertThat;
import android.hardware.DataSpace;
import android.media.metrics.EditingEndedEvent;
import android.media.metrics.MediaItemInfo;
import android.util.Size;
import androidx.media3.common.C;
import androidx.media3.common.ColorInfo;
import androidx.media3.common.Format;
import androidx.media3.common.MediaItem;
import androidx.media3.common.MediaLibraryInfo;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
/** Unit tests for {@link EditingMetricsCollector}. */
@Config(minSdk = 35)
@RunWith(AndroidJUnit4.class)
public final class EditingMetricsCollectorTest {
private static final int MEDIA_DURATION_US = 1_000_000_000;
private static final String EXPORTER_NAME =
"androidx.media3.media3-transformer:" + MediaLibraryInfo.VERSION;
private static final String MUXER_NAME =
"androidx.media3.media3-muxer:" + MediaLibraryInfo.VERSION;
private static final String VIDEO_MIME_TYPE = "video/hevc";
private static final String AUDIO_MIME_TYPE = "audio/mp4a-latm";
private static final String VIDEO_ENCODER_NAME = "c2.android.hevc.encoder";
private static final String AUDIO_ENCODER_NAME = "c2.android.aac.encoder";
private static final String VIDEO_DECODER_NAME = "c2.android.hevc.decoder";
private static final String AUDIO_DECODER_NAME = "c2.android.aac.decoder";
private static final float VIDEO_FRAME_RATE = 30.0f;
private static final Size VIDEO_SIZE = new Size(/* width= */ 1920, /* height= */ 1080);
private static final ColorInfo VIDEO_COLOR_INFO =
new ColorInfo.Builder()
.setColorSpace(C.COLOR_SPACE_BT2020)
.setColorTransfer(C.COLOR_TRANSFER_ST2084)
.setColorRange(C.COLOR_RANGE_LIMITED)
.build();
private static final int AUDIO_SAMPLE_RATE = 48_000;
private static final int AUDIO_CHANNEL_COUNT = 2;
private static final Format FAKE_AUDIO_FORMAT =
new Format.Builder()
.setSampleMimeType(AUDIO_MIME_TYPE)
.setSampleRate(AUDIO_SAMPLE_RATE)
.setChannelCount(AUDIO_CHANNEL_COUNT)
.setPcmEncoding(C.ENCODING_PCM_16BIT)
.build();
private static final Format FAKE_VIDEO_FORMAT =
new Format.Builder()
.setContainerMimeType(VIDEO_MIME_TYPE)
.setSampleMimeType(VIDEO_MIME_TYPE)
.setFrameRate(VIDEO_FRAME_RATE)
.setWidth(VIDEO_SIZE.getWidth())
.setHeight(VIDEO_SIZE.getHeight())
.setColorInfo(VIDEO_COLOR_INFO)
.build();
@Test
public void onExportSuccess_populatesEditingEndedEvent() {
List<ExportResult.ProcessedInput> processedInputs = new ArrayList<>();
processedInputs.add(
new ExportResult.ProcessedInput(
MediaItem.EMPTY,
MEDIA_DURATION_US,
FAKE_AUDIO_FORMAT,
FAKE_VIDEO_FORMAT,
AUDIO_DECODER_NAME,
VIDEO_DECODER_NAME));
ExportResult exportResult =
new ExportResult.Builder()
.setDurationMs(usToMs(MEDIA_DURATION_US))
.setAudioMimeType(AUDIO_MIME_TYPE)
.setVideoMimeType(VIDEO_MIME_TYPE)
.setChannelCount(AUDIO_CHANNEL_COUNT)
.setSampleRate(AUDIO_SAMPLE_RATE)
.setAudioEncoderName(AUDIO_ENCODER_NAME)
.setVideoEncoderName(VIDEO_ENCODER_NAME)
.setVideoFrameCount(2400)
.setWidth(VIDEO_SIZE.getWidth())
.setHeight(VIDEO_SIZE.getHeight())
.setColorInfo(VIDEO_COLOR_INFO)
.addProcessedInputs(processedInputs)
.build();
AtomicReference<EditingEndedEvent> editingEndedEventAtomicReference = new AtomicReference<>();
EditingMetricsCollector editingMetricsCollector =
new EditingMetricsCollector(
new EditingMetricsCollector.MetricsReporter() {
@Override
public void reportMetrics(EditingEndedEvent editingEndedEvent) {
editingEndedEventAtomicReference.set(editingEndedEvent);
}
@Override
public void close() {}
},
EXPORTER_NAME,
MUXER_NAME);
editingMetricsCollector.onExportSuccess(exportResult);
EditingEndedEvent editingEndedEvent = editingEndedEventAtomicReference.get();
assertThat(editingEndedEvent.getFinalState())
.isEqualTo(EditingEndedEvent.FINAL_STATE_SUCCEEDED);
assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0);
assertThat(editingEndedEvent.getExporterName()).isEqualTo(EXPORTER_NAME);
assertThat(editingEndedEvent.getMuxerName()).isEqualTo(MUXER_NAME);
assertThat(editingEndedEvent.getFinalProgressPercent()).isEqualTo(100);
assertThat(editingEndedEvent.getInputMediaItemInfos()).hasSize(1);
// Assert input media items information
MediaItemInfo inputMediaItemInfo = editingEndedEvent.getInputMediaItemInfos().get(0);
assertThat(inputMediaItemInfo.getClipDurationMillis())
.isEqualTo(usToMs(processedInputs.get(0).durationUs));
assertThat(inputMediaItemInfo.getCodecNames().get(0)).isEqualTo(VIDEO_DECODER_NAME);
assertThat(inputMediaItemInfo.getCodecNames().get(1)).isEqualTo(AUDIO_DECODER_NAME);
assertThat(inputMediaItemInfo.getContainerMimeType()).isEqualTo(VIDEO_MIME_TYPE);
assertThat(inputMediaItemInfo.getSampleMimeTypes()).hasSize(2);
assertThat(inputMediaItemInfo.getSampleMimeTypes().get(0))
.isAnyOf(AUDIO_MIME_TYPE, VIDEO_MIME_TYPE);
assertThat(inputMediaItemInfo.getSampleMimeTypes().get(1))
.isAnyOf(AUDIO_MIME_TYPE, VIDEO_MIME_TYPE);
assertThat(inputMediaItemInfo.getDataTypes())
.isEqualTo(MediaItemInfo.DATA_TYPE_VIDEO | MediaItemInfo.DATA_TYPE_AUDIO);
assertThat(inputMediaItemInfo.getVideoFrameRate()).isEqualTo(VIDEO_FRAME_RATE);
assertThat(inputMediaItemInfo.getVideoSize()).isEqualTo(VIDEO_SIZE);
assertThat(inputMediaItemInfo.getVideoDataSpace())
.isEqualTo(
DataSpace.pack(
DataSpace.STANDARD_BT2020, DataSpace.TRANSFER_ST2084, DataSpace.RANGE_LIMITED));
assertThat(inputMediaItemInfo.getAudioChannelCount()).isEqualTo(AUDIO_CHANNEL_COUNT);
assertThat(inputMediaItemInfo.getAudioSampleRateHz()).isEqualTo(AUDIO_SAMPLE_RATE);
// Assert output media item information
MediaItemInfo outputMediaItemInfo = editingEndedEvent.getOutputMediaItemInfo();
assertThat(outputMediaItemInfo).isNotNull();
assertThat(outputMediaItemInfo.getDurationMillis()).isEqualTo(exportResult.durationMs);
assertThat(outputMediaItemInfo.getSampleMimeTypes()).hasSize(2);
assertThat(outputMediaItemInfo.getSampleMimeTypes().get(0))
.isAnyOf(exportResult.audioMimeType, exportResult.videoMimeType);
assertThat(outputMediaItemInfo.getSampleMimeTypes().get(1))
.isAnyOf(exportResult.audioMimeType, exportResult.videoMimeType);
assertThat(outputMediaItemInfo.getAudioChannelCount()).isEqualTo(exportResult.channelCount);
assertThat(outputMediaItemInfo.getAudioSampleRateHz()).isEqualTo(exportResult.sampleRate);
assertThat(outputMediaItemInfo.getCodecNames()).hasSize(2);
assertThat(outputMediaItemInfo.getCodecNames().get(0))
.isAnyOf(exportResult.audioEncoderName, exportResult.videoEncoderName);
assertThat(outputMediaItemInfo.getCodecNames().get(1))
.isAnyOf(exportResult.audioEncoderName, exportResult.videoEncoderName);
assertThat(outputMediaItemInfo.getVideoSampleCount()).isEqualTo(exportResult.videoFrameCount);
assertThat(outputMediaItemInfo.getVideoSize())
.isEqualTo(new Size(exportResult.width, exportResult.height));
assertThat(inputMediaItemInfo.getVideoDataSpace())
.isEqualTo(
DataSpace.pack(
DataSpace.STANDARD_BT2020, DataSpace.TRANSFER_ST2084, DataSpace.RANGE_LIMITED));
}
@Test
public void onExportError_populatesEditingEndedEvent() {
List<ExportResult.ProcessedInput> processedInputs = new ArrayList<>();
processedInputs.add(
new ExportResult.ProcessedInput(
MediaItem.EMPTY,
MEDIA_DURATION_US,
FAKE_AUDIO_FORMAT,
FAKE_VIDEO_FORMAT,
AUDIO_DECODER_NAME,
VIDEO_DECODER_NAME));
ExportResult exportResult =
new ExportResult.Builder()
.setDurationMs(usToMs(MEDIA_DURATION_US))
.setAudioMimeType(AUDIO_MIME_TYPE)
.setVideoMimeType(VIDEO_MIME_TYPE)
.setChannelCount(AUDIO_CHANNEL_COUNT)
.setSampleRate(AUDIO_SAMPLE_RATE)
.setAudioEncoderName(AUDIO_ENCODER_NAME)
.setVideoEncoderName(VIDEO_ENCODER_NAME)
.setVideoFrameCount(2400)
.setWidth(VIDEO_SIZE.getWidth())
.setHeight(VIDEO_SIZE.getHeight())
.setColorInfo(VIDEO_COLOR_INFO)
.addProcessedInputs(processedInputs)
.build();
ExportException exception =
ExportException.createForMuxer(
new RuntimeException(), ExportException.ERROR_CODE_MUXING_FAILED);
AtomicReference<EditingEndedEvent> editingEndedEventAtomicReference = new AtomicReference<>();
EditingMetricsCollector editingMetricsCollector =
new EditingMetricsCollector(
new EditingMetricsCollector.MetricsReporter() {
@Override
public void reportMetrics(EditingEndedEvent editingEndedEvent) {
editingEndedEventAtomicReference.set(editingEndedEvent);
}
@Override
public void close() {}
},
EXPORTER_NAME,
MUXER_NAME);
int progressPercentage = 10;
editingMetricsCollector.onExportError(progressPercentage, exception, exportResult);
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.getMuxerName()).isEqualTo(MUXER_NAME);
assertThat(editingEndedEvent.getFinalProgressPercent()).isEqualTo(progressPercentage);
assertThat(editingEndedEvent.getErrorCode())
.isEqualTo(EditingEndedEvent.ERROR_CODE_MUXING_FAILED);
// Assert input media items information
assertThat(editingEndedEvent.getInputMediaItemInfos()).hasSize(1);
MediaItemInfo inputMediaItemInfo = editingEndedEvent.getInputMediaItemInfos().get(0);
assertThat(inputMediaItemInfo.getClipDurationMillis())
.isEqualTo(usToMs(processedInputs.get(0).durationUs));
assertThat(inputMediaItemInfo.getCodecNames().get(0)).isEqualTo(VIDEO_DECODER_NAME);
assertThat(inputMediaItemInfo.getCodecNames().get(1)).isEqualTo(AUDIO_DECODER_NAME);
assertThat(inputMediaItemInfo.getContainerMimeType()).isEqualTo(VIDEO_MIME_TYPE);
assertThat(inputMediaItemInfo.getSampleMimeTypes()).hasSize(2);
assertThat(inputMediaItemInfo.getSampleMimeTypes().get(0))
.isAnyOf(AUDIO_MIME_TYPE, VIDEO_MIME_TYPE);
assertThat(inputMediaItemInfo.getSampleMimeTypes().get(1))
.isAnyOf(AUDIO_MIME_TYPE, VIDEO_MIME_TYPE);
assertThat(inputMediaItemInfo.getDataTypes())
.isEqualTo(MediaItemInfo.DATA_TYPE_VIDEO | MediaItemInfo.DATA_TYPE_AUDIO);
assertThat(inputMediaItemInfo.getVideoFrameRate()).isEqualTo(VIDEO_FRAME_RATE);
assertThat(inputMediaItemInfo.getVideoSize()).isEqualTo(VIDEO_SIZE);
assertThat(inputMediaItemInfo.getVideoDataSpace())
.isEqualTo(
DataSpace.pack(
DataSpace.STANDARD_BT2020, DataSpace.TRANSFER_ST2084, DataSpace.RANGE_LIMITED));
assertThat(inputMediaItemInfo.getAudioChannelCount()).isEqualTo(AUDIO_CHANNEL_COUNT);
assertThat(inputMediaItemInfo.getAudioSampleRateHz()).isEqualTo(AUDIO_SAMPLE_RATE);
// Assert output media item information
MediaItemInfo outputMediaItemInfo = editingEndedEvent.getOutputMediaItemInfo();
assertThat(outputMediaItemInfo).isNotNull();
assertThat(outputMediaItemInfo.getDurationMillis()).isEqualTo(exportResult.durationMs);
assertThat(outputMediaItemInfo.getSampleMimeTypes()).hasSize(2);
assertThat(outputMediaItemInfo.getSampleMimeTypes().get(0))
.isAnyOf(exportResult.audioMimeType, exportResult.videoMimeType);
assertThat(outputMediaItemInfo.getSampleMimeTypes().get(1))
.isAnyOf(exportResult.audioMimeType, exportResult.videoMimeType);
assertThat(outputMediaItemInfo.getAudioChannelCount()).isEqualTo(exportResult.channelCount);
assertThat(outputMediaItemInfo.getAudioSampleRateHz()).isEqualTo(exportResult.sampleRate);
assertThat(outputMediaItemInfo.getCodecNames()).hasSize(2);
assertThat(outputMediaItemInfo.getCodecNames().get(0))
.isAnyOf(exportResult.audioEncoderName, exportResult.videoEncoderName);
assertThat(outputMediaItemInfo.getCodecNames().get(1))
.isAnyOf(exportResult.audioEncoderName, exportResult.videoEncoderName);
assertThat(outputMediaItemInfo.getVideoSampleCount()).isEqualTo(exportResult.videoFrameCount);
assertThat(outputMediaItemInfo.getVideoSize())
.isEqualTo(new Size(exportResult.width, exportResult.height));
assertThat(inputMediaItemInfo.getVideoDataSpace())
.isEqualTo(
DataSpace.pack(
DataSpace.STANDARD_BT2020, DataSpace.TRANSFER_ST2084, DataSpace.RANGE_LIMITED));
}
@Test
public void onExportCancelled_populatesEditingEndedEvent() {
AtomicReference<EditingEndedEvent> editingEndedEventAtomicReference = new AtomicReference<>();
EditingMetricsCollector editingMetricsCollector =
new EditingMetricsCollector(
new EditingMetricsCollector.MetricsReporter() {
@Override
public void reportMetrics(EditingEndedEvent editingEndedEvent) {
editingEndedEventAtomicReference.set(editingEndedEvent);
}
@Override
public void close() {}
},
EXPORTER_NAME,
MUXER_NAME);
int progressPercentage = 70;
editingMetricsCollector.onExportCancelled(progressPercentage);
EditingEndedEvent editingEndedEvent = editingEndedEventAtomicReference.get();
assertThat(editingEndedEvent.getFinalState()).isEqualTo(EditingEndedEvent.FINAL_STATE_CANCELED);
assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0);
assertThat(editingEndedEvent.getExporterName()).isEqualTo(EXPORTER_NAME);
assertThat(editingEndedEvent.getMuxerName()).isEqualTo(MUXER_NAME);
assertThat(editingEndedEvent.getFinalProgressPercent()).isEqualTo(progressPercentage);
}
}