135 lines
5.4 KiB
Swift
135 lines
5.4 KiB
Swift
//
|
|
// Copyright 2018 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import XCTest
|
|
import Foundation
|
|
import LibSignalClient
|
|
@testable import SignalServiceKit
|
|
|
|
class OWSUDManagerTest: SSKBaseTest {
|
|
|
|
private var udManagerImpl: OWSUDManagerImpl {
|
|
return SSKEnvironment.shared.udManagerRef as! OWSUDManagerImpl
|
|
}
|
|
|
|
// MARK: - Setup/Teardown
|
|
|
|
private let localIdentifiers: LocalIdentifiers = .forUnitTests
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
|
|
SSKEnvironment.shared.databaseStorageRef.write { tx in
|
|
(DependenciesBridge.shared.registrationStateChangeManager as! RegistrationStateChangeManagerImpl).registerForTests(
|
|
localIdentifiers: localIdentifiers,
|
|
tx: tx
|
|
)
|
|
}
|
|
|
|
let profileManager = SSKEnvironment.shared.profileManagerRef as! OWSFakeProfileManager
|
|
profileManager.fakeUserProfiles = [
|
|
localIdentifiers.aciAddress: OWSUserProfile(address: .localUser, profileKey: Aes256Key.generateRandom()),
|
|
]
|
|
}
|
|
|
|
// MARK: - Tests
|
|
|
|
func testMode_noProfileKey() {
|
|
XCTAssert(DependenciesBridge.shared.tsAccountManager.registrationStateWithMaybeSneakyTransaction.isRegistered)
|
|
|
|
// Ensure UD is enabled by setting our own access level to enabled.
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.enabled, for: localIdentifiers.aci, tx: tx)
|
|
}
|
|
|
|
let bobRecipientAci = Aci.randomForTesting()
|
|
|
|
write { tx in
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)!
|
|
XCTAssertEqual(.unknown, udAccess.mode)
|
|
XCTAssertEqual(udAccess.key.keyData, SMKUDAccessKey.zeroedKey.keyData)
|
|
}
|
|
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.unknown, for: bobRecipientAci, tx: tx)
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)!
|
|
XCTAssertEqual(.unknown, udAccess.mode)
|
|
XCTAssertEqual(udAccess.key.keyData, SMKUDAccessKey.zeroedKey.keyData)
|
|
}
|
|
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.disabled, for: bobRecipientAci, tx: tx)
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)
|
|
XCTAssertNil(udAccess)
|
|
}
|
|
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.enabled, for: bobRecipientAci, tx: tx)
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)
|
|
XCTAssertNil(udAccess)
|
|
}
|
|
|
|
write { tx in
|
|
// Bob should work in unrestricted mode, even if he doesn't have a profile key.
|
|
udManagerImpl.setUnidentifiedAccessMode(.unrestricted, for: bobRecipientAci, tx: tx)
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)!
|
|
XCTAssertEqual(.unrestricted, udAccess.mode)
|
|
XCTAssertEqual(udAccess.key.keyData, SMKUDAccessKey.zeroedKey.keyData)
|
|
}
|
|
}
|
|
|
|
func testMode_withProfileKey() {
|
|
XCTAssert(DependenciesBridge.shared.tsAccountManager.registrationStateWithMaybeSneakyTransaction.isRegistered)
|
|
guard let localAddress = DependenciesBridge.shared.tsAccountManager.localIdentifiersWithMaybeSneakyTransaction?.aciAddress else {
|
|
XCTFail("localAddress was unexpectedly nil")
|
|
return
|
|
}
|
|
XCTAssert(localAddress.isValid)
|
|
|
|
// Ensure UD is enabled by setting our own access level to enabled.
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.enabled, for: localIdentifiers.aci, tx: tx)
|
|
}
|
|
|
|
let profileManager = SSKEnvironment.shared.profileManagerRef as! OWSFakeProfileManager
|
|
|
|
let bobRecipientAci = Aci.randomForTesting()
|
|
profileManager.fakeUserProfiles![SignalServiceAddress(bobRecipientAci)] = OWSUserProfile(address: .otherUser(SignalServiceAddress(bobRecipientAci)), profileKey: Aes256Key.generateRandom())
|
|
|
|
write { tx in
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)!
|
|
XCTAssertEqual(.unknown, udAccess.mode)
|
|
XCTAssertNotEqual(udAccess.key.keyData, SMKUDAccessKey.zeroedKey.keyData)
|
|
}
|
|
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.unknown, for: bobRecipientAci, tx: tx)
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)!
|
|
XCTAssertEqual(.unknown, udAccess.mode)
|
|
XCTAssertNotEqual(udAccess.key.keyData, SMKUDAccessKey.zeroedKey.keyData)
|
|
}
|
|
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.disabled, for: bobRecipientAci, tx: tx)
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)
|
|
XCTAssertNil(udAccess)
|
|
}
|
|
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.enabled, for: bobRecipientAci, tx: tx)
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)!
|
|
XCTAssertEqual(.enabled, udAccess.mode)
|
|
XCTAssertNotEqual(udAccess.key.keyData, SMKUDAccessKey.zeroedKey.keyData)
|
|
}
|
|
|
|
write { tx in
|
|
udManagerImpl.setUnidentifiedAccessMode(.unrestricted, for: bobRecipientAci, tx: tx)
|
|
let udAccess = udManagerImpl.udAccess(for: bobRecipientAci, tx: tx)!
|
|
XCTAssertEqual(.unrestricted, udAccess.mode)
|
|
XCTAssertEqual(udAccess.key.keyData, SMKUDAccessKey.zeroedKey.keyData)
|
|
}
|
|
}
|
|
}
|