fix: replace retained report sessions when re-adding queue items

This commit is contained in:
2026-10-22 17:20:19 +02:00
parent b132bab393
commit 3ff498720b
6 changed files with 96 additions and 16 deletions
+32 -1
View File
@@ -273,7 +273,7 @@ struct ResolvedPlaybackCheck {
require(model.commandError != nil && model.queue.items.count == 4,
"registered report-path conflicts reject complete enqueue before files exist")
try deliver([(URL(string: "https://www.youtube.com/watch?v=DDDDDDDDDDD")!, directory.appendingPathComponent("valid.jsonl")),
(URL(string: "https://example.com/unsupported")!, directory.appendingPathComponent("invalid.jsonl"))])
(URL(string: "file:///not-a-stream")!, directory.appendingPathComponent("invalid.jsonl"))])
require(model.commandError != nil && model.queue.items.count == 4,
"invalid later manifest entry never partially appends or registers reports")
try deliver([(URL(string: "https://www.youtube.com/watch?v=DDDDDDDDDDD")!, directory.appendingPathComponent("valid.jsonl"))])
@@ -302,7 +302,38 @@ struct ResolvedPlaybackCheck {
try await until("original single video remains navigable", model: model) {
!model.isBusy && model.state.status == PLAYER_PLAYING && model.fileName == first.absoluteString
}
var retiredReports: [(URL, Data, URL, URL)] = []
for (url, oldReport) in [(first, originalReport), (third, thirdReport)] {
let oldID = model.queue.items.first(where: { $0.url == url })!.id
model.removeQueueItem(oldID)
let currentID = model.queue.currentID
let freshReport = directory.appendingPathComponent(oldReport.lastPathComponent + ".fresh")
try deliver([(url, freshReport)])
require(model.commandError == nil && model.queue.items.count == 5 &&
model.queue.currentID == currentID, "removed video re-enqueues without interrupting current playback")
let retiredBytes = try Data(contentsOf: oldReport)
retiredReports.append((oldReport, retiredBytes, freshReport, url))
require(!FileManager.default.fileExists(atPath: freshReport.path), "re-added report remains lazy")
model.selectQueueItem(model.queue.items.last!.id)
try await until("re-added video decodes with a fresh session", model: model) {
!model.isBusy && model.state.status == PLAYER_PLAYING &&
model.queue.currentURL == url && model.state.position > 0.2
}
require(model.setPlayback(playing: false), "pause re-added video")
try await until("re-added pause acknowledged", model: model) { model.state.status == PLAYER_PAUSED }
}
model.shutdown()
for (oldReport, retiredBytes, freshReport, url) in retiredReports {
let finalBytes = try Data(contentsOf: oldReport)
require(finalBytes == retiredBytes, "re-added playback leaves the retired report unchanged")
let freshRows = try String(contentsOf: freshReport, encoding: .utf8).split(separator: "\n").map {
try JSONSerialization.jsonObject(with: Data($0.utf8)) as! [String: Any]
}
require(freshRows.contains { $0["event"] as? String == "closed" } &&
freshRows.contains { $0["event"] as? String == "progress" } &&
freshRows.allSatisfy { $0["media_url"] as? String == url.absoluteString },
"re-added video writes its acknowledged progress and close to the fresh report only")
}
for (file, expected) in [(originalReport, first.absoluteString), (thirdReport, third.absoluteString)] {
let rows = try String(contentsOf: file, encoding: .utf8).split(separator: "\n").map {
try JSONSerialization.jsonObject(with: Data($0.utf8)) as! [String: Any]