mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 00:05:18 +00:00
PeerID 18/n: BitchatDelegate + Tests (#769)
This commit is contained in:
@@ -281,12 +281,12 @@ private final class MockBitchatDelegate: BitchatDelegate {
|
||||
messageHandler(message)
|
||||
}
|
||||
|
||||
func didConnectToPeer(_ peerID: String) {}
|
||||
func didDisconnectFromPeer(_ peerID: String) {}
|
||||
func didUpdatePeerList(_ peers: [String]) {}
|
||||
func didConnectToPeer(_ peerID: PeerID) {}
|
||||
func didDisconnectFromPeer(_ peerID: PeerID) {}
|
||||
func didUpdatePeerList(_ peers: [PeerID]) {}
|
||||
func isFavorite(fingerprint: String) -> Bool { return false }
|
||||
func didUpdateMessageDeliveryStatus(_ messageID: String, status: DeliveryStatus) {}
|
||||
func didReceiveNoisePayload(from peerID: String, type: NoisePayloadType, payload: Data, timestamp: Date) {}
|
||||
func didReceiveNoisePayload(from peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) {}
|
||||
func didUpdateBluetoothState(_ state: CBManagerState) {}
|
||||
func didReceivePublicMessage(from peerID: String, nickname: String, content: String, timestamp: Date) {}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ struct PrivateChatE2ETests {
|
||||
// Alice sends private message to Bob
|
||||
alice.sendPrivateMessage(
|
||||
TestConstants.testMessage1,
|
||||
to: PeerID(str: bob.peerID),
|
||||
to: bob.peerID,
|
||||
recipientNickname: TestConstants.testNickname2
|
||||
)
|
||||
|
||||
@@ -74,7 +74,7 @@ struct PrivateChatE2ETests {
|
||||
// Alice sends private message to Bob
|
||||
alice.sendPrivateMessage(
|
||||
TestConstants.testMessage1,
|
||||
to: PeerID(str: bob.peerID),
|
||||
to: bob.peerID,
|
||||
recipientNickname: TestConstants.testNickname2
|
||||
)
|
||||
}
|
||||
@@ -99,7 +99,7 @@ struct PrivateChatE2ETests {
|
||||
|
||||
alice.sendPrivateMessage(
|
||||
TestConstants.testMessage1,
|
||||
to: PeerID(str: bob.peerID),
|
||||
to: bob.peerID,
|
||||
recipientNickname: TestConstants.testNickname2
|
||||
)
|
||||
}
|
||||
@@ -119,10 +119,10 @@ struct PrivateChatE2ETests {
|
||||
|
||||
// Establish encrypted session
|
||||
do {
|
||||
let handshake1 = try aliceManager.initiateHandshake(with: PeerID(str: bob.peerID))
|
||||
let handshake2 = try bobManager.handleIncomingHandshake(from: PeerID(str: alice.peerID), message: handshake1)!
|
||||
let handshake3 = try aliceManager.handleIncomingHandshake(from: PeerID(str: bob.peerID), message: handshake2)!
|
||||
_ = try bobManager.handleIncomingHandshake(from: PeerID(str: alice.peerID), message: handshake3)
|
||||
let handshake1 = try aliceManager.initiateHandshake(with: bob.peerID)
|
||||
let handshake2 = try bobManager.handleIncomingHandshake(from: alice.peerID, message: handshake1)!
|
||||
let handshake3 = try aliceManager.handleIncomingHandshake(from: bob.peerID, message: handshake2)!
|
||||
_ = try bobManager.handleIncomingHandshake(from: alice.peerID, message: handshake3)
|
||||
} catch {
|
||||
Issue.record("Failed to establish Noise session: \(error)")
|
||||
}
|
||||
@@ -135,7 +135,7 @@ struct PrivateChatE2ETests {
|
||||
let message = BitchatMessage(packet.payload),
|
||||
message.isPrivate {
|
||||
do {
|
||||
let encrypted = try aliceManager.encrypt(packet.payload, for: PeerID(str: bob.peerID))
|
||||
let encrypted = try aliceManager.encrypt(packet.payload, for: bob.peerID)
|
||||
let encryptedPacket = BitchatPacket(
|
||||
type: 0x02, // Encrypted message type
|
||||
senderID: packet.senderID,
|
||||
@@ -156,7 +156,7 @@ struct PrivateChatE2ETests {
|
||||
// Decrypt incoming encrypted messages
|
||||
if packet.type == 0x02 {
|
||||
do {
|
||||
let decrypted = try bobManager.decrypt(packet.payload, from: PeerID(str: alice.peerID))
|
||||
let decrypted = try bobManager.decrypt(packet.payload, from: alice.peerID)
|
||||
if let message = BitchatMessage(decrypted) {
|
||||
#expect(message.content == TestConstants.testMessage1)
|
||||
#expect(message.isPrivate)
|
||||
@@ -207,7 +207,7 @@ struct PrivateChatE2ETests {
|
||||
// Alice sends private message to Charlie (through Bob)
|
||||
alice.sendPrivateMessage(
|
||||
TestConstants.testMessage1,
|
||||
to: PeerID(str: charlie.peerID),
|
||||
to: charlie.peerID,
|
||||
recipientNickname: TestConstants.testNickname3
|
||||
)
|
||||
}
|
||||
|
||||
@@ -183,11 +183,11 @@ struct PublicChatE2ETests {
|
||||
let msg = TestHelpers.createTestMessage(
|
||||
content: TestConstants.testMessage1,
|
||||
sender: TestConstants.testNickname1,
|
||||
senderPeerID: PeerID(str: alice.peerID)
|
||||
senderPeerID: alice.peerID
|
||||
)
|
||||
|
||||
if let payload = msg.toBinaryPayload() {
|
||||
let pkt = TestHelpers.createTestPacket(senderID: PeerID(str: alice.peerID), payload: payload, ttl: 2)
|
||||
let pkt = TestHelpers.createTestPacket(senderID: alice.peerID, payload: payload, ttl: 2)
|
||||
bob.simulateIncomingPacket(pkt)
|
||||
}
|
||||
}
|
||||
@@ -407,7 +407,7 @@ struct PublicChatE2ETests {
|
||||
if let relayPayload = relayMessage.toBinaryPayload() {
|
||||
let relayPacket = BitchatPacket(
|
||||
type: packet.type,
|
||||
senderID: node.peerID.data(using: .utf8)!,
|
||||
senderID: node.peerID.id.data(using: .utf8)!,
|
||||
recipientID: packet.recipientID,
|
||||
timestamp: packet.timestamp,
|
||||
payload: relayPayload,
|
||||
|
||||
@@ -127,19 +127,19 @@ struct FragmentationTests {
|
||||
|
||||
extension FragmentationTests {
|
||||
private final class CaptureDelegate: BitchatDelegate {
|
||||
var publicMessages: [(peerID: String, nickname: String, content: String)] = []
|
||||
var publicMessages: [(peerID: PeerID, nickname: String, content: String)] = []
|
||||
func didReceiveMessage(_ message: BitchatMessage) {}
|
||||
func didConnectToPeer(_ peerID: String) {}
|
||||
func didDisconnectFromPeer(_ peerID: String) {}
|
||||
func didUpdatePeerList(_ peers: [String]) {}
|
||||
func didConnectToPeer(_ peerID: PeerID) {}
|
||||
func didDisconnectFromPeer(_ peerID: PeerID) {}
|
||||
func didUpdatePeerList(_ peers: [PeerID]) {}
|
||||
func isFavorite(fingerprint: String) -> Bool { false }
|
||||
func didUpdateMessageDeliveryStatus(_ messageID: String, status: DeliveryStatus) {}
|
||||
func didReceiveNoisePayload(from peerID: String, type: NoisePayloadType, payload: Data, timestamp: Date) {}
|
||||
func didReceiveNoisePayload(from peerID: PeerID, type: NoisePayloadType, payload: Data, timestamp: Date) {}
|
||||
func didUpdateBluetoothState(_ state: CBManagerState) {}
|
||||
func didReceivePublicMessage(from peerID: String, nickname: String, content: String, timestamp: Date) {
|
||||
func didReceivePublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date) {
|
||||
publicMessages.append((peerID, nickname, content))
|
||||
}
|
||||
func didReceiveRegionalPublicMessage(from peerID: String, nickname: String, content: String, timestamp: Date) {}
|
||||
func didReceiveRegionalPublicMessage(from peerID: PeerID, nickname: String, content: String, timestamp: Date) {}
|
||||
}
|
||||
|
||||
// Helper: build a large message packet (unencrypted public message)
|
||||
|
||||
@@ -484,13 +484,10 @@ final class IntegrationTests: XCTestCase {
|
||||
|
||||
guard let aliceManager = noiseManagers["Alice"],
|
||||
let bobManager = noiseManagers["Bob"],
|
||||
let aliceStringPeerID = nodes["Alice"]?.peerID,
|
||||
let bobStringPeerID = nodes["Bob"]?.peerID else {
|
||||
let alicePeerID = nodes["Alice"]?.peerID,
|
||||
let bobPeerID = nodes["Bob"]?.peerID else {
|
||||
return XCTFail("Missing managers or peer IDs")
|
||||
}
|
||||
|
||||
let alicePeerID = PeerID(str: aliceStringPeerID)
|
||||
let bobPeerID = PeerID(str: bobStringPeerID)
|
||||
|
||||
// Baseline: encrypt from Alice, decrypt at Bob
|
||||
let plaintext1 = Data("hello-secure".utf8)
|
||||
@@ -592,7 +589,7 @@ final class IntegrationTests: XCTestCase {
|
||||
|
||||
private func createNode(_ name: String, peerID: PeerID) {
|
||||
let node = MockBluetoothMeshService()
|
||||
node.myPeerID = peerID.id
|
||||
node.myPeerID = peerID
|
||||
node.mockNickname = name
|
||||
nodes[name] = node
|
||||
|
||||
@@ -669,9 +666,9 @@ final class IntegrationTests: XCTestCase {
|
||||
let peer1ID = nodes[node1]?.peerID,
|
||||
let peer2ID = nodes[node2]?.peerID else { return }
|
||||
|
||||
let msg1 = try manager1.initiateHandshake(with: PeerID(str: peer2ID))
|
||||
let msg2 = try manager2.handleIncomingHandshake(from: PeerID(str: peer1ID), message: msg1)!
|
||||
let msg3 = try manager1.handleIncomingHandshake(from: PeerID(str: peer2ID), message: msg2)!
|
||||
_ = try manager2.handleIncomingHandshake(from: PeerID(str: peer1ID), message: msg3)
|
||||
let msg1 = try manager1.initiateHandshake(with: peer2ID)
|
||||
let msg2 = try manager2.handleIncomingHandshake(from: peer1ID, message: msg1)!
|
||||
let msg3 = try manager1.handleIncomingHandshake(from: peer2ID, message: msg2)!
|
||||
_ = try manager2.handleIncomingHandshake(from: peer1ID, message: msg3)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ final class MockBLEService: NSObject {
|
||||
// MARK: - Properties matching BLEService
|
||||
|
||||
weak var delegate: BitchatDelegate?
|
||||
var myPeerID: String = "MOCK1234"
|
||||
var myPeerID: PeerID = "MOCK1234"
|
||||
var myNickname: String = "MockUser"
|
||||
|
||||
private let mockKeychain = MockKeychain()
|
||||
@@ -40,7 +40,7 @@ final class MockBLEService: NSObject {
|
||||
// Test-specific properties
|
||||
var sentMessages: [(message: BitchatMessage, packet: BitchatPacket)] = []
|
||||
var sentPackets: [BitchatPacket] = []
|
||||
var connectedPeers: Set<String> = []
|
||||
var connectedPeers: Set<PeerID> = []
|
||||
var messageDeliveryHandler: ((BitchatMessage) -> Void)?
|
||||
var packetDeliveryHandler: ((BitchatPacket) -> Void)?
|
||||
|
||||
@@ -54,7 +54,7 @@ final class MockBLEService: NSObject {
|
||||
return myNickname
|
||||
}
|
||||
|
||||
var peerID: String {
|
||||
var peerID: PeerID {
|
||||
return myPeerID
|
||||
}
|
||||
|
||||
@@ -72,8 +72,8 @@ final class MockBLEService: NSObject {
|
||||
|
||||
// MARK: - In-memory test bus (for E2E/Integration)
|
||||
/// Global per-process bus for deterministic routing in tests.
|
||||
private static var registry: [String: MockBLEService] = [:]
|
||||
private static var adjacency: [String: Set<String>] = [:]
|
||||
private static var registry: [PeerID: MockBLEService] = [:]
|
||||
private static var adjacency: [PeerID: Set<PeerID>] = [:]
|
||||
|
||||
/// Clears global bus state. Call from test `setUp()`.
|
||||
static func resetTestBus() {
|
||||
@@ -94,7 +94,7 @@ final class MockBLEService: NSObject {
|
||||
}
|
||||
|
||||
/// Adds an undirected edge between two peerIDs.
|
||||
private static func connectPeers(_ a: String, _ b: String) {
|
||||
private static func connectPeers(_ a: PeerID, _ b: PeerID) {
|
||||
var setA = adjacency[a] ?? []
|
||||
setA.insert(b)
|
||||
adjacency[a] = setA
|
||||
@@ -104,7 +104,7 @@ final class MockBLEService: NSObject {
|
||||
}
|
||||
|
||||
/// Removes an undirected edge between two peerIDs.
|
||||
private static func disconnectPeers(_ a: String, _ b: String) {
|
||||
private static func disconnectPeers(_ a: PeerID, _ b: PeerID) {
|
||||
if var setA = adjacency[a] { setA.remove(b); adjacency[a] = setA }
|
||||
if var setB = adjacency[b] { setB.remove(a); adjacency[b] = setB }
|
||||
}
|
||||
@@ -117,7 +117,7 @@ final class MockBLEService: NSObject {
|
||||
// Mock implementation - do nothing
|
||||
}
|
||||
|
||||
func isPeerConnected(_ peerID: String) -> Bool {
|
||||
func isPeerConnected(_ peerID: PeerID) -> Bool {
|
||||
return connectedPeers.contains(peerID)
|
||||
}
|
||||
|
||||
@@ -125,15 +125,15 @@ final class MockBLEService: NSObject {
|
||||
"MockPeer_\(peerID)"
|
||||
}
|
||||
|
||||
func getPeerNicknames() -> [String: String] {
|
||||
var nicknames: [String: String] = [:]
|
||||
func getPeerNicknames() -> [PeerID: String] {
|
||||
var nicknames: [PeerID: String] = [:]
|
||||
for peer in connectedPeers {
|
||||
nicknames[peer] = "MockPeer_\(peer)"
|
||||
}
|
||||
return nicknames
|
||||
}
|
||||
|
||||
func getPeers() -> [String: String] {
|
||||
func getPeers() -> [PeerID: String] {
|
||||
return getPeerNicknames()
|
||||
}
|
||||
|
||||
@@ -147,14 +147,14 @@ final class MockBLEService: NSObject {
|
||||
originalSender: nil,
|
||||
isPrivate: recipientID != nil,
|
||||
recipientNickname: nil,
|
||||
senderPeerID: PeerID(str: myPeerID),
|
||||
senderPeerID: myPeerID,
|
||||
mentions: mentions.isEmpty ? nil : mentions
|
||||
)
|
||||
|
||||
if let payload = message.toBinaryPayload() {
|
||||
let packet = BitchatPacket(
|
||||
type: 0x01,
|
||||
senderID: myPeerID.data(using: .utf8)!,
|
||||
senderID: myPeerID.id.data(using: .utf8)!,
|
||||
recipientID: recipientID?.data(using: .utf8),
|
||||
timestamp: UInt64(Date().timeIntervalSince1970 * 1000),
|
||||
payload: payload,
|
||||
@@ -182,7 +182,7 @@ final class MockBLEService: NSObject {
|
||||
}
|
||||
}
|
||||
|
||||
func sendPrivateMessage(_ content: String, to recipientPeerID: String, recipientNickname: String, messageID: String) {
|
||||
func sendPrivateMessage(_ content: String, to recipientPeerID: PeerID, recipientNickname: String, messageID: String) {
|
||||
let message = BitchatMessage(
|
||||
id: messageID,
|
||||
sender: myNickname,
|
||||
@@ -192,15 +192,15 @@ final class MockBLEService: NSObject {
|
||||
originalSender: nil,
|
||||
isPrivate: true,
|
||||
recipientNickname: recipientNickname,
|
||||
senderPeerID: PeerID(str: myPeerID),
|
||||
senderPeerID: myPeerID,
|
||||
mentions: nil
|
||||
)
|
||||
|
||||
if let payload = message.toBinaryPayload() {
|
||||
let packet = BitchatPacket(
|
||||
type: 0x01,
|
||||
senderID: myPeerID.data(using: .utf8)!,
|
||||
recipientID: recipientPeerID.data(using: .utf8)!,
|
||||
senderID: myPeerID.id.data(using: .utf8)!,
|
||||
recipientID: recipientPeerID.id.data(using: .utf8)!,
|
||||
timestamp: UInt64(Date().timeIntervalSince1970 * 1000),
|
||||
payload: payload,
|
||||
signature: nil,
|
||||
@@ -277,7 +277,7 @@ final class MockBLEService: NSObject {
|
||||
|
||||
// MARK: - Test Helper Methods
|
||||
|
||||
func simulateConnectedPeer(_ peerID: String) {
|
||||
func simulateConnectedPeer(_ peerID: PeerID) {
|
||||
registerIfNeeded()
|
||||
MockBLEService.connectPeers(myPeerID, peerID)
|
||||
connectedPeers.insert(peerID)
|
||||
@@ -285,7 +285,7 @@ final class MockBLEService: NSObject {
|
||||
delegate?.didUpdatePeerList(Array(connectedPeers))
|
||||
}
|
||||
|
||||
func simulateDisconnectedPeer(_ peerID: String) {
|
||||
func simulateDisconnectedPeer(_ peerID: PeerID) {
|
||||
MockBLEService.disconnectPeers(myPeerID, peerID)
|
||||
connectedPeers.remove(peerID)
|
||||
delegate?.didDisconnectFromPeer(peerID)
|
||||
@@ -336,14 +336,14 @@ final class MockBLEService: NSObject {
|
||||
packetDeliveryHandler?(packet)
|
||||
}
|
||||
|
||||
func getConnectedPeers() -> [String] {
|
||||
func getConnectedPeers() -> [PeerID] {
|
||||
return Array(connectedPeers)
|
||||
}
|
||||
|
||||
// MARK: - Compatibility methods for old tests
|
||||
|
||||
func sendPrivateMessage(_ content: String, to recipientPeerID: PeerID, recipientNickname: String, messageID: String? = nil) {
|
||||
sendPrivateMessage(content, to: recipientPeerID.id, recipientNickname: recipientNickname, messageID: messageID ?? UUID().uuidString)
|
||||
sendPrivateMessage(content, to: recipientPeerID, recipientNickname: recipientNickname, messageID: messageID ?? UUID().uuidString)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -355,7 +355,7 @@ typealias MockSimplifiedBluetoothService = MockBLEService
|
||||
extension MockBLEService {
|
||||
convenience init(peerID: PeerID, nickname: String) {
|
||||
self.init()
|
||||
myPeerID = peerID.id
|
||||
myPeerID = peerID
|
||||
mockNickname = nickname
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user