diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index 9747e84fb..05c7864b3 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -316,7 +316,7 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific - (BOOL)isContactFriend { - return true; + return false; } @end diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift index ca937acd8..9297371e0 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift @@ -13,17 +13,7 @@ class FriendRequestProtocolTests : XCTestCase { override func setUp() { super.setUp() - ClearCurrentAppContextForTests() - SetCurrentAppContext(TestAppContext()) - MockSSKEnvironment.activate() - - let identityManager = OWSIdentityManager.shared() - let seed = Randomness.generateRandomBytes(16)! - let keyPair = Curve25519.generateKeyPair(fromSeed: seed + seed) - let databaseConnection = identityManager.value(forKey: "dbConnection") as! YapDatabaseConnection - databaseConnection.setObject(keyPair, forKey: OWSPrimaryStorageIdentityKeyStoreIdentityKey, inCollection: OWSPrimaryStorageIdentityKeyStoreCollection) - TSAccountManager.sharedInstance().phoneNumberAwaitingVerification = keyPair.hexEncodedPublicKey - TSAccountManager.sharedInstance().didRegister() + LokiTestUtilities.setupMockEnvironment() } // MARK: - Helpers @@ -36,52 +26,21 @@ class FriendRequestProtocolTests : XCTestCase { return isFriendRequestStatus(oneOf: [ value ], for: hexEncodedPublicKey, transaction: transaction) } - func generateHexEncodedPublicKey() -> String { - return Curve25519.generateKeyPair().hexEncodedPublicKey - } - - func getDevice(for hexEncodedPublicKey: String) -> DeviceLink.Device? { - guard let signature = Data.getSecureRandomData(ofSize: 64) else { return nil } - return DeviceLink.Device(hexEncodedPublicKey: hexEncodedPublicKey, signature: signature) - } - - func createContactThread(for hexEncodedPublicKey: String) -> TSContactThread { - var result: TSContactThread! - storage.dbReadWriteConnection.readWrite { transaction in - result = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction) - } - return result - } - - func createGroupThread(groupType: GroupType) -> TSGroupThread? { - let hexEncodedGroupID = Randomness.generateRandomBytes(kGroupIdLength)!.toHexString() - - let groupID: Data - switch groupType { - case .closedGroup: groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(hexEncodedGroupID) - case .openGroup: groupID = LKGroupUtilities.getEncodedOpenGroupIDAsData(hexEncodedGroupID) - case .rssFeed: groupID = LKGroupUtilities.getEncodedRSSFeedIDAsData(hexEncodedGroupID) - default: return nil - } - - return TSGroupThread.getOrCreateThread(withGroupId: groupID, groupType: groupType) - } - // MARK: - shouldInputBarBeEnabled func test_shouldInputBarBeEnabledReturnsTrueOnGroupThread() { let allGroupTypes: [GroupType] = [ .closedGroup, .openGroup, .rssFeed ] for groupType in allGroupTypes { - guard let groupThread = createGroupThread(groupType: groupType) else { return XCTFail() } + guard let groupThread = LokiTestUtilities.createGroupThread(groupType: groupType) else { return XCTFail() } XCTAssertTrue(FriendRequestProtocol.shouldInputBarBeEnabled(for: groupThread)) } } func test_shouldInputBarBeEnabledReturnsTrueOnNoteToSelf() { guard let master = OWSIdentityManager.shared().identityKeyPair()?.hexEncodedPublicKey else { return XCTFail() } - let slave = generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -90,8 +49,8 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.requestSent, for: slave, transaction: transaction) } - let masterThread = createContactThread(for: master) - let slaveThread = createContactThread(for: slave) + let masterThread = LokiTestUtilities.createContactThread(for: master) + let slaveThread = LokiTestUtilities.createContactThread(for: slave) XCTAssertTrue(FriendRequestProtocol.shouldInputBarBeEnabled(for: masterThread)) XCTAssertTrue(FriendRequestProtocol.shouldInputBarBeEnabled(for: slaveThread)) @@ -99,8 +58,8 @@ class FriendRequestProtocolTests : XCTestCase { func test_shouldInputBarBeEnabledReturnsTrueWhenStatusIsNotPending() { let statuses: [LKFriendRequestStatus] = [ .none, .requestExpired, .friends ] - let device = generateHexEncodedPublicKey() - let thread = createContactThread(for: device) + let device = LokiTestUtilities.generateHexEncodedPublicKey() + let thread = LokiTestUtilities.createContactThread(for: device) for status in statuses { storage.dbReadWriteConnection.readWrite { transaction in @@ -113,8 +72,8 @@ class FriendRequestProtocolTests : XCTestCase { func test_shouldInputBarBeEnabledReturnsFalseWhenStatusIsPending() { let statuses: [LKFriendRequestStatus] = [ .requestSending, .requestSent, .requestReceived ] - let device = generateHexEncodedPublicKey() - let thread = createContactThread(for: device) + let device = LokiTestUtilities.generateHexEncodedPublicKey() + let thread = LokiTestUtilities.createContactThread(for: device) for status in statuses { storage.dbReadWriteConnection.readWrite { transaction in @@ -126,11 +85,11 @@ class FriendRequestProtocolTests : XCTestCase { } func test_shouldInputBarBeEnabledReturnsTrueWhenFriendsWithOneLinkedDevice() { - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -139,19 +98,19 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.requestSent, for: slave, transaction: transaction) } - let masterThread = createContactThread(for: master) - let slaveThread = createContactThread(for: slave) + let masterThread = LokiTestUtilities.createContactThread(for: master) + let slaveThread = LokiTestUtilities.createContactThread(for: slave) XCTAssertTrue(FriendRequestProtocol.shouldInputBarBeEnabled(for: masterThread)) XCTAssertTrue(FriendRequestProtocol.shouldInputBarBeEnabled(for: slaveThread)) } func test_shouldInputBarBeEnabledReturnsFalseWhenOneLinkedDeviceIsPending() { - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -159,8 +118,8 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.none, for: master, transaction: transaction) } - let masterThread = createContactThread(for: master) - let slaveThread = createContactThread(for: slave) + let masterThread = LokiTestUtilities.createContactThread(for: master) + let slaveThread = LokiTestUtilities.createContactThread(for: slave) let statuses: [LKFriendRequestStatus] = [ .requestSending, .requestSent, .requestReceived ] for status in statuses { @@ -174,11 +133,11 @@ class FriendRequestProtocolTests : XCTestCase { } func test_shouldInputBarBeEnabledReturnsTrueWhenAllLinkedDevicesAreNotPendingAndNotFriends() { - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -187,8 +146,8 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.none, for: slave, transaction: transaction) } - let masterThread = createContactThread(for: master) - let slaveThread = createContactThread(for: slave) + let masterThread = LokiTestUtilities.createContactThread(for: master) + let slaveThread = LokiTestUtilities.createContactThread(for: slave) let statuses: [LKFriendRequestStatus] = [ .requestExpired, .none ] for status in statuses { @@ -202,11 +161,11 @@ class FriendRequestProtocolTests : XCTestCase { } func test_shouldInputBarEnabledShouldStillWorkIfLinkedDeviceThreadDoesNotExist() { - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -215,7 +174,7 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.friends, for: slave, transaction: transaction) } - let masterThread = createContactThread(for: master) + let masterThread = LokiTestUtilities.createContactThread(for: master) XCTAssertTrue(FriendRequestProtocol.shouldInputBarBeEnabled(for: masterThread)) } @@ -224,17 +183,17 @@ class FriendRequestProtocolTests : XCTestCase { func test_shouldAttachmentButtonBeEnabledReturnsTrueOnGroupThread() { let allGroupTypes: [GroupType] = [ .closedGroup, .openGroup, .rssFeed ] for groupType in allGroupTypes { - guard let groupThread = createGroupThread(groupType: groupType) else { return XCTFail() } + guard let groupThread = LokiTestUtilities.createGroupThread(groupType: groupType) else { return XCTFail() } XCTAssertTrue(FriendRequestProtocol.shouldAttachmentButtonBeEnabled(for: groupThread)) } } func test_shouldAttachmentButtonBeEnabledReturnsTrueOnNoteToSelf() { guard let master = OWSIdentityManager.shared().identityKeyPair()?.hexEncodedPublicKey else { return XCTFail() } - let slave = generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -243,16 +202,16 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.requestSent, for: slave, transaction: transaction) } - let masterThread = createContactThread(for: master) - let slaveThread = createContactThread(for: slave) + let masterThread = LokiTestUtilities.createContactThread(for: master) + let slaveThread = LokiTestUtilities.createContactThread(for: slave) XCTAssertTrue(FriendRequestProtocol.shouldAttachmentButtonBeEnabled(for: masterThread)) XCTAssertTrue(FriendRequestProtocol.shouldAttachmentButtonBeEnabled(for: slaveThread)) } func test_shouldAttachmentButtonBeEnabledReturnsTrueWhenFriends() { - let device = generateHexEncodedPublicKey() - let thread = createContactThread(for: device) + let device = LokiTestUtilities.generateHexEncodedPublicKey() + let thread = LokiTestUtilities.createContactThread(for: device) storage.dbReadWriteConnection.readWrite { transaction in self.storage.setFriendRequestStatus(.friends, for: device, transaction: transaction) @@ -263,8 +222,8 @@ class FriendRequestProtocolTests : XCTestCase { func test_shouldAttachmentButtonBeEnabledReturnsFalseWhenNotFriends() { let statuses: [LKFriendRequestStatus] = [ .requestSending, .requestSent, .requestReceived, .none, .requestExpired ] - let device = generateHexEncodedPublicKey() - let thread = createContactThread(for: device) + let device = LokiTestUtilities.generateHexEncodedPublicKey() + let thread = LokiTestUtilities.createContactThread(for: device) for status in statuses { storage.dbReadWriteConnection.readWrite { transaction in @@ -276,11 +235,11 @@ class FriendRequestProtocolTests : XCTestCase { } func test_shouldAttachmentButtonBeEnabledReturnsTrueWhenFriendsWithOneLinkedDevice() { - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -289,19 +248,19 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.requestSent, for: slave, transaction: transaction) } - let masterThread = createContactThread(for: master) - let slaveThread = createContactThread(for: slave) + let masterThread = LokiTestUtilities.createContactThread(for: master) + let slaveThread = LokiTestUtilities.createContactThread(for: slave) XCTAssertTrue(FriendRequestProtocol.shouldAttachmentButtonBeEnabled(for: masterThread)) XCTAssertTrue(FriendRequestProtocol.shouldAttachmentButtonBeEnabled(for: slaveThread)) } func test_shouldAttachmentButtonBeEnabledShouldStillWorkIfLinkedDeviceThreadDoesNotExist() { - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -310,7 +269,7 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.friends, for: slave, transaction: transaction) } - let masterThread = createContactThread(for: master) + let masterThread = LokiTestUtilities.createContactThread(for: master) XCTAssertTrue(FriendRequestProtocol.shouldAttachmentButtonBeEnabled(for: masterThread)) } @@ -319,17 +278,17 @@ class FriendRequestProtocolTests : XCTestCase { func test_getFriendRequestUIStateShouldReturnNoneForGroupThreads() { let allGroupTypes: [GroupType] = [ .closedGroup, .openGroup, .rssFeed ] for groupType in allGroupTypes { - guard let groupThread = createGroupThread(groupType: groupType) else { return XCTFail() } + guard let groupThread = LokiTestUtilities.createGroupThread(groupType: groupType) else { return XCTFail() } XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIStatus(for: groupThread) == .none) } } func test_getFriendRequestUIStateShouldReturnNoneOnNoteToSelf() { guard let master = OWSIdentityManager.shared().identityKeyPair()?.hexEncodedPublicKey else { return XCTFail() } - let slave = generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -338,16 +297,16 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.friends, for: slave, transaction: transaction) } - let masterThread = createContactThread(for: master) - let slaveThread = createContactThread(for: slave) + let masterThread = LokiTestUtilities.createContactThread(for: master) + let slaveThread = LokiTestUtilities.createContactThread(for: slave) XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIStatus(for: masterThread) == .none) XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIStatus(for: slaveThread) == .none ) } func test_getFriendRequestUIStateShouldReturnTheCorrectStates() { - let bob = generateHexEncodedPublicKey() - let bobThread = createContactThread(for: bob) + let bob = LokiTestUtilities.generateHexEncodedPublicKey() + let bobThread = LokiTestUtilities.createContactThread(for: bob) let expectedStatuses: [LKFriendRequestStatus:FriendRequestProtocol.FriendRequestUIStatus] = [ .none: .none, @@ -368,11 +327,11 @@ class FriendRequestProtocolTests : XCTestCase { } func test_getFriendRequestUIStateShouldWorkWithMultiDevice() { - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -380,8 +339,8 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.none, for: master, transaction: transaction) } - let masterThread = createContactThread(for: master) - let slaveThread = createContactThread(for: slave) + let masterThread = LokiTestUtilities.createContactThread(for: master) + let slaveThread = LokiTestUtilities.createContactThread(for: slave) let expectedStatuses: [LKFriendRequestStatus:FriendRequestProtocol.FriendRequestUIStatus] = [ .none: .none, @@ -404,13 +363,13 @@ class FriendRequestProtocolTests : XCTestCase { func test_getFriendRequestUIStateShouldPreferFriendsOverRequestReceived() { // Case: We don't want to confuse the user by showing a friend request box when they're already friends. - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } - let masterThread = createContactThread(for: master) + let masterThread = LokiTestUtilities.createContactThread(for: master) let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -425,13 +384,13 @@ class FriendRequestProtocolTests : XCTestCase { func test_getFriendRequestUIStateShouldPreferReceivedOverSent() { // Case: We sent Bob a friend request and he sent one back to us through another device. // If something went wrong then we should be able to fall back to manually accepting the friend request even if we sent one. - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } - let masterThread = createContactThread(for: master) + let masterThread = LokiTestUtilities.createContactThread(for: master) let deviceLink = DeviceLink(between: masterDevice, and: slaveDevice) storage.dbReadWriteConnection.readWrite { transaction in @@ -446,7 +405,7 @@ class FriendRequestProtocolTests : XCTestCase { // MARK: - acceptFriendRequest func test_acceptFriendRequestShouldSetStatusToFriendsIfWeReceivedAFriendRequest() { // Case: Bob sent us a friend request, we should become friends with him on accepting. - let bob = generateHexEncodedPublicKey() + let bob = LokiTestUtilities.generateHexEncodedPublicKey() storage.dbReadWriteConnection.readWrite { transaction in self.storage.setFriendRequestStatus(.requestReceived, for: bob, transaction: transaction) } @@ -464,7 +423,7 @@ class FriendRequestProtocolTests : XCTestCase { // Since user accepted then we should send a friend request message. let statuses: [LKFriendRequestStatus] = [ .none, .requestExpired ] for status in statuses { - let bob = generateHexEncodedPublicKey() + let bob = LokiTestUtilities.generateHexEncodedPublicKey() storage.dbReadWriteConnection.readWrite { transaction in self.storage.setFriendRequestStatus(status, for: bob, transaction: transaction) } @@ -491,7 +450,7 @@ class FriendRequestProtocolTests : XCTestCase { func test_acceptFriendRequestShouldNotDoAnythingIfRequestHasBeenSent() { // Case: We sent Bob a friend request. // We can't accept because we don't have keys to communicate with Bob. - let bob = generateHexEncodedPublicKey() + let bob = LokiTestUtilities.generateHexEncodedPublicKey() storage.dbReadWriteConnection.readWrite { transaction in self.storage.setFriendRequestStatus(.requestSent, for: bob, transaction: transaction) } @@ -506,13 +465,13 @@ class FriendRequestProtocolTests : XCTestCase { // Case: Bob sent a friend request from his slave device. // Accepting the friend request should set it to friends. // We should also send out a friend request to Bob's other devices if possible. - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() - let otherSlave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() + let otherSlave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } - guard let otherSlaveDevice = getDevice(for: otherSlave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } + guard let otherSlaveDevice = LokiTestUtilities.getDevice(for: otherSlave) else { return XCTFail() } storage.dbReadWriteConnection.readWrite { transaction in self.storage.addDeviceLink(DeviceLink(between: masterDevice, and: slaveDevice), in: transaction) @@ -537,8 +496,8 @@ class FriendRequestProtocolTests : XCTestCase { } func test_acceptFriendRequestShouldNotChangeStatusIfDevicesAreNotLinked() { - let alice = generateHexEncodedPublicKey() - let bob = generateHexEncodedPublicKey() + let alice = LokiTestUtilities.generateHexEncodedPublicKey() + let bob = LokiTestUtilities.generateHexEncodedPublicKey() storage.dbReadWriteConnection.readWrite { transaction in self.storage.setFriendRequestStatus(.requestReceived, for: alice, transaction: transaction) @@ -554,7 +513,7 @@ class FriendRequestProtocolTests : XCTestCase { // MARK: - declineFriendRequest func test_declineFriendRequestShouldChangeStatusFromReceivedToNone() { - let bob = generateHexEncodedPublicKey() + let bob = LokiTestUtilities.generateHexEncodedPublicKey() storage.dbReadWriteConnection.readWrite { transaction in self.storage.setFriendRequestStatus(.requestReceived, for: bob, transaction: transaction) @@ -568,7 +527,7 @@ class FriendRequestProtocolTests : XCTestCase { func test_declineFriendRequestShouldNotChangeStatusToNoneFromOtherStatuses() { let statuses: [LKFriendRequestStatus] = [ .none, .requestSending, .requestSent, .requestExpired, .friends ] - let bob = generateHexEncodedPublicKey() + let bob = LokiTestUtilities.generateHexEncodedPublicKey() for status in statuses { storage.dbReadWriteConnection.readWrite { transaction in @@ -589,7 +548,7 @@ class FriendRequestProtocolTests : XCTestCase { let statuses: [LKFriendRequestStatus] = [ .none, .requestSending, .requestSent, .requestReceived, .requestExpired, .friends ] for status in statuses { - let bob = generateHexEncodedPublicKey() + let bob = LokiTestUtilities.generateHexEncodedPublicKey() let bundle = storage.generatePreKeyBundle(forContact: bob) storage.dbReadWriteConnection.readWrite { transaction in self.storage.setPreKeyBundle(bundle, forContact: bob, transaction: transaction) @@ -612,13 +571,13 @@ class FriendRequestProtocolTests : XCTestCase { func test_declineFriendRequestShouldWorkWithMultipleLinkedDevices() { // Case: Bob sends 2 friend requests to Alice. // When Alice declines, it should change the statuses from requestReceived to none so friend request logic can be re-triggered. - let master = generateHexEncodedPublicKey() - let slave = generateHexEncodedPublicKey() - let otherSlave = generateHexEncodedPublicKey() + let master = LokiTestUtilities.generateHexEncodedPublicKey() + let slave = LokiTestUtilities.generateHexEncodedPublicKey() + let otherSlave = LokiTestUtilities.generateHexEncodedPublicKey() - guard let masterDevice = getDevice(for: master) else { return XCTFail() } - guard let slaveDevice = getDevice(for: slave) else { return XCTFail() } - guard let otherSlaveDevice = getDevice(for: otherSlave) else { return XCTFail() } + guard let masterDevice = LokiTestUtilities.getDevice(for: master) else { return XCTFail() } + guard let slaveDevice = LokiTestUtilities.getDevice(for: slave) else { return XCTFail() } + guard let otherSlaveDevice = LokiTestUtilities.getDevice(for: otherSlave) else { return XCTFail() } storage.dbReadWriteConnection.readWrite { transaction in self.storage.addDeviceLink(DeviceLink(between: masterDevice, and: slaveDevice), in: transaction) diff --git a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocolTests.swift b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocolTests.swift index 5aab343a1..1f4cb274b 100644 --- a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocolTests.swift +++ b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocolTests.swift @@ -4,6 +4,5 @@ import XCTest class MultiDeviceProtocolTests : XCTestCase { - // TODO: Add tests } diff --git a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocolTests.swift b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocolTests.swift index 506c96f6b..075ab8577 100644 --- a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocolTests.swift +++ b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocolTests.swift @@ -9,18 +9,7 @@ class SyncMessagesProtocolTests : XCTestCase { override func setUp() { super.setUp() - // Activate the mock environment - ClearCurrentAppContextForTests() - SetCurrentAppContext(TestAppContext()) - MockSSKEnvironment.activate() - // Register a mock user - let identityManager = OWSIdentityManager.shared() - let seed = Randomness.generateRandomBytes(16)! - let keyPair = Curve25519.generateKeyPair(fromSeed: seed + seed) - let databaseConnection = identityManager.value(forKey: "dbConnection") as! YapDatabaseConnection - databaseConnection.setObject(keyPair, forKey: OWSPrimaryStorageIdentityKeyStoreIdentityKey, inCollection: OWSPrimaryStorageIdentityKeyStoreCollection) - TSAccountManager.sharedInstance().phoneNumberAwaitingVerification = keyPair.hexEncodedPublicKey - TSAccountManager.sharedInstance().didRegister() + LokiTestUtilities.setupMockEnvironment() } func testContactSyncMessageHandling() { diff --git a/SignalServiceKit/src/Loki/Utilities/Test/LokiTestUtilities.swift b/SignalServiceKit/src/Loki/Utilities/Test/LokiTestUtilities.swift new file mode 100644 index 000000000..cb3e0d499 --- /dev/null +++ b/SignalServiceKit/src/Loki/Utilities/Test/LokiTestUtilities.swift @@ -0,0 +1,55 @@ +import Foundation +import SignalServiceKit +import Curve25519Kit + +@objc(LKTestUtilities) +class LokiTestUtilities : NSObject { + + @objc public static func setupMockEnvironment() { + ClearCurrentAppContextForTests() + SetCurrentAppContext(TestAppContext()) + MockSSKEnvironment.activate() + + let identityManager = OWSIdentityManager.shared() + let seed = Randomness.generateRandomBytes(16)! + let keyPair = Curve25519.generateKeyPair(fromSeed: seed + seed) + let databaseConnection = identityManager.value(forKey: "dbConnection") as! YapDatabaseConnection + databaseConnection.setObject(keyPair, forKey: OWSPrimaryStorageIdentityKeyStoreIdentityKey, inCollection: OWSPrimaryStorageIdentityKeyStoreCollection) + TSAccountManager.sharedInstance().phoneNumberAwaitingVerification = keyPair.hexEncodedPublicKey + TSAccountManager.sharedInstance().didRegister() + } + + @objc public static func generateKeyPair() -> ECKeyPair { + return Curve25519.generateKeyPair() + } + + @objc public static func generateHexEncodedPublicKey() -> String { + return generateKeyPair().hexEncodedPublicKey + } + + @objc(getDeviceForHexEncodedPublicKey:) + public static func getDevice(for hexEncodedPublicKey: String) -> DeviceLink.Device? { + guard let signature = Data.getSecureRandomData(ofSize: 64) else { return nil } + return DeviceLink.Device(hexEncodedPublicKey: hexEncodedPublicKey, signature: signature) + } + + @objc(createContactThreadForHexEncodedPublicKey:) + public static func createContactThread(for hexEncodedPublicKey: String) -> TSContactThread { + return TSContactThread.getOrCreateThread(contactId: hexEncodedPublicKey) + } + + @objc(createGroupThreadWithGroupType:) + public static func createGroupThread(groupType: GroupType) -> TSGroupThread? { + let hexEncodedGroupID = Randomness.generateRandomBytes(kGroupIdLength)!.toHexString() + + let groupID: Data + switch groupType { + case .closedGroup: groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(hexEncodedGroupID) + case .openGroup: groupID = LKGroupUtilities.getEncodedOpenGroupIDAsData(hexEncodedGroupID) + case .rssFeed: groupID = LKGroupUtilities.getEncodedRSSFeedIDAsData(hexEncodedGroupID) + default: return nil + } + + return TSGroupThread.getOrCreateThread(withGroupId: groupID, groupType: groupType) + } +}