Files
HaishinKit.swift/RTMPHaishinKit/Tests/RTMP/RTMPChunkBufferTests.swift
2025-07-13 12:43:53 +09:00

129 lines
7.2 KiB
Swift

import Foundation
import Testing
@testable import RTMPHaishinKit
@Suite struct RTMPChunkBufferTests {
static let readData = Data([2, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 76, 75, 64, 2, 0, 0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 76, 75, 64, 2, 2, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 32, 0, 3, 0, 0, 0, 0, 0, 190, 20, 0, 0, 0, 0, 2, 0, 7, 95, 114, 101, 115, 117, 108, 116, 0, 63, 240, 0, 0, 0, 0, 0, 0, 3, 0, 6, 102, 109, 115, 86, 101, 114, 2, 0, 13, 70, 77, 83, 47, 51, 44, 48, 44, 49, 44, 49, 50, 51, 0, 12, 99, 97, 112, 97, 98, 105, 108, 105, 116, 105, 101, 115, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 9, 3, 0, 5, 108, 101, 118, 101, 108, 2, 0, 6, 115, 116, 97, 116, 117, 115, 0, 4, 99, 111, 100, 101, 2, 0, 29, 78, 101, 116, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 46, 67, 111, 110, 110, 101, 99, 116, 46, 83, 117, 99, 99, 101, 115, 115, 0, 11, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 2, 0, 21, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 32, 115, 117, 99, 99, 101, 101, 100, 101, 100, 46, 0, 14, 111, 98, 106, 101, 99, 116, 69, 110, 99, 111, 100, 105, 110, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9])
static let readDataBufferUnderflow = Data([2, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 76, 75, 64, 2, 0, 0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 76, 75, 64, 2, 2, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 32, 0, 3, 0, 0, 0, 0, 0, 190, 20, 0, 0, 0, 0, 2, 0, 7, 95, 114, 101, 115, 117, 108, 116, 0, 63, 240, 0, 0, 0, 0, 0, 0, 3, 0, 6, 102, 109, 115, 86, 101, 114, 2, 0, 13, 70, 77, 83, 47, 51, 44, 48, 44, 49, 44, 49, 50, 51, 0, 12, 99, 97, 112, 97, 98, 105, 108, 105, 116, 105, 101, 115, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 9, 3, 0, 5, 108, 101, 118, 101, 108, 2, 0, 6, 115, 116, 97, 116, 117, 115, 0, 4, 99, 111, 100, 101, 2, 0, 29, 78, 101, 116, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 46, 67, 111, 110, 110, 101, 99, 116, 46, 83, 117, 99, 99, 101, 115, 115, 0, 11, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 2, 0, 21, 67, 111, 110, 110, 101, 99, 116, 105, 111, 110, 32, 115, 117, 99, 99, 101, 101, 100, 101, 100, 46, 0, 14, 111, 98, 106, 101, 99, 116, 69, 110, 99, 111, 100, 105, 110, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
@Test func read() {
let buffer = RTMPChunkBuffer()
buffer.put(Self.readData)
do {
let (chunkType, chunkStreamId) = try buffer.getBasicHeader()
#expect(chunkType == .zero)
#expect(chunkStreamId == 2)
let header = RTMPChunkMessageHeader()
try buffer.getMessageHeader(chunkType, messageHeader: header)
let message = header.makeMessage() as? RTMPWindowAcknowledgementSizeMessage
#expect(message?.size == 5000000)
} catch {
}
do {
let (chunkType, chunkStreamId) = try buffer.getBasicHeader()
#expect(chunkType == .zero)
#expect(chunkStreamId == 2)
let header = RTMPChunkMessageHeader()
try buffer.getMessageHeader(chunkType, messageHeader: header)
let message = header.makeMessage() as? RTMPSetPeerBandwidthMessage
#expect(message?.size == 5000000)
} catch {
}
do {
let (chunkType, chunkStreamId) = try buffer.getBasicHeader()
#expect(chunkType == .zero)
#expect(chunkStreamId == 2)
let header = RTMPChunkMessageHeader()
try buffer.getMessageHeader(chunkType, messageHeader: header)
let message = header.makeMessage() as? RTMPSetChunkSizeMessage
#expect(message?.size == 8192)
buffer.chunkSize = 8192
} catch {
}
do {
let (chunkType, chunkStreamId) = try buffer.getBasicHeader()
#expect(chunkType == .zero)
#expect(chunkStreamId == 3)
let header = RTMPChunkMessageHeader()
try buffer.getMessageHeader(chunkType, messageHeader: header)
let message = header.makeMessage() as? RTMPCommandMessage
#expect(message?.commandName == "_result")
} catch {
}
}
@Test func readBufferUnderflow() {
let buffer = RTMPChunkBuffer()
buffer.chunkSize = 8192
buffer.put(Self.readDataBufferUnderflow)
var rollbackPosition = buffer.position
var count = 0
do {
while buffer.hasRemaining {
rollbackPosition = buffer.position
let (chunkType, _) = try buffer.getBasicHeader()
let header = RTMPChunkMessageHeader()
try buffer.getMessageHeader(chunkType, messageHeader: header)
count += 1
}
} catch RTMPChunkError.bufferUnderflow {
buffer.position = rollbackPosition
} catch {
}
#expect(rollbackPosition == 49)
#expect(count == 3)
buffer.put(Data([0, 9]))
do {
let (chunkType, _) = try buffer.getBasicHeader()
let header = RTMPChunkMessageHeader()
try buffer.getMessageHeader(chunkType, messageHeader: header)
let message = header.makeMessage() as? RTMPCommandMessage
#expect(message?.commandName == "_result")
} catch {
}
}
@Test func chunkSize() {
let buffer = RTMPChunkBuffer()
buffer.chunkSize = 8192
buffer.chunkSize = 128
buffer.chunkSize = 8192
}
@Test func write() {
let buffer = RTMPChunkBuffer()
let connection = RTMPCommandMessage(
streamId: 0,
transactionId: 0,
objectEncoding: .amf0,
commandName: "hello",
commandObject: nil,
arguments: []
)
let iterator = buffer.putMessage(.zero, chunkStreamId: 1, message: connection)
#expect(iterator.next() == Data([1, 0, 0, 0, 0, 0, 18, 20, 0, 0, 0, 0, 2, 0, 5, 104, 101, 108, 108, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]))
}
@Test func writeChunkSize() {
let buffer = RTMPChunkBuffer()
let connection = RTMPCommandMessage(
streamId: 0,
transactionId: 0,
objectEncoding: .amf0,
commandName: [String](repeating: "a", count: 128 + 56).joined(),
commandObject: nil,
arguments: []
)
let iterator = buffer.putMessage(.zero, chunkStreamId: 1, message: connection)
#expect(iterator.next() == Data([1, 0, 0, 0, 0, 0, 197, 20, 0, 0, 0, 0, 2, 0, 184, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97]))
#expect(iterator.next() == Data([193, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]))
#expect(iterator.next() == nil)
}
}