mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-24 22:25:18 +00:00
58 lines
1.8 KiB
Swift
58 lines
1.8 KiB
Swift
import BitFoundation
|
|
import Foundation
|
|
import Testing
|
|
@testable import bitchat
|
|
|
|
struct BLELocalIdentityStateStoreTests {
|
|
@Test
|
|
func identityReplacementUpdatesWireBytesAtomically() throws {
|
|
let initial = PeerID(str: "0011223344556677")
|
|
let replacement = PeerID(str: "8899aabbccddeeff")
|
|
let store = BLELocalIdentityStateStore(peerID: initial, nickname: "alice")
|
|
|
|
store.replacePeerIdentity(with: replacement)
|
|
|
|
let snapshot = store.snapshot()
|
|
#expect(snapshot.peerID == replacement)
|
|
#expect(snapshot.peerIDData == Data(hexString: replacement.id))
|
|
#expect(snapshot.nickname == "alice")
|
|
}
|
|
|
|
@Test
|
|
func concurrentReadsNeverObserveSplitIdentityState() {
|
|
let peerIDs = [
|
|
PeerID(str: "0011223344556677"),
|
|
PeerID(str: "8899aabbccddeeff")
|
|
]
|
|
let store = BLELocalIdentityStateStore(peerID: peerIDs[0], nickname: "alice")
|
|
let failures = LockedFailureRecorder()
|
|
|
|
DispatchQueue.concurrentPerform(iterations: 2_000) { index in
|
|
if index.isMultiple(of: 2) {
|
|
store.replacePeerIdentity(with: peerIDs[index % peerIDs.count])
|
|
} else {
|
|
store.setNickname(index.isMultiple(of: 3) ? "alice" : "bob")
|
|
}
|
|
|
|
let snapshot = store.snapshot()
|
|
let expectedWireID = Data(hexString: snapshot.peerID.id) ?? Data()
|
|
if snapshot.peerIDData != expectedWireID {
|
|
failures.record()
|
|
}
|
|
}
|
|
|
|
#expect(!failures.hasFailure)
|
|
}
|
|
}
|
|
|
|
private final class LockedFailureRecorder: @unchecked Sendable {
|
|
private let lock = NSLock()
|
|
private var failed = false
|
|
|
|
var hasFailure: Bool { lock.withLock { failed } }
|
|
|
|
func record() {
|
|
lock.withLock { failed = true }
|
|
}
|
|
}
|