@@ -413,6 +413,73 @@ class mParticle_Apple_MediaTests: XCTestCase, MPListenerProtocol {
413413 mediaSession? . logAdBreakEnd ( )
414414 self . waitForExpectations ( timeout: defaultTimeout, handler: nil )
415415 }
416+
417+ func testAdBreakExclusionDisabledDoesNotPauseContentTime( ) {
418+ let adBreak = MPMediaAdBreak ( title: " foo adbreak title " , id: " 12345 " )
419+ mediaSession? . excludeAdBreaksFromContentTime = false
420+
421+ // Start content playback and accumulate 0.2s before the ad break
422+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0 )
423+ mediaSession? . logPlay ( )
424+ Thread . sleep ( forTimeInterval: 0.2 )
425+
426+ XCTAssertNotNil ( mediaSession? . currentPlaybackStartTimestamp)
427+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0.2 , accuracy: 0.08 )
428+
429+ // 0.2s should count toward content time.
430+ mediaSession? . logAdBreakStart ( adBreak: adBreak)
431+ Thread . sleep ( forTimeInterval: 0.2 )
432+
433+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0.4 , accuracy: 0.08 )
434+
435+ mediaSession? . logAdBreakEnd ( )
436+ XCTAssertNil ( mediaSession? . adBreak)
437+
438+ mediaSession? . logPause ( )
439+
440+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0.4 , accuracy: 0.08 )
441+ XCTAssertNil ( mediaSession? . currentPlaybackStartTimestamp)
442+ }
443+
444+ func testAdBreakExclusionEnabledExcludesAdTime( ) {
445+ let adBreak = MPMediaAdBreak ( title: " foo adbreak title " , id: " 12345 " )
446+ mediaSession? . excludeAdBreaksFromContentTime = true
447+
448+ // Start content playback and accumulate 0.2s before the ad break
449+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0 )
450+ mediaSession? . logPlay ( )
451+ Thread . sleep ( forTimeInterval: 0.2 )
452+
453+ XCTAssertNotNil ( mediaSession? . currentPlaybackStartTimestamp)
454+ XCTAssertEqual ( mediaSession!. storedPlaybackTime, 0 )
455+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0.2 , accuracy: 0.08 )
456+
457+ // Start ad break content time should pause & be stored
458+ mediaSession? . logAdBreakStart ( adBreak: adBreak)
459+ Thread . sleep ( forTimeInterval: 0.2 )
460+
461+ // Content tracking paused: playhead cleared, stored captured 0.2s
462+ XCTAssertEqual ( mediaSession!. storedPlaybackTime, mediaSession!. mediaContentTimeSpent)
463+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0.2 , accuracy: 0.08 )
464+ XCTAssertNil ( mediaSession? . currentPlaybackStartTimestamp)
465+
466+ // End ad break auto-resume content tracking
467+ mediaSession? . logAdBreakEnd ( )
468+ Thread . sleep ( forTimeInterval: 0.2 )
469+
470+ XCTAssertEqual ( mediaSession!. storedPlaybackTime, 0.2 , accuracy: 0.08 )
471+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0.4 , accuracy: 0.08 )
472+ XCTAssertNotNil ( mediaSession? . currentPlaybackStartTimestamp)
473+ XCTAssertNil ( mediaSession? . adBreak)
474+
475+ // Watch a bit more content after the ad
476+ Thread . sleep ( forTimeInterval: 0.2 )
477+
478+ mediaSession? . logPause ( )
479+
480+ XCTAssertEqual ( mediaSession!. mediaContentTimeSpent, 0.6 , accuracy: 0.08 )
481+ XCTAssertNil ( mediaSession? . currentPlaybackStartTimestamp)
482+ }
416483
417484 func testLogSegmentStart( ) {
418485 let segment = MPMediaSegment ( title: " foo segment title " , index: 3 , duration: 30000 )
0 commit comments