Files
bitchat/bitchatTests/Services/BLEMaintenancePolicyTests.swift

114 lines
4.1 KiB
Swift

import Foundation
import Testing
@testable import bitchat
@Suite("BLE maintenance policy tests")
struct BLEMaintenancePolicyTests {
@Test("discovery mode keeps announces frequent and advertising on")
func discoveryModeAnnouncesAndEnsuresAdvertising() {
let plan = BLEMaintenancePolicy.plan(
cycle: 1,
connectedCount: 0,
peerRegistryIsEmpty: true,
elapsedSinceLastAnnounce: TransportConfig.bleAnnounceIntervalSeconds,
hasRecentTraffic: false
)
#expect(plan.shouldSendAnnounce)
#expect(plan.shouldEnsureAdvertising)
#expect(plan.shouldFlushDirectedSpool)
#expect(!plan.shouldRunCleanup)
#expect(!plan.shouldResetCounter)
}
@Test("connected sparse meshes use sparse announce cadence")
func connectedSparseMeshUsesSparseAnnounceCadence() {
let beforeTarget = BLEMaintenancePolicy.plan(
cycle: 2,
connectedCount: 2,
peerRegistryIsEmpty: false,
elapsedSinceLastAnnounce: TransportConfig.bleConnectedAnnounceBaseSecondsSparse - 0.1,
hasRecentTraffic: false,
connectedAnnounceJitterOffset: 0
)
let atTarget = BLEMaintenancePolicy.plan(
cycle: 2,
connectedCount: 2,
peerRegistryIsEmpty: false,
elapsedSinceLastAnnounce: TransportConfig.bleConnectedAnnounceBaseSecondsSparse,
hasRecentTraffic: false,
connectedAnnounceJitterOffset: 0
)
#expect(!beforeTarget.shouldSendAnnounce)
#expect(atTarget.shouldSendAnnounce)
#expect(!beforeTarget.shouldEnsureAdvertising)
}
@Test("dense meshes use dense announce cadence")
func denseMeshUsesDenseAnnounceCadence() {
let beforeTarget = BLEMaintenancePolicy.plan(
cycle: 3,
connectedCount: TransportConfig.bleHighDegreeThreshold,
peerRegistryIsEmpty: false,
elapsedSinceLastAnnounce: TransportConfig.bleConnectedAnnounceBaseSecondsDense - 0.1,
hasRecentTraffic: false,
connectedAnnounceJitterOffset: 0
)
let atTarget = BLEMaintenancePolicy.plan(
cycle: 3,
connectedCount: TransportConfig.bleHighDegreeThreshold,
peerRegistryIsEmpty: false,
elapsedSinceLastAnnounce: TransportConfig.bleConnectedAnnounceBaseSecondsDense,
hasRecentTraffic: false,
connectedAnnounceJitterOffset: 0
)
#expect(!beforeTarget.shouldSendAnnounce)
#expect(atTarget.shouldSendAnnounce)
#expect(atTarget.shouldRunCleanup)
}
@Test("recent traffic can request a quick announce")
func recentTrafficRequestsQuickAnnounce() {
let plan = BLEMaintenancePolicy.plan(
cycle: 4,
connectedCount: 2,
peerRegistryIsEmpty: false,
elapsedSinceLastAnnounce: 10.0,
hasRecentTraffic: true,
connectedAnnounceJitterOffset: TransportConfig.bleConnectedAnnounceJitterSparse
)
#expect(plan.shouldSendAnnounce)
#expect(!plan.shouldFlushDirectedSpool)
}
@Test("maintenance cadence controls cleanup spool flushing and counter reset")
func maintenanceCadenceControlsPeriodicWork() {
let cleanupAndFlush = BLEMaintenancePolicy.plan(
cycle: 3,
connectedCount: 1,
peerRegistryIsEmpty: false,
elapsedSinceLastAnnounce: 0,
hasRecentTraffic: false,
connectedAnnounceJitterOffset: 0
)
let reset = BLEMaintenancePolicy.plan(
cycle: 6,
connectedCount: 1,
peerRegistryIsEmpty: false,
elapsedSinceLastAnnounce: 0,
hasRecentTraffic: false,
connectedAnnounceJitterOffset: 0
)
#expect(cleanupAndFlush.shouldRunCleanup)
#expect(cleanupAndFlush.shouldFlushDirectedSpool)
#expect(!cleanupAndFlush.shouldResetCounter)
#expect(reset.shouldRunCleanup)
#expect(!reset.shouldFlushDirectedSpool)
#expect(reset.shouldResetCounter)
}
}