@@ -773,6 +773,58 @@ internal class SingleMediaProductPlayLogTest {
773773 eq(emptyMap()),
774774 )
775775 }
776+
777+ @Test
778+ fun seekBeyondBounds () = runTest {
779+ val gson = Gson ()
780+
781+ player.playbackEngine.load(mediaProduct)
782+ player.playbackEngine.play()
783+ withContext(Dispatchers .Default .limitedParallelism(1 )) {
784+ delay(2 .seconds)
785+ while (player.playbackEngine.assetPosition < 2 ) {
786+ delay(10 .milliseconds)
787+ }
788+ player.playbackEngine.seek(10_000F )
789+ withTimeout(8 .seconds) {
790+ player.playbackEngine.events.filter { it is Event .MediaProductEnded }.first()
791+ }
792+ }
793+
794+ eventReporterCoroutineScope.advanceUntilIdle()
795+ verify(eventSender).sendEvent(
796+ eq(" playback_session" ),
797+ eq(ConsentCategory .NECESSARY ),
798+ argThat {
799+ with (gson.fromJson(this , JsonObject ::class .java)[" payload" ].asJsonObject) {
800+ assertThat(get(" startAssetPosition" ).asDouble).isAssetPositionEqualTo(0.0 )
801+ assertThat(get(" endAssetPosition" ).asDouble)
802+ .isAssetPositionEqualTo(MEDIA_PRODUCT_DURATION_SECONDS )
803+ assertThat(get(" actualProductId" ).asString).isEqualTo(mediaProduct.productId)
804+ assertThat(get(" sourceType" )?.asString).isEqualTo(mediaProduct.sourceType)
805+ assertThat(get(" sourceId" )?.asString).isEqualTo(mediaProduct.sourceId)
806+ with (get(" actions" ).asJsonArray) {
807+ val stopAction =
808+ gson.fromJson(this [0 ], PlaybackSession .Payload .Action ::class .java)
809+ assertThat(stopAction.actionType)
810+ .isEqualTo(PlaybackSession .Payload .Action .Type .PLAYBACK_STOP )
811+ assertThat(stopAction.assetPositionSeconds).isAssetPositionEqualTo(2.0 )
812+ val startAction =
813+ gson.fromJson(this [1 ], PlaybackSession .Payload .Action ::class .java)
814+ assertThat(startAction.actionType)
815+ .isEqualTo(PlaybackSession .Payload .Action .Type .PLAYBACK_START )
816+ assertThat(startAction.assetPositionSeconds)
817+ .isAssetPositionEqualTo(MEDIA_PRODUCT_DURATION_SECONDS )
818+ val perfectResumeTimestamp = stopAction.timestamp
819+ assertThat(startAction.timestamp)
820+ .isBetween(perfectResumeTimestamp - 500 , perfectResumeTimestamp + 500 )
821+ }
822+ }
823+ true
824+ },
825+ eq(emptyMap()),
826+ )
827+ }
776828}
777829
778830private const val MEDIA_PRODUCT_DURATION_SECONDS = 5.055
0 commit comments