// // 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 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) } }