Fix flakiness in HlsPlaybackTest and DashPlaybackTest

The tests became more flaky after 76e4abe428, likely because playback
was able to start slightly earlier, exaggerating any existing race
conditions. Fix the flakiness by letting all tests with subtitle
parsing wait until all data is fully loaded before starting to play.

PiperOrigin-RevId: 693380656
This commit is contained in:
tonihei 2024-11-05 09:39:34 -08:00 committed by Copybara-Service
parent 28b75f7d29
commit d38aba92fe
2 changed files with 84 additions and 11 deletions

View File

@ -94,8 +94,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -132,6 +135,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player)
.ignoringNonFatalErrors()
.untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).ignoringNonFatalErrors().untilLoadingIs(false);
player.play(); player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED); run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release(); player.release();
@ -169,6 +177,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player)
.ignoringNonFatalErrors()
.untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).ignoringNonFatalErrors().untilLoadingIs(false);
player.play(); player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED); run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release(); player.release();
@ -204,8 +217,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-ttml/sample.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-ttml/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -233,8 +249,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/webvtt-in-mp4/sample.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/webvtt-in-mp4/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -261,8 +280,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -299,6 +321,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player)
.ignoringNonFatalErrors()
.untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).ignoringNonFatalErrors().untilLoadingIs(false);
player.play(); player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED); run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release(); player.release();
@ -336,6 +363,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player)
.ignoringNonFatalErrors()
.untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).ignoringNonFatalErrors().untilLoadingIs(false);
player.play(); player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED); run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release(); player.release();
@ -378,8 +410,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/cea608/manifest.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/cea608/manifest.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -416,8 +451,11 @@ public final class DashPlaybackTest {
trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en"));
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/cea608/manifest.mpd")); player.setMediaItem(MediaItem.fromUri("asset:///media/dash/cea608/manifest.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -651,8 +689,11 @@ public final class DashPlaybackTest {
player.setMediaItem( player.setMediaItem(
MediaItem.fromUri("asset:///media/dash/multi-period-with-offset/sample.mpd")); MediaItem.fromUri("asset:///media/dash/multi-period-with-offset/sample.mpd"));
player.prepare(); player.prepare();
// Ensure media is fully buffered to avoid flakiness from loading second period too late.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();

View File

@ -84,8 +84,11 @@ public final class HlsPlaybackTest {
player.setMediaItem( player.setMediaItem(
MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8")); MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -120,6 +123,11 @@ public final class HlsPlaybackTest {
player.setMediaItem( player.setMediaItem(
MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8")); MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player)
.ignoringNonFatalErrors()
.untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).ignoringNonFatalErrors().untilLoadingIs(false);
player.play(); player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED); run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release(); player.release();
@ -155,6 +163,11 @@ public final class HlsPlaybackTest {
player.setMediaItem( player.setMediaItem(
MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8")); MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player)
.ignoringNonFatalErrors()
.untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).ignoringNonFatalErrors().untilLoadingIs(false);
player.play(); player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED); run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release(); player.release();
@ -184,8 +197,11 @@ public final class HlsPlaybackTest {
player.setMediaItem( player.setMediaItem(
MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8")); MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -219,6 +235,11 @@ public final class HlsPlaybackTest {
player.setMediaItem( player.setMediaItem(
MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8")); MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player)
.ignoringNonFatalErrors()
.untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).ignoringNonFatalErrors().untilLoadingIs(false);
player.play(); player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED); run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release(); player.release();
@ -253,6 +274,11 @@ public final class HlsPlaybackTest {
player.setMediaItem( player.setMediaItem(
MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8")); MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player)
.ignoringNonFatalErrors()
.untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).ignoringNonFatalErrors().untilLoadingIs(false);
player.play(); player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED); run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release(); player.release();
@ -291,8 +317,11 @@ public final class HlsPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/hls/cea608/manifest.m3u8")); player.setMediaItem(MediaItem.fromUri("asset:///media/hls/cea608/manifest.m3u8"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();
@ -325,8 +354,11 @@ public final class HlsPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/hls/cea608/manifest.m3u8")); player.setMediaItem(MediaItem.fromUri("asset:///media/hls/cea608/manifest.m3u8"));
player.prepare(); player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilBackgroundThreadCondition(() -> player.getBufferedPercentage() == 100);
run(player).untilLoadingIs(false);
player.play(); player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); run(player).untilState(Player.STATE_ENDED);
player.release(); player.release();
surface.release(); surface.release();