import BitFoundation import Foundation import Testing @testable import bitchat @Suite("BLE outbound fragment planner tests") struct BLEOutboundFragmentPlannerTests { @Test("planner splits packets and preserves reassembled payload") func plannerSplitsAndReassemblesPacket() throws { let packet = makePacket(payload: makePayload(count: 384)) let request = BLEOutboundFragmentTransferRequest( packet: packet, pad: false, maxChunk: 128, directedPeer: nil, transferId: nil ) let plan = try #require(BLEOutboundFragmentPlanner.makePlan( for: request, defaultChunkSize: 256, bleMaxMTU: 512, fragmentID: Data(repeating: 0xA1, count: 8) )) let headers = try plan.fragmentPackets.map { try #require(BLEFragmentHeader(packet: $0)) } let reassembled = headers.reduce(into: Data()) { data, header in data.append(header.fragmentData) } let decoded = try #require(BinaryProtocol.decode(reassembled)) #expect(plan.fragmentVersion == 1) #expect(plan.chunkSize == 128) #expect(plan.spacingMs == TransportConfig.bleFragmentSpacingMs) #expect(headers.map(\.index) == Array(0.. BitchatPacket { BitchatPacket( type: MessageType.message.rawValue, senderID: Data([0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77]), recipientID: nil, timestamp: 0x0102030405, payload: payload, signature: nil, ttl: 3, route: route, isRSR: isRSR ) } private func makePayload(count: Int, seed: UInt64 = 0xABCD_1234) -> Data { var state = seed return Data((0..> 32) }) } }