mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-24 23:25:19 +00:00
* Refactor BLE transport event handling * Make image output paths unique * Keep queued Nostr read receipts alive * Refine BLE ingress fanout * Rediscover BLE service after invalidation * Extract BLE notification retry buffer * Extract BLE inbound write buffer * Extract BLE fragment assembly buffer * Tidy secure log handling from device run * Allow self-authored RSR ingress replies * Harden read receipt queue test timing --------- Co-authored-by: jack <jackjackbits@users.noreply.github.com>
116 lines
3.3 KiB
Swift
116 lines
3.3 KiB
Swift
//
|
|
// RelayControllerTests.swift
|
|
// bitchatTests
|
|
//
|
|
// Tests for relay decision logic.
|
|
//
|
|
|
|
import Testing
|
|
import Foundation
|
|
@testable import bitchat
|
|
|
|
struct RelayControllerTests {
|
|
|
|
@Test
|
|
func ttlOne_doesNotRelay() async {
|
|
let decision = RelayController.decide(
|
|
ttl: 1,
|
|
senderIsSelf: false,
|
|
isEncrypted: false,
|
|
isDirectedEncrypted: false,
|
|
isFragment: false,
|
|
isDirectedFragment: false,
|
|
isHandshake: false,
|
|
isAnnounce: false,
|
|
degree: 0,
|
|
highDegreeThreshold: TransportConfig.bleHighDegreeThreshold
|
|
)
|
|
|
|
#expect(!decision.shouldRelay)
|
|
#expect(decision.newTTL == 1)
|
|
}
|
|
|
|
@Test
|
|
func handshake_alwaysRelaysWithTTLDecrement() async {
|
|
let decision = RelayController.decide(
|
|
ttl: 3,
|
|
senderIsSelf: false,
|
|
isEncrypted: false,
|
|
isDirectedEncrypted: false,
|
|
isFragment: false,
|
|
isDirectedFragment: false,
|
|
isHandshake: true,
|
|
isAnnounce: false,
|
|
degree: 3,
|
|
highDegreeThreshold: TransportConfig.bleHighDegreeThreshold
|
|
)
|
|
|
|
#expect(decision.shouldRelay)
|
|
#expect(decision.newTTL == 2)
|
|
#expect(decision.delayMs >= 10 && decision.delayMs <= 35)
|
|
}
|
|
|
|
@Test
|
|
func localRecipientDoesNotRelayDirectedTraffic() async {
|
|
let decision = RelayController.decide(
|
|
ttl: 7,
|
|
senderIsSelf: false,
|
|
recipientIsSelf: true,
|
|
isEncrypted: true,
|
|
isDirectedEncrypted: true,
|
|
isFragment: false,
|
|
isDirectedFragment: false,
|
|
isHandshake: false,
|
|
isAnnounce: false,
|
|
degree: 3,
|
|
highDegreeThreshold: TransportConfig.bleHighDegreeThreshold
|
|
)
|
|
|
|
#expect(!decision.shouldRelay)
|
|
#expect(decision.newTTL == 7)
|
|
}
|
|
|
|
@Test
|
|
func fragment_relaysWithFragmentCap() async {
|
|
let decision = RelayController.decide(
|
|
ttl: 10,
|
|
senderIsSelf: false,
|
|
isEncrypted: false,
|
|
isDirectedEncrypted: false,
|
|
isFragment: true,
|
|
isDirectedFragment: false,
|
|
isHandshake: false,
|
|
isAnnounce: false,
|
|
degree: 3,
|
|
highDegreeThreshold: TransportConfig.bleHighDegreeThreshold
|
|
)
|
|
|
|
let ttlCap = min(UInt8(10), TransportConfig.bleFragmentRelayTtlCap)
|
|
let expected = ttlCap &- 1
|
|
|
|
#expect(decision.shouldRelay)
|
|
#expect(decision.newTTL == expected)
|
|
#expect(decision.delayMs >= TransportConfig.bleFragmentRelayMinDelayMs)
|
|
#expect(decision.delayMs <= TransportConfig.bleFragmentRelayMaxDelayMs)
|
|
}
|
|
|
|
@Test
|
|
func denseGraph_capsTTL() async {
|
|
let decision = RelayController.decide(
|
|
ttl: 10,
|
|
senderIsSelf: false,
|
|
isEncrypted: false,
|
|
isDirectedEncrypted: false,
|
|
isFragment: false,
|
|
isDirectedFragment: false,
|
|
isHandshake: false,
|
|
isAnnounce: false,
|
|
degree: TransportConfig.bleHighDegreeThreshold,
|
|
highDegreeThreshold: TransportConfig.bleHighDegreeThreshold
|
|
)
|
|
|
|
#expect(decision.shouldRelay)
|
|
#expect(decision.newTTL == 4)
|
|
}
|
|
}
|