// // FragmentationTests.swift // bitchatTests // // This is free and unencumbered software released into the public domain. // For more information, see // import XCTest @testable import bitchat final class FragmentationTests: XCTestCase { private var mockKeychain: MockKeychain! private var mockIdentityManager: MockIdentityManager! override func setUp() { super.setUp() mockKeychain = MockKeychain() mockIdentityManager = MockIdentityManager(mockKeychain) } override func tearDown() { mockKeychain = nil mockIdentityManager = nil super.tearDown() } private final class CaptureDelegate: BitchatDelegate { var publicMessages: [(peerID: String, nickname: String, content: String)] = [] func didReceiveMessage(_ message: BitchatMessage) {} func didConnectToPeer(_ peerID: String) {} func didDisconnectFromPeer(_ peerID: String) {} func didUpdatePeerList(_ peers: [String]) {} func isFavorite(fingerprint: String) -> Bool { false } func didUpdateMessageDeliveryStatus(_ messageID: String, status: DeliveryStatus) {} func didReceiveNoisePayload(from peerID: String, type: NoisePayloadType, payload: Data, timestamp: Date) {} func didReceivePublicMessage(from peerID: String, nickname: String, content: String, timestamp: Date) { publicMessages.append((peerID, nickname, content)) } func didReceiveRegionalPublicMessage(from peerID: String, nickname: String, content: String, timestamp: Date) {} } // Helper: build a large message packet (unencrypted public message) private func makeLargePublicPacket(senderShortHex: String, size: Int) -> BitchatPacket { let content = String(repeating: "A", count: size) let payload = Data(content.utf8) let pkt = BitchatPacket( type: MessageType.message.rawValue, senderID: Data(hexString: senderShortHex) ?? Data(), recipientID: nil, timestamp: UInt64(Date().timeIntervalSince1970 * 1000), payload: payload, signature: nil, ttl: 7 ) return pkt } // Helper: fragment a packet using the same header format BLEService expects private func fragmentPacket(_ packet: BitchatPacket, fragmentSize: Int, fragmentID: Data? = nil) -> [BitchatPacket] { let fullData = packet.toBinaryData() ?? Data() let fid = fragmentID ?? Data((0..<8).map { _ in UInt8.random(in: 0...255) }) let chunks: [Data] = stride(from: 0, to: fullData.count, by: fragmentSize).map { off in Data(fullData[off..