Merge fb5b1349364b9b9f1a88a6117eafcd990ca05ddf into 1f59e814f90c3f489f48d68262cb1bf640bf6181

This commit is contained in:
Sam 2026-08-05 16:21:48 -05:00 committed by GitHub
commit 3b83e68a79
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 48 additions and 1 deletions

View File

@ -57,10 +57,13 @@ final class MessageDeduplicator {
lock.lock()
defer { lock.unlock() }
let now = Date()
cleanupOldEntries(before: now.addingTimeInterval(-maxAge))
if lookup[id] == nil {
let now = Date()
entries.append(Entry(id: id, timestamp: now))
lookup[id] = now
trimIfNeeded()
}
}

View File

@ -0,0 +1,44 @@
//
// MessageDeduplicatorTests.swift
// bitchatTests
//
// Tests for MessageDeduplicator.
// This is free and unencumbered software released into the public domain.
//
import Foundation
import Testing
@testable import bitchat
@Suite("Message Deduplicator")
struct MessageDeduplicatorTests {
@Test func markProcessed_enforcesMaximumCount() {
let deduplicator = MessageDeduplicator(maxAge: 300, maxCount: 4)
for id in ["a", "b", "c", "d", "e"] {
deduplicator.markProcessed(id)
}
#expect(!deduplicator.contains("a"))
#expect(!deduplicator.contains("b"))
#expect(deduplicator.contains("c"))
#expect(deduplicator.contains("d"))
#expect(deduplicator.contains("e"))
}
@Test func markProcessed_cleansExpiredEntriesBeforeCountTrim() async {
let deduplicator = MessageDeduplicator(maxAge: 0.1, maxCount: 4)
deduplicator.markProcessed("expired")
try? await Task.sleep(nanoseconds: 200_000_000)
for id in ["b", "c", "d", "e"] {
deduplicator.markProcessed(id)
}
#expect(deduplicator.contains("b"))
#expect(deduplicator.contains("c"))
#expect(deduplicator.contains("d"))
#expect(deduplicator.contains("e"))
}
}