ServerSideAdInsertionMediaSourceTest adjustments

Some adjustments to the test to make it more correct and prevent it
from becoming flaky:
 - Use separate output dump files per test setup. Once we add more data
   to these files, they are not guaranteed to be the same anymore.
 - Use a seek position that is actually behind the midroll as described
   in the test setup.
 - Change ad insertion position to ensure the ad group duration doesn't
   exceed the underlying media duration.
 - Add a wait for isLoading to ensure the late insertion of an ad group
   happens consistently at the same processing stage.

PiperOrigin-RevId: 546825183
This commit is contained in:
tonihei 2023-07-10 11:58:56 +01:00 committed by Rohit Singh
parent ddd000128f
commit d6f20455ac
4 changed files with 169 additions and 6 deletions

View file

@ -20,6 +20,7 @@ import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.exoplayer.source.ads.ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState;
import static androidx.media3.test.utils.robolectric.RobolectricUtil.runMainLooperUntil;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.playUntilPosition;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilIsLoading;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPlaybackState;
import static com.google.common.truth.Truth.assertThat;
@ -82,7 +83,6 @@ public final class ServerSideAdInsertionMediaSourceTest {
ShadowMediaCodecConfig.forAllSupportedMimeTypes();
private static final String TEST_ASSET = "asset:///media/mp4/sample.mp4";
private static final String TEST_ASSET_DUMP = "playbackdumps/mp4/ssai-sample.mp4.dump";
@Test
public void timeline_vodSinglePeriod_containsAdsDefinedInAdPlaybackState() throws Exception {
@ -440,7 +440,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
player.release();
// Assert all samples have been played.
DumpFileAsserts.assertOutput(context, playbackOutput, TEST_ASSET_DUMP);
DumpFileAsserts.assertOutput(
context, playbackOutput, "playbackdumps/mp4/ssai-predefined-ads.mp4.dump");
// Assert playback has been reported with ads: [ad0][content][ad1][content][ad2][content]
// 6*2(audio+video) format changes, 5 discontinuities between parts.
verify(listener, times(5))
@ -469,7 +470,7 @@ public final class ServerSideAdInsertionMediaSourceTest {
AdPlaybackState firstAdPlaybackState =
addAdGroupToAdPlaybackState(
new AdPlaybackState(/* adsId= */ new Object()),
/* fromPositionUs= */ 900_000,
/* fromPositionUs= */ 700_000,
/* contentResumeOffsetUs= */ 0,
/* adDurationsUs...= */ 100_000);
AtomicReference<ServerSideAdInsertionMediaSource> mediaSourceRef = new AtomicReference<>();
@ -497,6 +498,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
// Add ad at the current playback position during playback.
runUntilPlaybackState(player, Player.STATE_READY);
runUntilIsLoading(player, false);
runMainLooperUntil(() -> player.getBufferedPercentage() == 100);
AdPlaybackState secondAdPlaybackState =
addAdGroupToAdPlaybackState(
firstAdPlaybackState,
@ -514,7 +517,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
player.release();
// Assert all samples have been played.
DumpFileAsserts.assertOutput(context, playbackOutput, TEST_ASSET_DUMP);
DumpFileAsserts.assertOutput(
context, playbackOutput, "playbackdumps/mp4/ssai-newly-inserted-adgroup.mp4.dump");
assertThat(contentTimelines).hasSize(2);
// Assert playback has been reported with ads: [content][ad0][content][ad1][content]
// 5*2(audio+video) format changes, 4 discontinuities between parts.
@ -592,7 +596,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
player.release();
// Assert all samples have been played.
DumpFileAsserts.assertOutput(context, playbackOutput, TEST_ASSET_DUMP);
DumpFileAsserts.assertOutput(
context, playbackOutput, "playbackdumps/mp4/ssai-extended-adgroup.mp4.dump");
assertThat(contentTimelines).hasSize(2);
// Assert playback has been reported with ads: [ad0][ad1][ad2][content]
// 4*2(audio+video) format changes, 3 discontinuities between parts.
@ -656,7 +661,7 @@ public final class ServerSideAdInsertionMediaSourceTest {
player.setMediaSource(mediaSourceRef.get());
player.prepare();
// Play to the first content part, then seek past the midroll.
playUntilPosition(player, /* mediaItemIndex= */ 0, /* positionMs= */ 100);
playUntilPosition(player, /* mediaItemIndex= */ 0, /* positionMs= */ 150);
player.seekTo(/* positionMs= */ 1_600);
runUntilPendingCommandsAreFullyHandled(player);
long positionAfterSeekMs = player.getCurrentPosition();

View file

@ -0,0 +1,79 @@
MediaCodecAdapter (exotest.audio.aac):
buffers.length = 44
buffers[0] = length 23, hash 47DE9131
buffers[1] = length 6, hash 31EC5206
buffers[2] = length 148, hash 894A176B
buffers[3] = length 189, hash CEF235A1
buffers[4] = length 205, hash BBF5F7B0
buffers[5] = length 210, hash F278B193
buffers[6] = length 210, hash 82DA1589
buffers[7] = length 207, hash 5BE231DF
buffers[8] = length 225, hash 18819EE1
buffers[9] = length 215, hash CA7FA67B
buffers[10] = length 211, hash 581A1C18
buffers[11] = length 216, hash ADB88187
buffers[12] = length 229, hash 2E8BA4DC
buffers[13] = length 232, hash 22F0C510
buffers[14] = length 235, hash 867AD0DC
buffers[15] = length 231, hash 84E823A8
buffers[16] = length 226, hash 1BEF3A95
buffers[17] = length 216, hash EAA345AE
buffers[18] = length 229, hash 6957411F
buffers[19] = length 219, hash 41275022
buffers[20] = length 241, hash 6495DF96
buffers[21] = length 228, hash 63D95906
buffers[22] = length 238, hash 34F676F9
buffers[23] = length 234, hash E5CBC045
buffers[24] = length 231, hash 5FC43661
buffers[25] = length 217, hash 682708ED
buffers[26] = length 239, hash D43780FC
buffers[27] = length 243, hash C5E17980
buffers[28] = length 231, hash AC5837BA
buffers[29] = length 230, hash 169EE895
buffers[30] = length 238, hash C48FF3F1
buffers[31] = length 225, hash 531E4599
buffers[32] = length 232, hash CB3C6B8D
buffers[33] = length 243, hash F8C94C7
buffers[34] = length 232, hash A646A7D0
buffers[35] = length 237, hash E8B787A5
buffers[36] = length 228, hash 3FA7A29F
buffers[37] = length 235, hash B9B33B0A
buffers[38] = length 264, hash 71A4869E
buffers[39] = length 257, hash D049B54C
buffers[40] = length 227, hash 66757231
buffers[41] = length 227, hash BD374F1B
buffers[42] = length 235, hash 999477F6
buffers[43] = length 0, hash 1
MediaCodecAdapter (exotest.video.avc):
buffers.length = 31
buffers[0] = length 36692, hash D216076E
buffers[1] = length 5312, hash D45D3CA0
buffers[2] = length 599, hash 1BE7812D
buffers[3] = length 7735, hash 4490F110
buffers[4] = length 987, hash 560B5036
buffers[5] = length 673, hash ED7CD8C7
buffers[6] = length 523, hash 3020DF50
buffers[7] = length 6061, hash 736C72B2
buffers[8] = length 992, hash FE132F23
buffers[9] = length 623, hash 5B2C1816
buffers[10] = length 421, hash 742E69C1
buffers[11] = length 4899, hash F72F86A1
buffers[12] = length 568, hash 519A8E50
buffers[13] = length 620, hash 3990AA39
buffers[14] = length 5450, hash F06EC4AA
buffers[15] = length 1051, hash 92DFA63A
buffers[16] = length 874, hash 69587FB4
buffers[17] = length 781, hash 36BE495B
buffers[18] = length 4725, hash AC0C8CD3
buffers[19] = length 1022, hash 5D8BFF34
buffers[20] = length 790, hash 99413A99
buffers[21] = length 610, hash 5E129290
buffers[22] = length 2751, hash 769974CB
buffers[23] = length 745, hash B78A477A
buffers[24] = length 621, hash CF741E7A
buffers[25] = length 505, hash 1DB4894E
buffers[26] = length 1268, hash C15348DC
buffers[27] = length 880, hash C2DE85D0
buffers[28] = length 530, hash C98BC6A8
buffers[29] = length 568, hash 4FE5C8EA
buffers[30] = length 0, hash 1

View file

@ -0,0 +1,79 @@
MediaCodecAdapter (exotest.audio.aac):
buffers.length = 44
buffers[0] = length 23, hash 47DE9131
buffers[1] = length 6, hash 31EC5206
buffers[2] = length 148, hash 894A176B
buffers[3] = length 189, hash CEF235A1
buffers[4] = length 205, hash BBF5F7B0
buffers[5] = length 210, hash F278B193
buffers[6] = length 210, hash 82DA1589
buffers[7] = length 207, hash 5BE231DF
buffers[8] = length 225, hash 18819EE1
buffers[9] = length 215, hash CA7FA67B
buffers[10] = length 211, hash 581A1C18
buffers[11] = length 216, hash ADB88187
buffers[12] = length 229, hash 2E8BA4DC
buffers[13] = length 232, hash 22F0C510
buffers[14] = length 235, hash 867AD0DC
buffers[15] = length 231, hash 84E823A8
buffers[16] = length 226, hash 1BEF3A95
buffers[17] = length 216, hash EAA345AE
buffers[18] = length 229, hash 6957411F
buffers[19] = length 219, hash 41275022
buffers[20] = length 241, hash 6495DF96
buffers[21] = length 228, hash 63D95906
buffers[22] = length 238, hash 34F676F9
buffers[23] = length 234, hash E5CBC045
buffers[24] = length 231, hash 5FC43661
buffers[25] = length 217, hash 682708ED
buffers[26] = length 239, hash D43780FC
buffers[27] = length 243, hash C5E17980
buffers[28] = length 231, hash AC5837BA
buffers[29] = length 230, hash 169EE895
buffers[30] = length 238, hash C48FF3F1
buffers[31] = length 225, hash 531E4599
buffers[32] = length 232, hash CB3C6B8D
buffers[33] = length 243, hash F8C94C7
buffers[34] = length 232, hash A646A7D0
buffers[35] = length 237, hash E8B787A5
buffers[36] = length 228, hash 3FA7A29F
buffers[37] = length 235, hash B9B33B0A
buffers[38] = length 264, hash 71A4869E
buffers[39] = length 257, hash D049B54C
buffers[40] = length 227, hash 66757231
buffers[41] = length 227, hash BD374F1B
buffers[42] = length 235, hash 999477F6
buffers[43] = length 0, hash 1
MediaCodecAdapter (exotest.video.avc):
buffers.length = 31
buffers[0] = length 36692, hash D216076E
buffers[1] = length 5312, hash D45D3CA0
buffers[2] = length 599, hash 1BE7812D
buffers[3] = length 7735, hash 4490F110
buffers[4] = length 987, hash 560B5036
buffers[5] = length 673, hash ED7CD8C7
buffers[6] = length 523, hash 3020DF50
buffers[7] = length 6061, hash 736C72B2
buffers[8] = length 992, hash FE132F23
buffers[9] = length 623, hash 5B2C1816
buffers[10] = length 421, hash 742E69C1
buffers[11] = length 4899, hash F72F86A1
buffers[12] = length 568, hash 519A8E50
buffers[13] = length 620, hash 3990AA39
buffers[14] = length 5450, hash F06EC4AA
buffers[15] = length 1051, hash 92DFA63A
buffers[16] = length 874, hash 69587FB4
buffers[17] = length 781, hash 36BE495B
buffers[18] = length 4725, hash AC0C8CD3
buffers[19] = length 1022, hash 5D8BFF34
buffers[20] = length 790, hash 99413A99
buffers[21] = length 610, hash 5E129290
buffers[22] = length 2751, hash 769974CB
buffers[23] = length 745, hash B78A477A
buffers[24] = length 621, hash CF741E7A
buffers[25] = length 505, hash 1DB4894E
buffers[26] = length 1268, hash C15348DC
buffers[27] = length 880, hash C2DE85D0
buffers[28] = length 530, hash C98BC6A8
buffers[29] = length 568, hash 4FE5C8EA
buffers[30] = length 0, hash 1