Resolve race condition and NPE for EditingMetricsCollectorTest

Previously, `exportSuccess_populatesEditingEndedEvent` and `exportError_populatesEditingEndedEvent` used an AtomicReference to capture the EditingEndedEvent. However, this led to a race condition where `EditingEndedEvent` was accessed before it was set in the `onMetricsReported` callback, resulting in a NullPointerException. This change replaces the AtomicReference with a SettableFuture to ensure the test waits for the event to be reported before asserting its value.

PiperOrigin-RevId: 739146511
This commit is contained in:
shahddaghash 2025-03-21 05:34:57 -07:00 committed by Copybara-Service
parent 3be1d5646f
commit 5f7066a9d9

View File

@ -43,6 +43,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Range; import com.google.common.collect.Range;
import com.google.common.util.concurrent.SettableFuture;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
@ -113,7 +114,7 @@ public class EditingMetricsCollectorTest {
testId, testId,
/* inputFormat= */ MP4_ASSET.videoFormat, /* inputFormat= */ MP4_ASSET.videoFormat,
/* outputFormat= */ MP4_ASSET.videoFormat); /* outputFormat= */ MP4_ASSET.videoFormat);
AtomicReference<EditingEndedEvent> editingEndedEventAtomicReference = new AtomicReference<>(); SettableFuture<EditingEndedEvent> editingEndedEventFuture = SettableFuture.create();
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
.setUsePlatformDiagnostics(true) .setUsePlatformDiagnostics(true)
@ -124,7 +125,7 @@ public class EditingMetricsCollectorTest {
@Override @Override
public void onMetricsReported(EditingEndedEvent editingEndedEvent) { public void onMetricsReported(EditingEndedEvent editingEndedEvent) {
editingEndedEventAtomicReference.set(editingEndedEvent); editingEndedEventFuture.set(editingEndedEvent);
} }
})) }))
.build(); .build();
@ -150,7 +151,7 @@ public class EditingMetricsCollectorTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
EditingEndedEvent editingEndedEvent = editingEndedEventAtomicReference.get(); EditingEndedEvent editingEndedEvent = editingEndedEventFuture.get();
assertThat(editingEndedEvent.getFinalState()) assertThat(editingEndedEvent.getFinalState())
.isEqualTo(EditingEndedEvent.FINAL_STATE_SUCCEEDED); .isEqualTo(EditingEndedEvent.FINAL_STATE_SUCCEEDED);
assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0); assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0);
@ -247,7 +248,7 @@ public class EditingMetricsCollectorTest {
testId, testId,
/* inputFormat= */ MP4_ASSET.videoFormat, /* inputFormat= */ MP4_ASSET.videoFormat,
/* outputFormat= */ MP4_ASSET.videoFormat); /* outputFormat= */ MP4_ASSET.videoFormat);
AtomicReference<EditingEndedEvent> editingEndedEventAtomicReference = new AtomicReference<>(); SettableFuture<EditingEndedEvent> editingEndedEventFuture = SettableFuture.create();
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
.setUsePlatformDiagnostics(true) .setUsePlatformDiagnostics(true)
@ -258,7 +259,7 @@ public class EditingMetricsCollectorTest {
@Override @Override
public void onMetricsReported(EditingEndedEvent editingEndedEvent) { public void onMetricsReported(EditingEndedEvent editingEndedEvent) {
editingEndedEventAtomicReference.set(editingEndedEvent); editingEndedEventFuture.set(editingEndedEvent);
} }
})) }))
.setMuxerFactory(new FailingMuxerFactory()) .setMuxerFactory(new FailingMuxerFactory())
@ -273,7 +274,7 @@ public class EditingMetricsCollectorTest {
.build() .build()
.run(testId, audioVideoItem)); .run(testId, audioVideoItem));
EditingEndedEvent editingEndedEvent = editingEndedEventAtomicReference.get(); EditingEndedEvent editingEndedEvent = editingEndedEventFuture.get();
assertThat(editingEndedEvent.getFinalState()).isEqualTo(EditingEndedEvent.FINAL_STATE_ERROR); assertThat(editingEndedEvent.getFinalState()).isEqualTo(EditingEndedEvent.FINAL_STATE_ERROR);
assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0); assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0);
assertThat(editingEndedEvent.getExporterName()).isEqualTo(EXPORTER_NAME); assertThat(editingEndedEvent.getExporterName()).isEqualTo(EXPORTER_NAME);
@ -290,7 +291,7 @@ public class EditingMetricsCollectorTest {
testId, testId,
/* inputFormat= */ MP4_ASSET.videoFormat, /* inputFormat= */ MP4_ASSET.videoFormat,
/* outputFormat= */ MP4_ASSET.videoFormat); /* outputFormat= */ MP4_ASSET.videoFormat);
AtomicReference<EditingEndedEvent> editingEndedEventAtomicReference = new AtomicReference<>(); SettableFuture<EditingEndedEvent> editingEndedEventFuture = SettableFuture.create();
CountDownLatch countDownLatch = new CountDownLatch(1); CountDownLatch countDownLatch = new CountDownLatch(1);
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
@ -302,7 +303,7 @@ public class EditingMetricsCollectorTest {
@Override @Override
public void onMetricsReported(EditingEndedEvent editingEndedEvent) { public void onMetricsReported(EditingEndedEvent editingEndedEvent) {
editingEndedEventAtomicReference.set(editingEndedEvent); editingEndedEventFuture.set(editingEndedEvent);
} }
})) }))
.setMuxerFactory( .setMuxerFactory(
@ -321,7 +322,7 @@ public class EditingMetricsCollectorTest {
} }
InstrumentationRegistry.getInstrumentation().runOnMainSync(transformer::cancel); InstrumentationRegistry.getInstrumentation().runOnMainSync(transformer::cancel);
EditingEndedEvent editingEndedEvent = editingEndedEventAtomicReference.get(); EditingEndedEvent editingEndedEvent = editingEndedEventFuture.get();
assertThat(editingEndedEvent.getFinalState()).isEqualTo(EditingEndedEvent.FINAL_STATE_CANCELED); assertThat(editingEndedEvent.getFinalState()).isEqualTo(EditingEndedEvent.FINAL_STATE_CANCELED);
assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0); assertThat(editingEndedEvent.getTimeSinceCreatedMillis()).isAtLeast(0);
assertThat(editingEndedEvent.getExporterName()).isEqualTo(EXPORTER_NAME); assertThat(editingEndedEvent.getExporterName()).isEqualTo(EXPORTER_NAME);