Effect Test: Use latch instead of thread.sleep.

The timeout time of 5000ms is quite long, and means that for tests with >1
VFPTestRunner, like texture output and compositor tests, we have to wait 10s.

The latch allows us to continue with the test once we're done processing input,
instead of needing to wait longer, until the timeout is reached.

PiperOrigin-RevId: 545159839
This commit is contained in:
huangdarwin 2023-07-03 09:03:10 +00:00 committed by microkatz
parent 6d351a3c12
commit 546b9a2a88

View File

@ -22,6 +22,7 @@ import static androidx.media3.test.utils.BitmapPixelTestUtil.createArgb8888Bitma
import static androidx.media3.test.utils.BitmapPixelTestUtil.maybeSaveTestBitmap; import static androidx.media3.test.utils.BitmapPixelTestUtil.maybeSaveTestBitmap;
import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@ -47,6 +48,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.util.List; import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@ -246,13 +248,12 @@ public final class VideoFrameProcessorTestRunner {
private final @MonotonicNonNull String videoAssetPath; private final @MonotonicNonNull String videoAssetPath;
private final String outputFileLabel; private final String outputFileLabel;
private final float pixelWidthHeightRatio; private final float pixelWidthHeightRatio;
private final @MonotonicNonNull CountDownLatch videoFrameProcessingEndedLatch;
private final AtomicReference<VideoFrameProcessingException> videoFrameProcessingException; private final AtomicReference<VideoFrameProcessingException> videoFrameProcessingException;
private final VideoFrameProcessor videoFrameProcessor; private final VideoFrameProcessor videoFrameProcessor;
private @MonotonicNonNull BitmapReader bitmapReader; private @MonotonicNonNull BitmapReader bitmapReader;
private volatile boolean videoFrameProcessingEnded;
private VideoFrameProcessorTestRunner( private VideoFrameProcessorTestRunner(
String testId, String testId,
VideoFrameProcessor.Factory videoFrameProcessorFactory, VideoFrameProcessor.Factory videoFrameProcessorFactory,
@ -271,6 +272,7 @@ public final class VideoFrameProcessorTestRunner {
this.videoAssetPath = videoAssetPath; this.videoAssetPath = videoAssetPath;
this.outputFileLabel = outputFileLabel; this.outputFileLabel = outputFileLabel;
this.pixelWidthHeightRatio = pixelWidthHeightRatio; this.pixelWidthHeightRatio = pixelWidthHeightRatio;
videoFrameProcessingEndedLatch = new CountDownLatch(1);
videoFrameProcessingException = new AtomicReference<>(); videoFrameProcessingException = new AtomicReference<>();
videoFrameProcessor = videoFrameProcessor =
@ -308,7 +310,7 @@ public final class VideoFrameProcessorTestRunner {
@Override @Override
public void onEnded() { public void onEnded() {
videoFrameProcessingEnded = true; checkNotNull(videoFrameProcessingEndedLatch).countDown();
} }
}); });
videoFrameProcessor.registerInputStream(inputType, effects); videoFrameProcessor.registerInputStream(inputType, effects);
@ -371,12 +373,18 @@ public final class VideoFrameProcessorTestRunner {
} }
/** Have the {@link VideoFrameProcessor} finish processing. */ /** Have the {@link VideoFrameProcessor} finish processing. */
public void endFrameProcessing(long videoFrameProcessingWaitTime) throws InterruptedException { public void endFrameProcessing(long videoFrameProcessingWaitTimeMs) throws InterruptedException {
videoFrameProcessor.signalEndOfInput(); videoFrameProcessor.signalEndOfInput();
Thread.sleep(videoFrameProcessingWaitTime);
try {
checkNotNull(videoFrameProcessingEndedLatch)
.await(videoFrameProcessingWaitTimeMs, MILLISECONDS);
} catch (InterruptedException e) {
// Report videoFrameProcessingException before potentially reporting a timeout
// InterruptedException.
assertThat(videoFrameProcessingException.get()).isNull(); assertThat(videoFrameProcessingException.get()).isNull();
assertThat(videoFrameProcessingEnded).isTrue(); throw e;
}
} }
/** /**