From e2ad9d81bb9b983a0838f384bf994f7534dfc276 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 9 Nov 2018 17:56:59 -0600 Subject: [PATCH] attachment factory flesh out other factory builders --- .../ConversationViewItemTest.m | 9 +- .../src/TestUtils/Factories.swift | 220 ++++++++++++++++-- .../tests/Contacts/TSThreadTest.m | 9 +- 3 files changed, 207 insertions(+), 31 deletions(-) diff --git a/Signal/test/ViewControllers/ConversationViewItemTest.m b/Signal/test/ViewControllers/ConversationViewItemTest.m index fbb6c718a..4dd0ca755 100644 --- a/Signal/test/ViewControllers/ConversationViewItemTest.m +++ b/Signal/test/ViewControllers/ConversationViewItemTest.m @@ -7,6 +7,7 @@ #import #import #import +#import #import #import #import @@ -64,12 +65,8 @@ OWSAssertDebug([[NSFileManager defaultManager] fileExistsAtPath:filePath]); DataSource *dataSource = [DataSourcePath dataSourceWithFilePath:filePath shouldDeleteOnDeallocation:NO]; - TSAttachmentStream *attachment = [[TSAttachmentStream alloc] initWithContentType:mimeType - byteCount:(UInt32)dataSource.dataLength - sourceFilename:nil]; - BOOL success = [attachment writeDataSource:dataSource]; - OWSAssertDebug(success); - [attachment save]; + TSAttachmentStream *attachment = [AttachmentStreamFactory createWithContentType:mimeType dataSource:dataSource]; + TSOutgoingMessage *message = [TSOutgoingMessage outgoingMessageInThread:self.thread messageBody:nil attachmentId:attachment.uniqueId]; [message save]; diff --git a/SignalServiceKit/src/TestUtils/Factories.swift b/SignalServiceKit/src/TestUtils/Factories.swift index 7155d4787..c963360f1 100644 --- a/SignalServiceKit/src/TestUtils/Factories.swift +++ b/SignalServiceKit/src/TestUtils/Factories.swift @@ -45,10 +45,19 @@ protocol Factory { } extension Factory { + + static var dbConnection: YapDatabaseConnection { + return OWSPrimaryStorage.shared().dbReadWriteConnection + } + var dbConnection: YapDatabaseConnection { return OWSPrimaryStorage.shared().dbReadWriteConnection } + static func readWrite(block: @escaping (YapDatabaseReadWriteTransaction) -> Void) { + dbConnection.readWrite(block) + } + func readWrite(block: @escaping (YapDatabaseReadWriteTransaction) -> Void) { dbConnection.readWrite(block) } @@ -76,12 +85,14 @@ extension Factory { } } -class ContactThreadFactory: Factory { +@objc +class ContactThreadFactory: NSObject, Factory { var messageCount: UInt = 0 // MARK: Factory + @objc func create(transaction: YapDatabaseReadWriteTransaction) -> TSContactThread { let threadId = generateContactThreadId() let thread = TSContactThread.getOrCreateThread(withContactId: threadId, transaction: transaction) @@ -110,25 +121,28 @@ class ContactThreadFactory: Factory { } } -class OutgoingMessageFactory: Factory { +@objc +class OutgoingMessageFactory: NSObject, Factory { // MARK: Factory + @objc func build(transaction: YapDatabaseReadWriteTransaction) -> TSOutgoingMessage { let item = TSOutgoingMessage(outgoingMessageWithTimestamp: timestampBuilder(), in: threadCreator(transaction), messageBody: messageBodyBuilder(), - attachmentIds: [], - expiresInSeconds: 0, - expireStartedAt: 0, - isVoiceMessage: false, - groupMetaMessage: .unspecified, - quotedMessage: nil, - contactShare: nil) + attachmentIds: attachmentIdsBuilder(), + expiresInSeconds: expiresInSecondsBuilder(), + expireStartedAt: expireStartedAtBuilder(), + isVoiceMessage: isVoiceMessageBuilder(), + groupMetaMessage: groupMetaMessageBuilder(), + quotedMessage: quotedMessageBuilder(), + contactShare: contactShareBuilder()) return item } + @objc func create(transaction: YapDatabaseReadWriteTransaction) -> TSOutgoingMessage { let item = self.build(transaction: transaction) item.save(with: transaction) @@ -138,22 +152,61 @@ class OutgoingMessageFactory: Factory { // MARK: Dependent Factories + @objc var threadCreator: (YapDatabaseReadWriteTransaction) -> TSThread = { transaction in ContactThreadFactory().create(transaction: transaction) } // MARK: Generators + @objc var timestampBuilder: () -> UInt64 = { return NSDate.ows_millisecondTimeStamp() } + @objc var messageBodyBuilder: () -> String = { return CommonGenerator.paragraph } + @objc + var attachmentIdsBuilder: () -> NSMutableArray = { + return [] + } + + @objc + var expiresInSecondsBuilder: () -> UInt32 = { + return 0 + } + + @objc + var expireStartedAtBuilder: () -> UInt64 = { + return 0 + } + + @objc + var isVoiceMessageBuilder: () -> Bool = { + return false + } + + @objc + var groupMetaMessageBuilder: () -> TSGroupMetaMessage = { + return .unspecified + } + + @objc + var quotedMessageBuilder: () -> TSQuotedMessage? = { + return nil + } + + @objc + var contactShareBuilder: () -> OWSContact? = { + return nil + } + // MARK: Delivery Receipts + @objc func buildDeliveryReceipt() -> OWSReceiptsForSenderMessage { var item: OWSReceiptsForSenderMessage! self.readWrite { transaction in @@ -162,33 +215,37 @@ class OutgoingMessageFactory: Factory { return item } + @objc func buildDeliveryReceipt(transaction: YapDatabaseReadWriteTransaction) -> OWSReceiptsForSenderMessage { let item = OWSReceiptsForSenderMessage.deliveryReceiptsForSenderMessage(with: threadCreator(transaction), messageTimestamps: messageTimestampsBuilder()) return item } + @objc var messageTimestampsBuilder: () -> [NSNumber] = { return [1] } } -class IncomingMessageFactory: Factory { +@objc +class IncomingMessageFactory: NSObject, Factory { // MARK: Factory + @objc func create(transaction: YapDatabaseReadWriteTransaction) -> TSIncomingMessage { let item = TSIncomingMessage(incomingMessageWithTimestamp: timestampBuilder(), in: threadCreator(transaction), authorId: authorIdBuilder(), - sourceDeviceId: 1, + sourceDeviceId: sourceDeviceIdBuilder(), messageBody: messageBodyBuilder(), - attachmentIds: [], - expiresInSeconds: 0, - quotedMessage: nil, - contactShare: nil, - serverTimestamp: nil, - wasReceivedByUD: false) + attachmentIds: attachmentIdsBuilder(), + expiresInSeconds: expiresInSecondsBuilder(), + quotedMessage: quotedMessageBuilder(), + contactShare: contactShareBuilder(), + serverTimestamp: serverTimestampBuilder(), + wasReceivedByUD: wasReceivedByUDBuilder()) item.save(with: transaction) @@ -197,29 +254,71 @@ class IncomingMessageFactory: Factory { // MARK: Dependent Factories + @objc var threadCreator: (YapDatabaseReadWriteTransaction) -> TSThread = { transaction in ContactThreadFactory().create(transaction: transaction) } // MARK: Generators + @objc var timestampBuilder: () -> UInt64 = { return NSDate.ows_millisecondTimeStamp() } + @objc var messageBodyBuilder: () -> String = { return CommonGenerator.paragraph } + @objc var authorIdBuilder: () -> String = { return CommonGenerator.contactId } + + @objc + var sourceDeviceIdBuilder: () -> UInt32 = { + return 1 + } + + @objc + var attachmentIdsBuilder: () -> [String] = { + return [] + } + + @objc + var expiresInSecondsBuilder: () -> UInt32 = { + return 0 + } + + @objc + var quotedMessageBuilder: () -> TSQuotedMessage? = { + return nil + } + + @objc + var contactShareBuilder: () -> OWSContact? = { + return nil + } + + @objc + var serverTimestampBuilder: () -> NSNumber? = { + return nil + } + + @objc + var wasReceivedByUDBuilder: () -> Bool = { + return false + } } -class GroupThreadFactory: Factory { +@objc +class GroupThreadFactory: NSObject, Factory { + @objc var messageCount: UInt = 0 + @objc func create(transaction: YapDatabaseReadWriteTransaction) -> TSGroupThread { let thread = TSGroupThread.getOrCreateThread(with: groupModelBuilder(self), transaction: transaction) @@ -245,6 +344,7 @@ class GroupThreadFactory: Factory { // MARK: Generators + @objc var groupModelBuilder: (GroupThreadFactory) -> TSGroupModel = { groupThreadFactory in return TSGroupModel(title: groupThreadFactory.titleBuilder(), memberIds: groupThreadFactory.memberIdsBuilder(), @@ -252,24 +352,108 @@ class GroupThreadFactory: Factory { groupId: groupThreadFactory.groupIdBuilder()) } + @objc var titleBuilder: () -> String? = { return CommonGenerator.words(count: 3) } + @objc var groupIdBuilder: () -> Data = { return Randomness.generateRandomBytes(Int32(kGroupIdLength))! } + @objc var imageBuilder: () -> UIImage? = { return nil } + @objc var memberIdsBuilder: () -> [RecipientIdentifier] = { let groupSize = arc4random_uniform(10) return (0.. TSAttachmentStream { + var item: TSAttachmentStream! + readWrite { transaction in + item = create(contentType: contentType, dataSource: dataSource, transaction: transaction) + } + return item + } + + @objc + class func create(contentType: String, dataSource: DataSource, transaction: YapDatabaseReadWriteTransaction) -> TSAttachmentStream { + let factory = AttachmentStreamFactory() + factory.contentTypeBuilder = { return contentType } + factory.byteCountBuilder = { return UInt32(dataSource.dataLength()) } + + let attachmentStream = factory.build(transaction: transaction) + dataSource.write(toPath: attachmentStream.originalFilePath!) + + attachmentStream.save(with: transaction) + + return attachmentStream + } + + // MARK: Factory + + @objc + func create(transaction: YapDatabaseReadWriteTransaction) -> TSAttachmentStream { + let attachmentStream = build(transaction: transaction) + attachmentStream.save(with: transaction) + + return attachmentStream + } + + @objc + func build(transaction: YapDatabaseReadTransaction) -> TSAttachmentStream { + return build() + } + + @objc + func build() -> TSAttachmentStream { + let attachmentStream = TSAttachmentStream(contentType: contentTypeBuilder(), + byteCount: byteCountBuilder(), + sourceFilename: sourceFilenameBuilder(), + caption: captionBuilder(), + albumMessageId: albumMessageIdBuilder()) + + return attachmentStream + } + + // MARK: Properties + + @objc + var contentTypeBuilder: () -> String = { + return OWSMimeTypeApplicationOctetStream + } + + @objc + var byteCountBuilder: () -> UInt32 = { + return 0 + } + + @objc + var sourceFilenameBuilder: () -> String? = { + return "fake_file.dat" + } + + @objc + var captionBuilder: () -> String? = { + return nil + } + + @objc + var albumMessageIdBuilder: () -> String? = { + return nil + } +} + extension Array { func ows_randomElement() -> Element? { guard self.count > 0 else { diff --git a/SignalServiceKit/tests/Contacts/TSThreadTest.m b/SignalServiceKit/tests/Contacts/TSThreadTest.m index 5795f02b3..bea57d6fb 100644 --- a/SignalServiceKit/tests/Contacts/TSThreadTest.m +++ b/SignalServiceKit/tests/Contacts/TSThreadTest.m @@ -82,11 +82,8 @@ // Sanity check XCTAssertEqual(0, [thread numberOfInteractions]); - NSError *error; TSAttachmentStream *incomingAttachment = - [[TSAttachmentStream alloc] initWithContentType:@"image/jpeg" byteCount:0 sourceFilename:nil]; - [incomingAttachment writeData:[NSData new] error:&error]; - [incomingAttachment save]; + [AttachmentStreamFactory createWithContentType:@"image/jpeg" dataSource:DataSourceValue.emptyDataSource]; // Sanity check BOOL incomingFileWasCreated = @@ -108,9 +105,7 @@ [incomingMessage save]; TSAttachmentStream *outgoingAttachment = - [[TSAttachmentStream alloc] initWithContentType:@"image/jpeg" byteCount:0 sourceFilename:nil]; - [outgoingAttachment writeData:[NSData new] error:&error]; - [outgoingAttachment save]; + [AttachmentStreamFactory createWithContentType:@"image/jpeg" dataSource:DataSourceValue.emptyDataSource]; // Sanity check BOOL outgoingFileWasCreated =