TeraOpenedMediaTests.swift (3109B)
1 import Foundation 2 @testable import TeraApp 3 import XCTest 4 5 final class TeraOpenedMediaTests: XCTestCase { 6 func testConcurrentRepeatedCloseLeavesOnlyTheUsableRustOwner() async throws { 7 let fixture = try MediaOwnershipFixture() 8 defer { fixture.remove() } 9 let runtime = try await fixture.runtime() 10 let original = try fixture.original() 11 let descriptor = original.fileDescriptor 12 let probe = try TeraOpenFileProbe(url: fixture.root.appendingPathComponent("original.png")) 13 let opened = try TeraOpenedMedia( 14 handles: [TeraPreparedMediaHandle(media: fixture.media, fileDescriptor: UInt64(descriptor))], 15 files: [original] 16 ) 17 XCTAssertEqual(probe.descriptorCount, 2) 18 await TeraOpenedMediaCloseFixture.closeConcurrently(opened) 19 XCTAssertFalse(probe.owns(descriptor)) 20 XCTAssertEqual(probe.descriptorCount, 1) 21 let saved = try await fixture.save(runtime, handle: XCTUnwrap(opened.handles.first)) 22 XCTAssertEqual(saved.form?.media.first?.sha256, fixture.media.sha256) 23 _ = try await runtime.shutdown() 24 } 25 26 func testDeinitClosesTheOriginalAndReleasesTheLastRustHandle() throws { 27 let fixture = try MediaOwnershipFixture() 28 defer { fixture.remove() } 29 let original = try fixture.original() 30 let descriptor = original.fileDescriptor 31 let probe = try TeraOpenFileProbe(url: fixture.root.appendingPathComponent("original.png")) 32 var opened: TeraOpenedMedia? = try TeraOpenedMedia( 33 handles: [TeraPreparedMediaHandle(media: fixture.media, fileDescriptor: UInt64(descriptor))], 34 files: [original] 35 ) 36 weak let weakOwner = opened 37 XCTAssertEqual(opened?.handles.count, 1) 38 XCTAssertEqual(probe.descriptorCount, 2) 39 opened = nil 40 XCTAssertNil(weakOwner) 41 XCTAssertFalse(probe.owns(descriptor)) 42 XCTAssertEqual(probe.descriptorCount, 0) 43 } 44 45 func testProductionPartialOpenFailureReleasesBothNativeAndRustResources() async throws { 46 let fixture = try BackgroundUploadFixture() 47 defer { fixture.remove() } 48 let coordinator = fixture.coordinator(transfer: BackgroundTransferHarness()) 49 let probe = try TeraOpenFileProbe(url: fixture.stagedFileURL) 50 var control: TeraOpenedMedia? = try await coordinator.open([fixture.media]) 51 XCTAssertEqual(probe.descriptorCount, 2) 52 control?.close() 53 control = nil 54 XCTAssertEqual(probe.descriptorCount, 0) 55 let missing = missingMedia(fixture.media) 56 for _ in 0 ..< 16 { 57 do { 58 let unexpected = try await coordinator.open([fixture.media, missing]) 59 unexpected.close() 60 XCTFail("The second staged file does not exist") 61 } catch {} 62 XCTAssertEqual(probe.descriptorCount, 0) 63 } 64 } 65 66 private func missingMedia(_ media: TeraPreparedMedia) -> TeraPreparedMedia { 67 let missing = String(repeating: "f", count: 64) 68 return TeraPreparedMedia( 69 opaqueReference: "media:\(missing)", remoteURL: nil, sha256: missing, 70 mediaType: media.mediaType, byteSize: media.byteSize, width: media.width, 71 height: media.height, alt: media.alt, preparedAtUnixSeconds: media.preparedAtUnixSeconds 72 ) 73 } 74 }