From 7fd15d2fd9952fe322775d2f90f4782d1cd57279 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 1 Oct 2018 10:33:01 -0400 Subject: [PATCH] Add server certificate methods to UD manager. --- SignalMessaging/environment/AppSetup.m | 4 +- .../src/Messages/OWSSignalAddress.swift | 33 ++++ .../src/Messages/OWSUDManager.swift | 150 ++++++++++++++++++ .../Network/API/Requests/OWSRequestFactory.h | 20 ++- .../Network/API/Requests/OWSRequestFactory.m | 8 + SignalServiceKit/src/SSKEnvironment.h | 5 +- SignalServiceKit/src/SSKEnvironment.m | 4 + .../src/Tests/MockSSKEnvironment.m | 5 +- .../src/Tests/OWSFakeProfileManager.m | 4 +- .../src/Tests/OWSFakeUDManager.swift | 32 ++++ SignalServiceKit/src/Util/UDManager.swift | 5 - .../tests/Account/SignedPreKeyDeletionTests.m | 4 +- .../tests/Account/TSAttributesTest.m | 4 +- .../tests/Contacts/ContactSortingTest.m | 7 +- ...OWSDisappearingMessagesConfigurationTest.m | 4 +- .../tests/Contacts/PhoneNumberTest.m | 4 +- .../tests/Contacts/PhoneNumberUtilTest.m | 4 +- .../tests/Contacts/SignalRecipientTest.m | 4 +- .../tests/Contacts/TSContactThreadTest.m | 4 +- .../tests/Contacts/TSGroupThreadTest.m | 4 +- .../tests/Contacts/TSThreadTest.m | 4 +- .../tests/Devices/OWSDeviceProvisionerTest.m | 4 +- .../tests/Devices/OWSProvisioningCipherTest.m | 4 +- .../Messages/Interactions/TSMessageTest.m | 6 +- .../Interactions/TSOutgoingMessageTest.m | 4 +- .../OWSDisappearingMessageFinderTest.m | 4 +- .../Messages/OWSDisappearingMessagesJobTest.m | 6 +- .../Messages/OWSIncomingMessageFinderTest.m | 4 +- .../tests/Messages/OWSMessageManagerTest.m | 4 +- .../tests/Messages/OWSMessageSenderTest.m | 4 +- .../tests/Messages/OWSSignalAddressTest.swift | 40 +++++ .../tests/Messages/OWSUDManagerTest.swift | 23 +++ .../{SSKBaseTest.h => SSKBaseTestObjC.h} | 2 +- .../{SSKBaseTest.m => SSKBaseTestObjC.m} | 4 +- SignalServiceKit/tests/SSKBaseTestSwift.swift | 40 +++++ .../tests/Security/OWSFingerprintTest.m | 4 +- .../Storage/TSStorageIdentityKeyStoreTests.m | 4 +- .../tests/Storage/TSStoragePreKeyStoreTests.m | 4 +- .../tests/Util/OWSAnalyticsTests.m | 4 +- .../tests/Util/TSMessageStorageTests.m | 4 +- 40 files changed, 413 insertions(+), 69 deletions(-) create mode 100644 SignalServiceKit/src/Messages/OWSSignalAddress.swift create mode 100644 SignalServiceKit/src/Messages/OWSUDManager.swift create mode 100644 SignalServiceKit/src/Tests/OWSFakeUDManager.swift delete mode 100644 SignalServiceKit/src/Util/UDManager.swift create mode 100644 SignalServiceKit/tests/Messages/OWSSignalAddressTest.swift create mode 100644 SignalServiceKit/tests/Messages/OWSUDManagerTest.swift rename SignalServiceKit/tests/{SSKBaseTest.h => SSKBaseTestObjC.h} (91%) rename SignalServiceKit/tests/{SSKBaseTest.m => SSKBaseTestObjC.m} (93%) create mode 100644 SignalServiceKit/tests/SSKBaseTestSwift.swift diff --git a/SignalMessaging/environment/AppSetup.m b/SignalMessaging/environment/AppSetup.m index 0a7f24601..1c4de01ea 100644 --- a/SignalMessaging/environment/AppSetup.m +++ b/SignalMessaging/environment/AppSetup.m @@ -54,6 +54,7 @@ NS_ASSUME_NONNULL_BEGIN OWSMessageManager *messageManager = [[OWSMessageManager alloc] initWithPrimaryStorage:primaryStorage]; OWSBlockingManager *blockingManager = [[OWSBlockingManager alloc] initWithPrimaryStorage:primaryStorage]; OWSIdentityManager *identityManager = [[OWSIdentityManager alloc] initWithPrimaryStorage:primaryStorage]; + id udManager = [[OWSUDManagerImpl alloc] initWithPrimaryStorage:primaryStorage]; [Environment setShared:[[Environment alloc] initWithPreferences:preferences]]; @@ -65,7 +66,8 @@ NS_ASSUME_NONNULL_BEGIN networkManager:networkManager messageManager:messageManager blockingManager:blockingManager - identityManager:identityManager]]; + identityManager:identityManager + udManager:udManager]]; appSpecificSingletonBlock(); diff --git a/SignalServiceKit/src/Messages/OWSSignalAddress.swift b/SignalServiceKit/src/Messages/OWSSignalAddress.swift new file mode 100644 index 000000000..ce04d6013 --- /dev/null +++ b/SignalServiceKit/src/Messages/OWSSignalAddress.swift @@ -0,0 +1,33 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation + +public enum OWSSignalAddressError: Error { + case assertionError(description: String) +} + +@objc +public class OWSSignalAddress: NSObject { + @objc + public let recipientId: String + + @objc + public let deviceId: UInt + + // MARK: Initializers + + @objc public init(recipientId: String, deviceId: UInt) throws { + guard recipientId.count > 0 else { + throw OWSSignalAddressError.assertionError(description: "Invalid recipient id: \(deviceId)") + } + + guard deviceId > 0 else { + throw OWSSignalAddressError.assertionError(description: "Invalid device id: \(deviceId)") + } + + self.recipientId = recipientId + self.deviceId = deviceId + } +} diff --git a/SignalServiceKit/src/Messages/OWSUDManager.swift b/SignalServiceKit/src/Messages/OWSUDManager.swift new file mode 100644 index 000000000..6c25c4771 --- /dev/null +++ b/SignalServiceKit/src/Messages/OWSUDManager.swift @@ -0,0 +1,150 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation +import PromiseKit + +public enum OWSUDError: Error { + case assertionError(description: String) +} + +@objc public protocol OWSUDManager: class { + + @objc func isUDRecipientId(_ recipientId: String) -> Bool + + // No-op if this recipient id is already marked as a "UD recipient". + @objc func addUDRecipientId(_ recipientId: String) + + // No-op if this recipient id is already marked as _NOT_ a "UD recipient". + @objc func removeUDRecipientId(_ recipientId: String) +} + +// MARK: - + +@objc +public class OWSUDManagerImpl: NSObject, OWSUDManager { + + private let dbConnection: YapDatabaseConnection + + private let kUDRecipientModeCollection = "kUDRecipientModeCollection" + private let kUDCollection = "kUDCollection" + private let kUDCurrentServerCertificateKey = "kUDCurrentServerCertificateKey" + + @objc + public required init(primaryStorage: OWSPrimaryStorage) { + self.dbConnection = primaryStorage.newDatabaseConnection() + + super.init() + + SwiftSingletons.register(self) + } + + // MARK: - Singletons + + private var networkManager: TSNetworkManager { + return SSKEnvironment.shared.networkManager + } + + // MARK: - Recipient state + + @objc + public func isUDRecipientId(_ recipientId: String) -> Bool { + return dbConnection.bool(forKey: recipientId, inCollection: kUDRecipientModeCollection, defaultValue: false) + } + + @objc + public func addUDRecipientId(_ recipientId: String) { + dbConnection.setBool(true, forKey: recipientId, inCollection: kUDRecipientModeCollection) + } + + @objc + public func removeUDRecipientId(_ recipientId: String) { + dbConnection.removeObject(forKey: recipientId, inCollection: kUDRecipientModeCollection) + } + + // MARK: - Server Certificate + + #if DEBUG + @objc + public func hasServerCertificate() -> Bool { + return serverCertificate() != nil + } + #endif + + private func serverCertificate() -> Data? { + guard let certificateData = dbConnection.object(forKey: kUDCurrentServerCertificateKey, inCollection: kUDCollection) as? Data else { + return nil + } + // TODO: Parse certificate and ensure that it is still valid. + return certificateData + } + + private func setServerCertificate(_ certificateData: Data) { + dbConnection.setObject(certificateData, forKey: kUDCurrentServerCertificateKey, inCollection: kUDCollection) + } + + @objc + public func ensureServerCertificateObjC(success:@escaping (Data) -> Void, + failure:@escaping (Error) -> Void) { + ensureServerCertificate() + .then(execute: { certificateData in + success(certificateData) + }) + .catch(execute: { (error) in + failure(error) + }).retainUntilComplete() + } + + public func ensureServerCertificate() -> Promise { + return Promise { fulfill, reject in + // If there is an existing server certificate, use that. + if let certificateData = serverCertificate() { + fulfill(certificateData) + return + } + // Try to obtain a new server certificate. + requestServerCertificate() + .then(execute: { certificateData in + fulfill(certificateData) + }) + .catch(execute: { (error) in + reject(error) + }) + } + } + + private func requestServerCertificate() -> Promise { + return Promise { fulfill, reject in + let request = OWSRequestFactory.udServerCertificateRequest() + self.networkManager.makeRequest( + request, + success: { (_: URLSessionDataTask?, responseObject: Any?) -> Void in + do { + let certificateData = try self.parseServerCertificateResponse(responseObject: responseObject) + + fulfill(certificateData) + } catch { + + reject(error) + } + }, + failure: { (_: URLSessionDataTask?, error: Error?) in + guard let error = error else { + Logger.error("Missing error.") + return + } + + reject(error) + }) + } + } + + private func parseServerCertificateResponse(responseObject: Any?) throws -> Data { + guard let parser = ParamParser(responseObject: responseObject) else { + throw OWSUDError.assertionError(description: "Invalid server certificate response") + } + + return try parser.requiredBase64EncodedData(key: "certificate") + } +} diff --git a/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.h b/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.h index b1dd679a5..da73e02a9 100644 --- a/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.h +++ b/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.h @@ -40,16 +40,10 @@ typedef NS_ENUM(NSUInteger, TSVerificationTransport) { TSVerificationTransportVo + (TSRequest *)attachmentRequestWithAttachmentId:(UInt64)attachmentId; -+ (TSRequest *)availablePreKeysCountRequest; - + (TSRequest *)contactsIntersectionRequestWithHashesArray:(NSArray *)hashes; -+ (TSRequest *)currentSignedPreKeyRequest; - + (TSRequest *)profileAvatarUploadFormRequest; -+ (TSRequest *)recipientPrekeyRequestWithRecipient:(NSString *)recipientNumber deviceId:(NSString *)deviceId; - + (TSRequest *)registerForPushRequestWithPushIdentifier:(NSString *)identifier voipIdentifier:(NSString *)voipId; + (TSRequest *)updateAttributesRequestWithManualMessageFetching:(BOOL)enableManualMessageFetching; @@ -63,12 +57,22 @@ typedef NS_ENUM(NSUInteger, TSVerificationTransport) { TSVerificationTransportVo messages:(NSArray *)messages timeStamp:(uint64_t)timeStamp; +#pragma mark - Prekeys + ++ (TSRequest *)availablePreKeysCountRequest; + ++ (TSRequest *)currentSignedPreKeyRequest; + ++ (TSRequest *)recipientPrekeyRequestWithRecipient:(NSString *)recipientNumber deviceId:(NSString *)deviceId; + + (TSRequest *)registerSignedPrekeyRequestWithSignedPreKeyRecord:(SignedPreKeyRecord *)signedPreKey; + (TSRequest *)registerPrekeysRequestWithPrekeyArray:(NSArray *)prekeys identityKey:(NSData *)identityKeyPublic signedPreKey:(SignedPreKeyRecord *)signedPreKey; +#pragma mark - CDS + + (TSRequest *)remoteAttestationRequest:(ECKeyPair *)keyPair enclaveId:(NSString *)enclaveId authUsername:(NSString *)authUsername @@ -87,6 +91,10 @@ typedef NS_ENUM(NSUInteger, TSVerificationTransport) { TSVerificationTransportVo + (TSRequest *)remoteAttestationAuthRequest; + (TSRequest *)cdsFeedbackRequestWithResult:(NSString *)result NS_SWIFT_NAME(cdsFeedbackRequest(result:)); +#pragma mark - UD + ++ (TSRequest *)udServerCertificateRequest; + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.m b/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.m index cea381d5f..32dc8f7ff 100644 --- a/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.m +++ b/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.m @@ -346,6 +346,14 @@ NS_ASSUME_NONNULL_BEGIN return [TSRequest requestWithUrl:[NSURL URLWithString:path] method:@"PUT" parameters:@{}]; } +#pragma mark - UD + ++ (TSRequest *)udServerCertificateRequest +{ + NSString *path = @"/v1/certificate/delivery"; + return [TSRequest requestWithUrl:[NSURL URLWithString:path] method:@"GET" parameters:@{}]; +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/SSKEnvironment.h b/SignalServiceKit/src/SSKEnvironment.h index 254ac307a..3425ba2fb 100644 --- a/SignalServiceKit/src/SSKEnvironment.h +++ b/SignalServiceKit/src/SSKEnvironment.h @@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol NotificationsProtocol; @protocol OWSCallMessageHandler; @protocol ProfileManagerProtocol; +@protocol OWSUDManager; @interface SSKEnvironment : NSObject @@ -28,7 +29,8 @@ NS_ASSUME_NONNULL_BEGIN networkManager:(TSNetworkManager *)networkManager messageManager:(OWSMessageManager *)messageManager blockingManager:(OWSBlockingManager *)blockingManager - identityManager:(OWSIdentityManager *)identityManager NS_DESIGNATED_INITIALIZER; + identityManager:(OWSIdentityManager *)identityManager + udManager:(id)udManager NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE; @@ -50,6 +52,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) OWSMessageManager *messageManager; @property (nonatomic, readonly) OWSBlockingManager *blockingManager; @property (nonatomic, readonly) OWSIdentityManager *identityManager; +@property (nonatomic, readonly) id udManager; // This property is configured after Environment is created. @property (atomic, nullable) id callMessageHandler; diff --git a/SignalServiceKit/src/SSKEnvironment.m b/SignalServiceKit/src/SSKEnvironment.m index 8ccfd211e..516565492 100644 --- a/SignalServiceKit/src/SSKEnvironment.m +++ b/SignalServiceKit/src/SSKEnvironment.m @@ -21,6 +21,7 @@ static SSKEnvironment *sharedSSKEnvironment; @property (nonatomic) OWSMessageManager *messageManager; @property (nonatomic) OWSBlockingManager *blockingManager; @property (nonatomic) OWSIdentityManager *identityManager; +@property (nonatomic) id udManager; @end @@ -41,6 +42,7 @@ static SSKEnvironment *sharedSSKEnvironment; messageManager:(OWSMessageManager *)messageManager blockingManager:(OWSBlockingManager *)blockingManager identityManager:(OWSIdentityManager *)identityManager + udManager:(id)udManager { self = [super init]; if (!self) { @@ -56,6 +58,7 @@ static SSKEnvironment *sharedSSKEnvironment; OWSAssertDebug(messageManager); OWSAssertDebug(blockingManager); OWSAssertDebug(identityManager); + OWSAssertDebug(udManager); _contactsManager = contactsManager; _messageSender = messageSender; @@ -66,6 +69,7 @@ static SSKEnvironment *sharedSSKEnvironment; _messageManager = messageManager; _blockingManager = blockingManager; _identityManager = identityManager; + _udManager = udManager; return self; } diff --git a/SignalServiceKit/src/Tests/MockSSKEnvironment.m b/SignalServiceKit/src/Tests/MockSSKEnvironment.m index 4f25ebf92..b163c0b70 100644 --- a/SignalServiceKit/src/Tests/MockSSKEnvironment.m +++ b/SignalServiceKit/src/Tests/MockSSKEnvironment.m @@ -14,6 +14,7 @@ #import "OWSIdentityManager.h" #import "OWSMessageManager.h" #import "OWSPrimaryStorage.h" +#import NS_ASSUME_NONNULL_BEGIN @@ -47,6 +48,7 @@ NS_ASSUME_NONNULL_BEGIN OWSMessageManager *messageManager = [[OWSMessageManager alloc] initWithPrimaryStorage:primaryStorage]; OWSBlockingManager *blockingManager = [[OWSBlockingManager alloc] initWithPrimaryStorage:primaryStorage]; OWSIdentityManager *identityManager = [[OWSIdentityManager alloc] initWithPrimaryStorage:primaryStorage]; + id udManager = [[OWSUDManagerImpl alloc] initWithPrimaryStorage:primaryStorage]; self = [super initWithContactsManager:contactsManager messageSender:messageSender @@ -56,7 +58,8 @@ NS_ASSUME_NONNULL_BEGIN networkManager:networkManager messageManager:messageManager blockingManager:blockingManager - identityManager:identityManager]; + identityManager:identityManager + udManager:udManager]; if (!self) { return nil; } diff --git a/SignalServiceKit/src/Tests/OWSFakeProfileManager.m b/SignalServiceKit/src/Tests/OWSFakeProfileManager.m index 7092ea811..de37d0957 100644 --- a/SignalServiceKit/src/Tests/OWSFakeProfileManager.m +++ b/SignalServiceKit/src/Tests/OWSFakeProfileManager.m @@ -48,8 +48,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)setProfileKeyData:(NSData *)profileKey forRecipientId:(NSString *)recipientId { - OWSAES256Key *key = [OWSAES256Key keyWithData:profileKey]; - NSAssert(key, @"Unable to build key. Invalid key data?"); + OWSAES256Key *_Nullable key = [OWSAES256Key keyWithData:profileKey]; + OWSAssert(key); self.profileKeys[recipientId] = key; } diff --git a/SignalServiceKit/src/Tests/OWSFakeUDManager.swift b/SignalServiceKit/src/Tests/OWSFakeUDManager.swift new file mode 100644 index 000000000..2bea21c0f --- /dev/null +++ b/SignalServiceKit/src/Tests/OWSFakeUDManager.swift @@ -0,0 +1,32 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation + +#if DEBUG + +@objc +public class OWSFakeUDManager: NSObject, OWSUDManager { + + private var udRecipientSet = Set() + + // MARK: - + + @objc + public func isUDRecipientId(_ recipientId: String) -> Bool { + return udRecipientSet.contains(recipientId) + } + + @objc + public func addUDRecipientId(_ recipientId: String) { + udRecipientSet.insert(recipientId) + } + + @objc + public func removeUDRecipientId(_ recipientId: String) { + udRecipientSet.remove(recipientId) + } +} + +#endif diff --git a/SignalServiceKit/src/Util/UDManager.swift b/SignalServiceKit/src/Util/UDManager.swift deleted file mode 100644 index f809bbf8c..000000000 --- a/SignalServiceKit/src/Util/UDManager.swift +++ /dev/null @@ -1,5 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -import Foundation diff --git a/SignalServiceKit/tests/Account/SignedPreKeyDeletionTests.m b/SignalServiceKit/tests/Account/SignedPreKeyDeletionTests.m index 432b903cb..8b6dafb50 100644 --- a/SignalServiceKit/tests/Account/SignedPreKeyDeletionTests.m +++ b/SignalServiceKit/tests/Account/SignedPreKeyDeletionTests.m @@ -3,7 +3,7 @@ // #import "OWSPrimaryStorage+SignedPreKeyStore.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSPreKeyManager.h" #import @@ -13,7 +13,7 @@ @end -@interface SignedPreKeyDeletionTests : SSKBaseTest +@interface SignedPreKeyDeletionTests : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Account/TSAttributesTest.m b/SignalServiceKit/tests/Account/TSAttributesTest.m index 1204a0aa3..f42145a9e 100644 --- a/SignalServiceKit/tests/Account/TSAttributesTest.m +++ b/SignalServiceKit/tests/Account/TSAttributesTest.m @@ -3,11 +3,11 @@ // #import "TSAttributes.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSAccountManager.h" #import -@interface TSAttributesTest : SSKBaseTest +@interface TSAttributesTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Contacts/ContactSortingTest.m b/SignalServiceKit/tests/Contacts/ContactSortingTest.m index 9340e1866..087ff5aa8 100644 --- a/SignalServiceKit/tests/Contacts/ContactSortingTest.m +++ b/SignalServiceKit/tests/Contacts/ContactSortingTest.m @@ -3,13 +3,16 @@ // #import "Contact.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" + +//#import "SignalServiceKit_Unit_Tests-Swift.h" +//#import @import Contacts; NS_ASSUME_NONNULL_BEGIN -@interface ContactSortingTest : SSKBaseTest +@interface ContactSortingTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Contacts/OWSDisappearingMessagesConfigurationTest.m b/SignalServiceKit/tests/Contacts/OWSDisappearingMessagesConfigurationTest.m index 1f8703502..f55c2468d 100644 --- a/SignalServiceKit/tests/Contacts/OWSDisappearingMessagesConfigurationTest.m +++ b/SignalServiceKit/tests/Contacts/OWSDisappearingMessagesConfigurationTest.m @@ -3,11 +3,11 @@ // #import "OWSDisappearingMessagesConfiguration.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" NS_ASSUME_NONNULL_BEGIN -@interface OWSDisappearingMessagesConfigurationTest : SSKBaseTest +@interface OWSDisappearingMessagesConfigurationTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Contacts/PhoneNumberTest.m b/SignalServiceKit/tests/Contacts/PhoneNumberTest.m index 8dc3c6433..360432d72 100644 --- a/SignalServiceKit/tests/Contacts/PhoneNumberTest.m +++ b/SignalServiceKit/tests/Contacts/PhoneNumberTest.m @@ -3,9 +3,9 @@ // #import "PhoneNumber.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" -@interface PhoneNumberTest : SSKBaseTest +@interface PhoneNumberTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Contacts/PhoneNumberUtilTest.m b/SignalServiceKit/tests/Contacts/PhoneNumberUtilTest.m index 4f4f1d04b..ef3041afd 100644 --- a/SignalServiceKit/tests/Contacts/PhoneNumberUtilTest.m +++ b/SignalServiceKit/tests/Contacts/PhoneNumberUtilTest.m @@ -3,9 +3,9 @@ // #import "PhoneNumberUtil.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" -@interface PhoneNumberUtilTest : SSKBaseTest +@interface PhoneNumberUtilTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Contacts/SignalRecipientTest.m b/SignalServiceKit/tests/Contacts/SignalRecipientTest.m index 845332b8d..630719613 100644 --- a/SignalServiceKit/tests/Contacts/SignalRecipientTest.m +++ b/SignalServiceKit/tests/Contacts/SignalRecipientTest.m @@ -5,7 +5,7 @@ #import "SignalRecipient.h" #import "MockSSKEnvironment.h" #import "OWSPrimaryStorage.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSAccountManager.h" #import "TestAppContext.h" #import @@ -16,7 +16,7 @@ @end -@interface SignalRecipientTest : SSKBaseTest +@interface SignalRecipientTest : SSKBaseTestObjC @property (nonatomic) NSString *localNumber; diff --git a/SignalServiceKit/tests/Contacts/TSContactThreadTest.m b/SignalServiceKit/tests/Contacts/TSContactThreadTest.m index 238dc4240..9366a1652 100644 --- a/SignalServiceKit/tests/Contacts/TSContactThreadTest.m +++ b/SignalServiceKit/tests/Contacts/TSContactThreadTest.m @@ -5,11 +5,11 @@ #import "TSContactThread.h" #import "MockSSKEnvironment.h" #import "OWSIdentityManager.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" NS_ASSUME_NONNULL_BEGIN -@interface TSContactThreadTest : SSKBaseTest +@interface TSContactThreadTest : SSKBaseTestObjC @property (nonatomic) TSContactThread *contactThread; diff --git a/SignalServiceKit/tests/Contacts/TSGroupThreadTest.m b/SignalServiceKit/tests/Contacts/TSGroupThreadTest.m index 974d36b19..cacf21018 100644 --- a/SignalServiceKit/tests/Contacts/TSGroupThreadTest.m +++ b/SignalServiceKit/tests/Contacts/TSGroupThreadTest.m @@ -3,11 +3,11 @@ // #import "TSGroupThread.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" NS_ASSUME_NONNULL_BEGIN -@interface TSGroupThreadTest : SSKBaseTest +@interface TSGroupThreadTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Contacts/TSThreadTest.m b/SignalServiceKit/tests/Contacts/TSThreadTest.m index 94cd7d9ec..7a8e41c8a 100644 --- a/SignalServiceKit/tests/Contacts/TSThreadTest.m +++ b/SignalServiceKit/tests/Contacts/TSThreadTest.m @@ -4,7 +4,7 @@ #import "OWSDevice.h" #import "OWSPrimaryStorage.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSAttachmentStream.h" #import "TSContactThread.h" #import "TSIncomingMessage.h" @@ -12,7 +12,7 @@ #import "TestAppContext.h" #import -@interface TSThreadTest : SSKBaseTest +@interface TSThreadTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Devices/OWSDeviceProvisionerTest.m b/SignalServiceKit/tests/Devices/OWSDeviceProvisionerTest.m index 1f4293ca8..15fa17fc7 100644 --- a/SignalServiceKit/tests/Devices/OWSDeviceProvisionerTest.m +++ b/SignalServiceKit/tests/Devices/OWSDeviceProvisionerTest.m @@ -6,7 +6,7 @@ #import "OWSDeviceProvisioningCodeService.h" #import "OWSDeviceProvisioningService.h" #import "OWSFakeNetworkManager.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSNetworkManager.h" @interface OWSFakeDeviceProvisioningService : OWSDeviceProvisioningService @@ -48,7 +48,7 @@ @end -@interface OWSDeviceProvisionerTest : SSKBaseTest +@interface OWSDeviceProvisionerTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Devices/OWSProvisioningCipherTest.m b/SignalServiceKit/tests/Devices/OWSProvisioningCipherTest.m index 9734c29da..359259a76 100644 --- a/SignalServiceKit/tests/Devices/OWSProvisioningCipherTest.m +++ b/SignalServiceKit/tests/Devices/OWSProvisioningCipherTest.m @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import #import #import @@ -16,7 +16,7 @@ @end -@interface OWSProvisioningCipherTest : SSKBaseTest +@interface OWSProvisioningCipherTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Messages/Interactions/TSMessageTest.m b/SignalServiceKit/tests/Messages/Interactions/TSMessageTest.m index 35ee47ca8..91fb30d7e 100644 --- a/SignalServiceKit/tests/Messages/Interactions/TSMessageTest.m +++ b/SignalServiceKit/tests/Messages/Interactions/TSMessageTest.m @@ -2,15 +2,15 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import "SSKBaseTest.h" +#import "TSMessage.h" +#import "SSKBaseTestObjC.h" #import "TSAttachmentStream.h" #import "TSContactThread.h" -#import "TSMessage.h" #import NS_ASSUME_NONNULL_BEGIN -@interface TSMessageTest : SSKBaseTest +@interface TSMessageTest : SSKBaseTestObjC @property TSThread *thread; diff --git a/SignalServiceKit/tests/Messages/Interactions/TSOutgoingMessageTest.m b/SignalServiceKit/tests/Messages/Interactions/TSOutgoingMessageTest.m index c3ab992d8..512f39daa 100644 --- a/SignalServiceKit/tests/Messages/Interactions/TSOutgoingMessageTest.m +++ b/SignalServiceKit/tests/Messages/Interactions/TSOutgoingMessageTest.m @@ -4,12 +4,12 @@ #import "TSOutgoingMessage.h" #import "OWSPrimaryStorage.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSContactThread.h" NS_ASSUME_NONNULL_BEGIN -@interface TSOutgoingMessageTest : SSKBaseTest +@interface TSOutgoingMessageTest : SSKBaseTestObjC @property (nonatomic) TSContactThread *thread; diff --git a/SignalServiceKit/tests/Messages/OWSDisappearingMessageFinderTest.m b/SignalServiceKit/tests/Messages/OWSDisappearingMessageFinderTest.m index fea3e31f7..de81bba37 100644 --- a/SignalServiceKit/tests/Messages/OWSDisappearingMessageFinderTest.m +++ b/SignalServiceKit/tests/Messages/OWSDisappearingMessageFinderTest.m @@ -5,7 +5,7 @@ #import "MockSSKEnvironment.h" #import "OWSDisappearingMessagesFinder.h" #import "OWSPrimaryStorage.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSContactThread.h" #import "TSMessage.h" #import "TestAppContext.h" @@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - -@interface OWSDisappearingMessageFinderTest : SSKBaseTest +@interface OWSDisappearingMessageFinderTest : SSKBaseTestObjC @property (nonatomic, nullable) OWSDisappearingMessagesFinder *finder; @property (nonatomic, nullable) TSThread *thread; diff --git a/SignalServiceKit/tests/Messages/OWSDisappearingMessagesJobTest.m b/SignalServiceKit/tests/Messages/OWSDisappearingMessagesJobTest.m index a025d6528..db2ef85bd 100644 --- a/SignalServiceKit/tests/Messages/OWSDisappearingMessagesJobTest.m +++ b/SignalServiceKit/tests/Messages/OWSDisappearingMessagesJobTest.m @@ -2,12 +2,12 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // +#import "OWSDisappearingMessagesJob.h" #import "OWSDisappearingMessagesConfiguration.h" #import "OWSDisappearingMessagesFinder.h" -#import "OWSDisappearingMessagesJob.h" #import "OWSFakeContactsManager.h" #import "OWSPrimaryStorage.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSContactThread.h" #import "TSMessage.h" #import @@ -22,7 +22,7 @@ NS_ASSUME_NONNULL_BEGIN @end -@interface OWSDisappearingMessagesJobTest : SSKBaseTest +@interface OWSDisappearingMessagesJobTest : SSKBaseTestObjC @property TSThread *thread; diff --git a/SignalServiceKit/tests/Messages/OWSIncomingMessageFinderTest.m b/SignalServiceKit/tests/Messages/OWSIncomingMessageFinderTest.m index 1999008b3..59015e83d 100644 --- a/SignalServiceKit/tests/Messages/OWSIncomingMessageFinderTest.m +++ b/SignalServiceKit/tests/Messages/OWSIncomingMessageFinderTest.m @@ -5,7 +5,7 @@ #import "OWSIncomingMessageFinder.h" #import "OWSDevice.h" #import "OWSPrimaryStorage.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSContactThread.h" #import "TSIncomingMessage.h" @@ -17,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN @end -@interface OWSIncomingMessageFinderTest : SSKBaseTest +@interface OWSIncomingMessageFinderTest : SSKBaseTestObjC @property (nonatomic) NSString *sourceId; @property (nonatomic) TSThread *thread; diff --git a/SignalServiceKit/tests/Messages/OWSMessageManagerTest.m b/SignalServiceKit/tests/Messages/OWSMessageManagerTest.m index 9b2a4c041..7bd77172f 100644 --- a/SignalServiceKit/tests/Messages/OWSMessageManagerTest.m +++ b/SignalServiceKit/tests/Messages/OWSMessageManagerTest.m @@ -13,7 +13,7 @@ #import "OWSIdentityManager.h" #import "OWSMessageSender.h" #import "OWSPrimaryStorage.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSGroupThread.h" #import "TSNetworkManager.h" #import @@ -42,7 +42,7 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - -@interface OWSMessageManagerTest : SSKBaseTest +@interface OWSMessageManagerTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Messages/OWSMessageSenderTest.m b/SignalServiceKit/tests/Messages/OWSMessageSenderTest.m index e0077cc59..6881d79eb 100644 --- a/SignalServiceKit/tests/Messages/OWSMessageSenderTest.m +++ b/SignalServiceKit/tests/Messages/OWSMessageSenderTest.m @@ -10,7 +10,7 @@ #import "OWSFakeNetworkManager.h" #import "OWSPrimaryStorage.h" #import "OWSUploadOperation.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSAccountManager.h" #import "TSContactThread.h" #import "TSGroupModel.h" @@ -206,7 +206,7 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - -@interface OWSMessageSenderTest : SSKBaseTest +@interface OWSMessageSenderTest : SSKBaseTestObjC @property (nonatomic) TSThread *thread; @property (nonatomic) TSOutgoingMessage *expiringMessage; diff --git a/SignalServiceKit/tests/Messages/OWSSignalAddressTest.swift b/SignalServiceKit/tests/Messages/OWSSignalAddressTest.swift new file mode 100644 index 000000000..e529770e9 --- /dev/null +++ b/SignalServiceKit/tests/Messages/OWSSignalAddressTest.swift @@ -0,0 +1,40 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation +import SignalServiceKit +import XCTest + +class OWSSignalAddressTest: SSKBaseTestSwift { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testInitializer() { + let recipientId = "+13213214321" + let deviceId: UInt = 1 + let address = try! OWSSignalAddress(recipientId: recipientId, deviceId: deviceId) + XCTAssertEqual(address.recipientId, recipientId) + XCTAssertEqual(address.deviceId, deviceId) + } + + func testInitializer_badRecipientId() { + let recipientId = "" + let deviceId: UInt = 1 + XCTAssertThrowsError(try OWSSignalAddress(recipientId: recipientId, deviceId: deviceId)) + } + + func testInitializer_badDeviceId() { + let recipientId = "+13213214321" + let deviceId: UInt = 0 + XCTAssertThrowsError(try OWSSignalAddress(recipientId: recipientId, deviceId: deviceId)) + } +} diff --git a/SignalServiceKit/tests/Messages/OWSUDManagerTest.swift b/SignalServiceKit/tests/Messages/OWSUDManagerTest.swift new file mode 100644 index 000000000..e431be8be --- /dev/null +++ b/SignalServiceKit/tests/Messages/OWSUDManagerTest.swift @@ -0,0 +1,23 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import XCTest +import Foundation +import SignalServiceKit + +class OWSUDManagerTest: SSKBaseTestSwift { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testInitializer() { + } +} diff --git a/SignalServiceKit/tests/SSKBaseTest.h b/SignalServiceKit/tests/SSKBaseTestObjC.h similarity index 91% rename from SignalServiceKit/tests/SSKBaseTest.h rename to SignalServiceKit/tests/SSKBaseTestObjC.h index 2e7f87ba1..9b1007a9a 100644 --- a/SignalServiceKit/tests/SSKBaseTest.h +++ b/SignalServiceKit/tests/SSKBaseTestObjC.h @@ -10,7 +10,7 @@ NS_ASSUME_NONNULL_BEGIN #ifdef DEBUG -@interface SSKBaseTest : XCTestCase +@interface SSKBaseTestObjC : XCTestCase - (void)readWithBlock:(void (^)(YapDatabaseReadTransaction *transaction))block; diff --git a/SignalServiceKit/tests/SSKBaseTest.m b/SignalServiceKit/tests/SSKBaseTestObjC.m similarity index 93% rename from SignalServiceKit/tests/SSKBaseTest.m rename to SignalServiceKit/tests/SSKBaseTestObjC.m index 37e0349cc..f1f2bc026 100644 --- a/SignalServiceKit/tests/SSKBaseTest.m +++ b/SignalServiceKit/tests/SSKBaseTestObjC.m @@ -2,7 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "OWSPrimaryStorage.h" #import "SSKEnvironment.h" #import "TestAppContext.h" @@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN #ifdef DEBUG -@implementation SSKBaseTest +@implementation SSKBaseTestObjC - (void)setUp { diff --git a/SignalServiceKit/tests/SSKBaseTestSwift.swift b/SignalServiceKit/tests/SSKBaseTestSwift.swift new file mode 100644 index 000000000..e002656a9 --- /dev/null +++ b/SignalServiceKit/tests/SSKBaseTestSwift.swift @@ -0,0 +1,40 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import XCTest +import SignalServiceKit + +@objc +public class SSKBaseTestSwift: XCTestCase { + + @objc + public override func setUp() { + super.setUp() + + ClearCurrentAppContextForTests() + SetCurrentAppContext(TestAppContext()) + + MockSSKEnvironment.activate() + } + + @objc + public override func tearDown() { + super.tearDown() + + SSKEnvironment.shared.primaryStorage.closeForTests() + + ClearCurrentAppContextForTests() + SSKEnvironment.clearSharedForTests() + } + + @objc + public func read(_ block: @escaping (YapDatabaseReadTransaction) -> Swift.Void) { + return OWSPrimaryStorage.shared().dbReadConnection.read(block) + } + + @objc + public func readWrite(_ block: @escaping (YapDatabaseReadWriteTransaction) -> Swift.Void) { + return OWSPrimaryStorage.shared().dbReadWriteConnection.readWrite(block) + } +} diff --git a/SignalServiceKit/tests/Security/OWSFingerprintTest.m b/SignalServiceKit/tests/Security/OWSFingerprintTest.m index f40cd7645..27e0bbf0e 100644 --- a/SignalServiceKit/tests/Security/OWSFingerprintTest.m +++ b/SignalServiceKit/tests/Security/OWSFingerprintTest.m @@ -3,10 +3,10 @@ // #import "OWSFingerprint.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import -@interface OWSFingerprintTest : SSKBaseTest +@interface OWSFingerprintTest : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Storage/TSStorageIdentityKeyStoreTests.m b/SignalServiceKit/tests/Storage/TSStorageIdentityKeyStoreTests.m index 3c257ce7a..2c19170c9 100644 --- a/SignalServiceKit/tests/Storage/TSStorageIdentityKeyStoreTests.m +++ b/SignalServiceKit/tests/Storage/TSStorageIdentityKeyStoreTests.m @@ -6,7 +6,7 @@ #import "OWSIdentityManager.h" #import "OWSPrimaryStorage.h" #import "OWSRecipientIdentity.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "SSKEnvironment.h" #import "YapDatabaseConnection+OWS.h" #import @@ -14,7 +14,7 @@ extern NSString *const OWSPrimaryStorageTrustedKeysCollection; -@interface TSStorageIdentityKeyStoreTests : SSKBaseTest +@interface TSStorageIdentityKeyStoreTests : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Storage/TSStoragePreKeyStoreTests.m b/SignalServiceKit/tests/Storage/TSStoragePreKeyStoreTests.m index ec4243691..ad98a0a33 100644 --- a/SignalServiceKit/tests/Storage/TSStoragePreKeyStoreTests.m +++ b/SignalServiceKit/tests/Storage/TSStoragePreKeyStoreTests.m @@ -3,9 +3,9 @@ // #import "OWSPrimaryStorage+PreKeyStore.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" -@interface TSStoragePreKeyStoreTests : SSKBaseTest +@interface TSStoragePreKeyStoreTests : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Util/OWSAnalyticsTests.m b/SignalServiceKit/tests/Util/OWSAnalyticsTests.m index bff4feca5..cc2285b22 100644 --- a/SignalServiceKit/tests/Util/OWSAnalyticsTests.m +++ b/SignalServiceKit/tests/Util/OWSAnalyticsTests.m @@ -3,12 +3,12 @@ // #import "OWSAnalytics.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import NS_ASSUME_NONNULL_BEGIN -@interface OWSAnalyticsTests : SSKBaseTest +@interface OWSAnalyticsTests : SSKBaseTestObjC @end diff --git a/SignalServiceKit/tests/Util/TSMessageStorageTests.m b/SignalServiceKit/tests/Util/TSMessageStorageTests.m index 8e7e63448..6567687ac 100644 --- a/SignalServiceKit/tests/Util/TSMessageStorageTests.m +++ b/SignalServiceKit/tests/Util/TSMessageStorageTests.m @@ -3,7 +3,7 @@ // #import "OWSPrimaryStorage.h" -#import "SSKBaseTest.h" +#import "SSKBaseTestObjC.h" #import "TSContactThread.h" #import "TSGroupThread.h" #import "TSIncomingMessage.h" @@ -13,7 +13,7 @@ #import "YapDatabaseConnection+OWS.h" #import -@interface TSMessageStorageTests : SSKBaseTest +@interface TSMessageStorageTests : SSKBaseTestObjC @property TSContactThread *thread;