Signal-iOS/SignalServiceKit/tests/Account/IdentityKeyCheckerTest.swift
2025-12-30 11:34:05 -08:00

90 lines
3.0 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import LibSignalClient
import XCTest
@testable import SignalServiceKit
final class IdentityKeyCheckerTest: XCTestCase {
private var db: InMemoryDB!
private var identityKeyChecker: IdentityKeyCheckerImpl!
private var identityManagerMock: MockIdentityManager!
private var profileFetcherMock: ProfileFetcherMock!
private var identityKey1: ECKeyPair!
private var identityKey2: ECKeyPair!
override func setUp() {
db = InMemoryDB()
let recipientDbTable = RecipientDatabaseTable()
let recipientFetcher = RecipientFetcher(
recipientDatabaseTable: recipientDbTable,
searchableNameIndexer: MockSearchableNameIndexer(),
)
let recipientIdFinder = RecipientIdFinder(
recipientDatabaseTable: recipientDbTable,
recipientFetcher: recipientFetcher,
)
identityManagerMock = .init(recipientIdFinder: recipientIdFinder)
profileFetcherMock = ProfileFetcherMock()
identityKeyChecker = IdentityKeyCheckerImpl(
db: db,
identityManager: identityManagerMock,
profileFetcher: profileFetcherMock,
)
identityKey1 = ECKeyPair.generateKeyPair()
identityKey2 = ECKeyPair.generateKeyPair()
}
override func tearDown() {
profileFetcherMock.profileFetchResult.ensureUnset()
}
/// Runs the identity key checker.
/// - Returns
/// Whether or not the checker found a match. Throws if there was an error
/// while running the checker.
private func checkForMatch() async throws -> Bool {
return try await identityKeyChecker.serverHasSameKeyAsLocal(for: .pni, localIdentifier: Pni.randomForTesting())
}
func testErrorMatchingIfProfileFetchFails() async {
identityManagerMock.identityKeyPairs[.pni] = identityKey1
profileFetcherMock.profileFetchResult = .error()
let result = await Result { try await checkForMatch() }
XCTAssertThrowsError(try result.get())
}
func testDoesNotMatchIfRemotePniIdentityKeyDiffers() async throws {
identityManagerMock.identityKeyPairs[.pni] = identityKey1
profileFetcherMock.profileFetchResult = .value(identityKey2.identityKeyPair.identityKey)
let result = try await checkForMatch()
XCTAssertFalse(result)
}
func testMatchesIfRemotePniIdentityKeyMatches() async throws {
identityManagerMock.identityKeyPairs[.pni] = identityKey1
profileFetcherMock.profileFetchResult = .value(identityKey1.identityKeyPair.identityKey)
let result = try await checkForMatch()
XCTAssertTrue(result)
}
}
// MARK: - Mocks
// MARK: ProfileFetcher
private class ProfileFetcherMock: IdentityKeyCheckerImpl.Shims.ProfileFetcher {
var profileFetchResult: ConsumableMockPromise<IdentityKey> = .unset
func fetchIdentityPublicKey(serviceId: ServiceId) async throws -> IdentityKey {
return try await profileFetchResult.consumeIntoPromise().awaitable()
}
}