c43dd3ca4a
A native iOS receiver so an iPhone can act as the second receiver, speaking the existing signaling + RTP protocol (no C++ changes) and mirroring the Android receiver (Phase 8) source-to-source. - RTP core (header/packet, jitter buffer, H.264 depacketizer) ported from the Android receiver - BSD-socket signaling server (dual-stack, most-recent-peer, never-throwing sends) + NSBonjourServices - VideoToolbox H.264 decode (in-band SPS/PPS, real-time, rebuilds on size change) -> AVSampleBufferDisplayLayer - PLI keyframe recovery (500 ms) + pendingOffer for late surface attach - XcodeGen project + bootstrap.sh; XCTest port of the Android suite + new coverage - .gitignore for generated artifacts; CHANGELOG; PHASES + MEMORY updated Status: authored; on-device validation pending a Mac + Xcode 26 + iPhone 16.
55 lines
2.1 KiB
Swift
55 lines
2.1 KiB
Swift
import XCTest
|
|
@testable import Receiver
|
|
|
|
final class SignalingMessageTests: XCTestCase {
|
|
func testOfferRoundtrip() {
|
|
let offer = SignalingMessage.offer(sessionId: "s-1", codec: "h264", width: 0, height: 0,
|
|
frameRateNum: 30, frameRateDen: 1, rtpAddress: "10.0.0.5", rtpPort: 1234)
|
|
let line = SignalingMessage.serialize(offer).trimmingCharacters(in: .newlines)
|
|
let parsed = SignalingMessage.parse(line)
|
|
guard case let .offer(sid, codec, w, h, num, den, addr, port) = parsed else { return XCTFail() }
|
|
XCTAssertEqual(sid, "s-1")
|
|
XCTAssertEqual(codec, "h264")
|
|
XCTAssertEqual(w, 0)
|
|
XCTAssertEqual(h, 0)
|
|
XCTAssertEqual(num, 30)
|
|
XCTAssertEqual(den, 1)
|
|
XCTAssertEqual(addr, "10.0.0.5")
|
|
XCTAssertEqual(port, 1234)
|
|
}
|
|
|
|
func testAnswerRoundtrip() {
|
|
let answer = SignalingMessage.answer(sessionId: "s-2", rtpAddress: "", rtpPort: 5004,
|
|
displayWidth: 1179, displayHeight: 2556)
|
|
let line = SignalingMessage.serialize(answer).trimmingCharacters(in: .newlines)
|
|
let parsed = SignalingMessage.parse(line)
|
|
guard case let .answer(sid, addr, port, dw, dh) = parsed else { return XCTFail() }
|
|
XCTAssertEqual(sid, "s-2")
|
|
XCTAssertEqual(addr, "")
|
|
XCTAssertEqual(port, 5004)
|
|
XCTAssertEqual(dw, 1179)
|
|
XCTAssertEqual(dh, 2556)
|
|
}
|
|
|
|
func testPliRoundtrip() {
|
|
let pli = SignalingMessage.pli(sessionId: "s-3")
|
|
let line = SignalingMessage.serialize(pli).trimmingCharacters(in: .newlines)
|
|
let parsed = SignalingMessage.parse(line)
|
|
guard case let .pli(sid) = parsed else { return XCTFail() }
|
|
XCTAssertEqual(sid, "s-3")
|
|
}
|
|
|
|
func testRejectsUnknownType() {
|
|
XCTAssertNil(SignalingMessage.parse("{\"type\":\"bogus\"}"))
|
|
}
|
|
|
|
func testRejectsInvalidJson() {
|
|
XCTAssertNil(SignalingMessage.parse("not json"))
|
|
}
|
|
|
|
func testRejectsOversizedLine() {
|
|
let big = String(repeating: "a", count: SignalingMessage.maxMessageBytes + 1)
|
|
XCTAssertNil(SignalingMessage.parse(big))
|
|
}
|
|
}
|