From 45a71181d131ef3a3f6a418075dbd980159c3d39 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Mon, 4 May 2020 09:42:02 +1000 Subject: [PATCH] Fix up migration. Added migration test. Fix some tests. --- Signal.xcodeproj/project.pbxproj | 16 +++++++ ...K001UpdateFriendRequestStatusStorage.swift | 42 +++++++++++++++++++ ...UpdateFriendRequestStatusStorageTest.swift | 28 +++++++++++++ .../environment/VersionMigrations.m | 20 --------- .../migrations/OWSDatabaseMigrationRunner.m | 1 + .../FriendRequestProtocolTests.swift | 16 +++---- .../src/Messages/OWSMessageSender.m | 6 +-- 7 files changed, 98 insertions(+), 31 deletions(-) create mode 100644 SignalMessaging/Loki/Migrations/LK001UpdateFriendRequestStatusStorage.swift create mode 100644 SignalMessaging/Loki/Migrations/LK001UpdateFriendRequestStatusStorageTest.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 00055f3ad..08c0f2253 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 2400888E239F30A600305217 /* SessionRestorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2400888D239F30A600305217 /* SessionRestorationView.swift */; }; + 241C1192245F8878005CB2F4 /* LK001UpdateFriendRequestStatusStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 241C1191245F8878005CB2F4 /* LK001UpdateFriendRequestStatusStorage.swift */; }; + 241C1194245F8CE2005CB2F4 /* LK001UpdateFriendRequestStatusStorageTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 241C1193245F8C95005CB2F4 /* LK001UpdateFriendRequestStatusStorageTest.swift */; }; 241C6314231F64C000B4198E /* JazzIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 241C630E231F5AAC00B4198E /* JazzIcon.swift */; }; 241C6315231F64CE00B4198E /* CGFloat+Rounding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 241C6312231F5F1D00B4198E /* CGFloat+Rounding.swift */; }; 241C6316231F64CE00B4198E /* UIColor+Helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 241C6310231F5C4400B4198E /* UIColor+Helper.swift */; }; @@ -740,6 +742,8 @@ 1C93CF3971B64E8B6C1F9AC1 /* Pods-SignalShareExtension.test.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SignalShareExtension.test.xcconfig"; path = "Pods/Target Support Files/Pods-SignalShareExtension/Pods-SignalShareExtension.test.xcconfig"; sourceTree = ""; }; 1CE3CD5C23334683BDD3D78C /* Pods-Signal.test.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Signal.test.xcconfig"; path = "Pods/Target Support Files/Pods-Signal/Pods-Signal.test.xcconfig"; sourceTree = ""; }; 2400888D239F30A600305217 /* SessionRestorationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionRestorationView.swift; sourceTree = ""; }; + 241C1191245F8878005CB2F4 /* LK001UpdateFriendRequestStatusStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LK001UpdateFriendRequestStatusStorage.swift; sourceTree = ""; }; + 241C1193245F8C95005CB2F4 /* LK001UpdateFriendRequestStatusStorageTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LK001UpdateFriendRequestStatusStorageTest.swift; sourceTree = ""; }; 241C630E231F5AAC00B4198E /* JazzIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JazzIcon.swift; sourceTree = ""; }; 241C6310231F5C4400B4198E /* UIColor+Helper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Helper.swift"; sourceTree = ""; }; 241C6312231F5F1D00B4198E /* CGFloat+Rounding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGFloat+Rounding.swift"; sourceTree = ""; }; @@ -1621,6 +1625,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 241C1190245F8765005CB2F4 /* Migrations */ = { + isa = PBXGroup; + children = ( + 241C1191245F8878005CB2F4 /* LK001UpdateFriendRequestStatusStorage.swift */, + 241C1193245F8C95005CB2F4 /* LK001UpdateFriendRequestStatusStorageTest.swift */, + ); + path = Migrations; + sourceTree = ""; + }; 34074F54203D0722004596AE /* Sounds */ = { isa = PBXGroup; children = ( @@ -2776,6 +2789,7 @@ B846365922B7417900AF1514 /* Loki */ = { isa = PBXGroup; children = ( + 241C1190245F8765005CB2F4 /* Migrations */, B8C9689223FA1B05005F64E0 /* Redesign */, B8544E3623D520F600299F14 /* Jazz Icon */, ); @@ -3970,6 +3984,7 @@ 349EA07C2162AEA800F7B17F /* OWS111UDAttributesMigration.swift in Sources */, 34480B561FD0A7A400BC14EF /* DebugLogger.m in Sources */, 459B775C207BA46C0071D0AB /* OWSQuotedReplyModel.m in Sources */, + 241C1192245F8878005CB2F4 /* LK001UpdateFriendRequestStatusStorage.swift in Sources */, 340872D622397E6800CB25B0 /* AttachmentCaptionToolbar.swift in Sources */, 34ABB2C42090C59700C727A6 /* OWSResaveCollectionDBMigration.m in Sources */, 4C948FF72146EB4800349F0D /* BlockListCache.swift in Sources */, @@ -4263,6 +4278,7 @@ files = ( 456F6E2F1E261D1000FD2210 /* PeerConnectionClientTest.swift in Sources */, 3491D9A121022DB7001EF5A1 /* CDSSigningCertificateTest.m in Sources */, + 241C1194245F8CE2005CB2F4 /* LK001UpdateFriendRequestStatusStorageTest.swift in Sources */, 34BBC861220E883300857249 /* ImageEditorModelTest.swift in Sources */, 340B02BA1FA0D6C700F9CFEC /* ConversationViewItemTest.m in Sources */, 458E383A1D6699FA0094BD24 /* OWSDeviceProvisioningURLParserTest.m in Sources */, diff --git a/SignalMessaging/Loki/Migrations/LK001UpdateFriendRequestStatusStorage.swift b/SignalMessaging/Loki/Migrations/LK001UpdateFriendRequestStatusStorage.swift new file mode 100644 index 000000000..9ef49314a --- /dev/null +++ b/SignalMessaging/Loki/Migrations/LK001UpdateFriendRequestStatusStorage.swift @@ -0,0 +1,42 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation +import SignalServiceKit + +@objc +public class LK001UpdateFriendRequestStatusStorage: OWSDatabaseMigration { + + // MARK: - + + // Increment a similar constant for each migration. + // 100-114 are reserved for signal migrations + @objc + class func migrationId() -> String { + return "001" + } + + override public func runUp(completion: @escaping OWSDatabaseMigrationCompletion) { + self.doMigrationAsync(completion: completion) + } + + private func doMigrationAsync(completion: @escaping OWSDatabaseMigrationCompletion) { + DispatchQueue.global().async { + self.dbReadWriteConnection().readWrite { transaction in + guard let threads = TSThread.allObjectsInCollection() as? [TSThread] else { + owsFailDebug("Failed to convert objects to TSThread") + return + } + for thread in threads { + guard let thread = thread as? TSContactThread, + let friendRequestStatus = LKFriendRequestStatus(rawValue: thread.friendRequestStatus) else { + continue; + } + OWSPrimaryStorage.shared().setFriendRequestStatus(friendRequestStatus, for: thread.contactIdentifier(), transaction: transaction) + } + } + } + } + +} diff --git a/SignalMessaging/Loki/Migrations/LK001UpdateFriendRequestStatusStorageTest.swift b/SignalMessaging/Loki/Migrations/LK001UpdateFriendRequestStatusStorageTest.swift new file mode 100644 index 000000000..10a3a01f4 --- /dev/null +++ b/SignalMessaging/Loki/Migrations/LK001UpdateFriendRequestStatusStorageTest.swift @@ -0,0 +1,28 @@ +@testable import SignalServiceKit +import XCTest +import Curve25519Kit + +class LK001UpdateFriendRequestStatusStorageTest : XCTestCase { + + private var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() } + + 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() + } + + func test_shouldMigrateFriendRequestStatusCorrectly() { + } + +} diff --git a/SignalMessaging/environment/VersionMigrations.m b/SignalMessaging/environment/VersionMigrations.m index 10c245e46..13d8b07b9 100644 --- a/SignalMessaging/environment/VersionMigrations.m +++ b/SignalMessaging/environment/VersionMigrations.m @@ -101,10 +101,6 @@ NS_ASSUME_NONNULL_BEGIN [self updatePublicChatMapping]; } - if ([self isVersion:previousVersion lessThan:@"1.1.2"] && [self.tsAccountManager isRegistered]) { - [self updateFriendRequestStatusStorage]; - } - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[[OWSDatabaseMigrationRunner alloc] init] runAllOutstandingWithCompletion:completion]; }); @@ -210,22 +206,6 @@ NS_ASSUME_NONNULL_BEGIN }]; } -# pragma mark Loki - Upgrading Friend Request Status - -// Versions less than or equal to 1.1.1 stored the friend request status on the thread -+ (void)updateFriendRequestStatusStorage -{ - OWSPrimaryStorage *storage = OWSPrimaryStorage.sharedManager; - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - NSArray *threads = [TSThread allObjectsInCollection]; - for (TSThread *thread in threads) { - if (thread.isGroupThread) { return; } - NSString *hexEncodedPublicKey = thread.contactIdentifier; - [storage setFriendRequestStatus:thread.friendRequestStatus forContact:hexEncodedPublicKey transaction:transaction]; - } - }]; -} - @end NS_ASSUME_NONNULL_END diff --git a/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m b/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m index 9837b79bf..dd63f6811 100644 --- a/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m +++ b/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m @@ -48,6 +48,7 @@ NS_ASSUME_NONNULL_BEGIN [[OWS112TypingIndicatorsMigration alloc] init], [[OWS113MultiAttachmentMediaMessages alloc] init], [[OWS114RemoveDynamicInteractions alloc] init], + [[LK001UpdateFriendRequestStatusStorage alloc] init] ]; } diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift index a8cdaa8aa..5f353062b 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift @@ -322,7 +322,7 @@ class FriendRequestProtocolTests : XCTestCase { let allGroupTypes: [GroupType] = [.closedGroup, .openGroup, .rssFeed] for groupType in allGroupTypes { guard let groupThread = createGroupThread(groupType: groupType) else { return XCTFail() } - XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIState(for: groupThread) == .none) + XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIStatus(for: groupThread) == .none) } } @@ -343,8 +343,8 @@ class FriendRequestProtocolTests : XCTestCase { let masterThread = createContactThread(for: master) let slaveThread = createContactThread(for: slave) - XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIState(for: masterThread) == .none) - XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIState(for: slaveThread) == .none ) + XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIStatus(for: masterThread) == .none) + XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIStatus(for: slaveThread) == .none ) } func test_getFriendRequestUIStateShouldReturnTheCorrectStates() { @@ -364,7 +364,7 @@ class FriendRequestProtocolTests : XCTestCase { storage.dbReadWriteConnection.readWrite { transaction in self.storage.setFriendRequestStatus(friendRequestStatus, for: bob, transaction: transaction) } - XCTAssertEqual(FriendRequestProtocol.getFriendRequestUIState(for: bobThread), uiState, "Expected FriendRequestUIState to be \(uiState)") + XCTAssertEqual(FriendRequestProtocol.getFriendRequestUIStatus(for: bobThread), uiState, "Expected FriendRequestUIState to be \(uiState)") } } @@ -398,8 +398,8 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(friendRequestStatus, for: slave, transaction: transaction) } - XCTAssertEqual(FriendRequestProtocol.getFriendRequestUIState(for: masterThread), uiState, "Expected FriendRequestUIState to be \(uiState.rawValue)") - XCTAssertEqual(FriendRequestProtocol.getFriendRequestUIState(for: slaveThread), uiState, "Expected FriendRequestUIState to be \(uiState.rawValue)") + XCTAssertEqual(FriendRequestProtocol.getFriendRequestUIStatus(for: masterThread), uiState, "Expected FriendRequestUIState to be \(uiState.rawValue)") + XCTAssertEqual(FriendRequestProtocol.getFriendRequestUIStatus(for: slaveThread), uiState, "Expected FriendRequestUIState to be \(uiState.rawValue)") } } @@ -420,7 +420,7 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.friends, for: slave, transaction: transaction) } - XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIState(for: masterThread) == .friends) + XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIStatus(for: masterThread) == .friends) } func test_getFriendRequestUIStateShouldPreferReceivedOverSent() { @@ -441,7 +441,7 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(.requestReceived, for: slave, transaction: transaction) } - XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIState(for: masterThread) == .received) + XCTAssertTrue(FriendRequestProtocol.getFriendRequestUIStatus(for: masterThread) == .received) } // MARK: - acceptFriendRequest diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 22bd63821..81a7f8dde 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1187,7 +1187,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } if (signalMessage.isFriendRequest) { - [LKFriendRequestProtocol failedToSendFriendRequestToHexEncodedPublicKey:recipientID transaction:transaction]; + [LKFriendRequestProtocol setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:recipientID transaction:transaction]; } }]; @@ -1201,7 +1201,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } if (signalMessage.isFriendRequest) { - [LKFriendRequestProtocol sentFriendRequestToHexEncodedPublicKey:recipientID transaction:transaction]; + [LKFriendRequestProtocol setFriendRequestStatusToFailedIfNeededForHexEncodedPublicKey:recipientID transaction:transaction]; } }]; // Handle the error @@ -1233,7 +1233,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; NSDate *expirationDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval]; [message saveFriendRequestExpiresAt:[NSDate ows_millisecondsSince1970ForDate:expirationDate] withTransaction:transaction]; } - [LKFriendRequestProtocol sentFriendRequestToHexEncodedPublicKey:recipientID transaction:transaction]; + [LKFriendRequestProtocol setFriendRequestStatusToSentIfNeededForHexEncodedPublicKey:recipientID transaction:transaction]; }]; } // Invoke the completion handler