1package com.peachpasswords.sync23import kotlinx.coroutines.runBlocking4import org.junit.Assert.assertFalse5import org.junit.Assert.assertNull6import org.junit.Assert.assertTrue7import org.junit.Before8import org.junit.Test910class ChirpSyncTransportTest {11 private val peerPubkey = "ab".repeat(32)1213 @Before14 fun setUp() {15 resetSubnetProbeCooldown()16 }1718 @Test19 fun `subnetProbeOnCooldown returns false before any probe has happened`() {20 assertFalse(subnetProbeOnCooldown(peerPubkey))21 }2223 @Test24 fun `subnetProbeOnCooldown returns true within the cooldown window after a probe`() = runBlocking {25 val now = 1_000_000L26 probeSubnetForPeer(27 subnet = "10.0.0",28 port = SyncReconnectListener.SYNC_PORT,29 ourLongTermPrivateKey = ByteArray(32),30 ourLongTermPublicKey = ByteArray(32),31 expectedRemotePubkeyHex = peerPubkey,32 batch = 254,33 timeoutMs = 1,34 now = now,35 )36 assertTrue(subnetProbeOnCooldown(peerPubkey, now + 1))37 assertTrue(subnetProbeOnCooldown(peerPubkey, now + SUBNET_PROBE_COOLDOWN_MS - 1))38 }3940 @Test41 fun `subnetProbeOnCooldown releases after the window expires`() = runBlocking {42 val now = 1_000_000L43 probeSubnetForPeer(44 subnet = "10.0.0",45 port = SyncReconnectListener.SYNC_PORT,46 ourLongTermPrivateKey = ByteArray(32),47 ourLongTermPublicKey = ByteArray(32),48 expectedRemotePubkeyHex = peerPubkey,49 batch = 254,50 timeoutMs = 1,51 now = now,52 )53 assertFalse(subnetProbeOnCooldown(peerPubkey, now + SUBNET_PROBE_COOLDOWN_MS))54 }5556 @Test57 fun `probeSubnetForPeer returns null and skips the scan when on cooldown`() = runBlocking {58 val now = 1_000_000L59 probeSubnetForPeer(60 subnet = "10.0.0",61 port = SyncReconnectListener.SYNC_PORT,62 ourLongTermPrivateKey = ByteArray(32),63 ourLongTermPublicKey = ByteArray(32),64 expectedRemotePubkeyHex = peerPubkey,65 batch = 254,66 timeoutMs = 1,67 now = now,68 )69 val result = probeSubnetForPeer(70 subnet = "10.0.0",71 port = SyncReconnectListener.SYNC_PORT,72 ourLongTermPrivateKey = ByteArray(32),73 ourLongTermPublicKey = ByteArray(32),74 expectedRemotePubkeyHex = peerPubkey,75 batch = 254,76 timeoutMs = 1,77 now = now + 1_000,78 )79 assertNull(result)80 }8182 @Test83 fun `probeSubnetForPeer tracks cooldown independently per peer pubkey`() = runBlocking {84 val now = 1_000_000L85 val other = "cd".repeat(32)86 probeSubnetForPeer(87 subnet = "10.0.0",88 port = SyncReconnectListener.SYNC_PORT,89 ourLongTermPrivateKey = ByteArray(32),90 ourLongTermPublicKey = ByteArray(32),91 expectedRemotePubkeyHex = peerPubkey,92 batch = 254,93 timeoutMs = 1,94 now = now,95 )96 assertTrue(subnetProbeOnCooldown(peerPubkey, now + 1))97 assertFalse(subnetProbeOnCooldown(other, now + 1))98 }99}