diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index ee86986df..26adc680a 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -53,13 +53,29 @@ NS_ASSUME_NONNULL_BEGIN actionBlock:^{ [DebugUIMessages sendTextMessages:1000 thread:thread]; }], - [OWSTableItem itemWithTitle:@"Create 1k fake messages" + [OWSTableItem itemWithTitle:@"Send 10 tiny attachments" actionBlock:^{ - [DebugUIMessages sendFakeTextMessage:1000 thread:thread]; + [DebugUIMessages sendTinyAttachments:10 thread:thread]; }], - [OWSTableItem itemWithTitle:@"Create 10k fake messages" + [OWSTableItem itemWithTitle:@"Send 100 tiny attachments" actionBlock:^{ - [DebugUIMessages sendFakeTextMessage:10 * 1000 thread:thread]; + [DebugUIMessages sendTinyAttachments:100 thread:thread]; + }], + [OWSTableItem itemWithTitle:@"Send 1,000 tiny attachments" + actionBlock:^{ + [DebugUIMessages sendTinyAttachments:1000 thread:thread]; + }], + [OWSTableItem itemWithTitle:@"Send fake 10 messages" + actionBlock:^{ + [DebugUIMessages sendFakeMessages:10 thread:thread]; + }], + [OWSTableItem itemWithTitle:@"Send fake 1k messages" + actionBlock:^{ + [DebugUIMessages sendFakeMessages:1000 thread:thread]; + }], + [OWSTableItem itemWithTitle:@"Send fake 10k messages" + actionBlock:^{ + [DebugUIMessages sendFakeMessages:10 * 1000 thread:thread]; }], [OWSTableItem itemWithTitle:@"Send text/x-signal-plain" actionBlock:^{ @@ -517,13 +533,17 @@ NS_ASSUME_NONNULL_BEGIN } + (void)sendRandomAttachment:(TSThread *)thread uti:(NSString *)uti +{ + [self sendRandomAttachment:thread uti:uti length:256]; +} + ++ (void)sendRandomAttachment:(TSThread *)thread uti:(NSString *)uti length:(NSUInteger)length { OWSMessageSender *messageSender = [Environment getCurrent].messageSender; SignalAttachment *attachment = - [SignalAttachment attachmentWithData:[self createRandomNSDataOfSize:256] dataUTI:uti filename:nil]; - [ThreadUtil sendMessageWithAttachment:attachment inThread:thread messageSender:messageSender]; + [SignalAttachment attachmentWithData:[self createRandomNSDataOfSize:length] dataUTI:uti filename:nil]; + [ThreadUtil sendMessageWithAttachment:attachment inThread:thread messageSender:messageSender ignoreErrors:YES]; } - + (OWSSignalServiceProtosEnvelope *)createEnvelopeForThread:(TSThread *)thread { OWSAssert(thread); @@ -760,31 +780,105 @@ NS_ASSUME_NONNULL_BEGIN return randomText; } -+ (void)sendFakeTextMessage:(int)counter thread:(TSThread *)thread -{ - NSMutableArray *messages = [NSMutableArray new]; - for (int i = 0; i < counter; i++) { - NSString *randomText = [self randomText]; - BOOL isIncoming = arc4random_uniform(2) == 0; - if (isIncoming) { - [messages addObject:[[TSIncomingMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - authorId:@"+19174054215" - sourceDeviceId:0 - messageBody:randomText]]; - } else { - [messages addObject:[[TSOutgoingMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - messageBody:randomText]]; - } - } ++ (void)sendFakeMessages:(int)counter thread:(TSThread *)thread +{ [TSStorageManager.sharedManager.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (TSMessage *message in messages) { - [message saveWithTransaction:transaction]; + for (int i = 0; i < counter; i++) { + NSString *randomText = [self randomText]; + switch (arc4random_uniform(4)) { + case 0: { + TSIncomingMessage *message = + [[TSIncomingMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] + inThread:thread + authorId:@"+19174054215" + sourceDeviceId:0 + messageBody:randomText]; + [message markAsReadWithTransaction:transaction sendReadReceipt:NO updateExpiration:NO]; + break; + } + case 1: { + TSOutgoingMessage *message = + [[TSOutgoingMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] + inThread:thread + messageBody:randomText]; + [message saveWithTransaction:transaction]; + break; + } + case 2: { + TSAttachmentPointer *pointer = + [[TSAttachmentPointer alloc] initWithServerId:237391539706350548 + key:[self createRandomNSDataOfSize:64] + digest:nil + contentType:@"audio/mp3" + relay:@"" + sourceFilename:@"test.mp3" + attachmentType:TSAttachmentTypeDefault]; + [pointer saveWithTransaction:transaction]; + TSIncomingMessage *message = + [[TSIncomingMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] + inThread:thread + authorId:@"+19174054215" + sourceDeviceId:0 + messageBody:nil + attachmentIds:@[ + pointer.uniqueId, + ] + expiresInSeconds:0]; + [message markAsReadWithTransaction:transaction sendReadReceipt:NO updateExpiration:NO]; + break; + } + case 3: { + OWSDisappearingMessagesConfiguration *configuration = + [OWSDisappearingMessagesConfiguration fetchObjectWithUniqueID:thread.uniqueId + transaction:transaction]; + TSOutgoingMessage *message = [[TSOutgoingMessage alloc] + initWithTimestamp:[NSDate ows_millisecondTimeStamp] + inThread:thread + isVoiceMessage:NO + expiresInSeconds:(configuration.isEnabled ? configuration.durationSeconds : 0)]; + + NSString *filename = @"test.mp3"; + TSAttachmentStream *attachmentStream = + [[TSAttachmentStream alloc] initWithContentType:@"audio/mp3" sourceFilename:filename]; + + NSError *error; + [attachmentStream writeData:[self createRandomNSDataOfSize:16] error:&error]; + OWSAssert(!error); + + [attachmentStream saveWithTransaction:transaction]; + [message.attachmentIds addObject:attachmentStream.uniqueId]; + if (filename) { + message.attachmentFilenameMap[attachmentStream.uniqueId] = filename; + } + [message saveWithTransaction:transaction]; + break; + } + } } }]; } ++ (void)sendTinyAttachments:(int)counter thread:(TSThread *)thread +{ + if (counter < 1) { + return; + } + + NSArray *utis = @[ + (NSString *)kUTTypePDF, + (NSString *)kUTTypeMP3, + (NSString *)kUTTypeGIF, + (NSString *)kUTTypeMPEG4, + (NSString *)kUTTypeJPEG, + ]; + NSString *uti = utis[(NSUInteger)arc4random_uniform((uint32_t)utis.count)]; + [self sendRandomAttachment:thread uti:uti length:16]; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)1.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ + [self sendTinyAttachments:counter - 1 thread:thread]; + }); +} + @end NS_ASSUME_NONNULL_END diff --git a/Signal/src/util/ThreadUtil.h b/Signal/src/util/ThreadUtil.h index 1c4fd2b71..544803394 100644 --- a/Signal/src/util/ThreadUtil.h +++ b/Signal/src/util/ThreadUtil.h @@ -54,6 +54,11 @@ NS_ASSUME_NONNULL_BEGIN inThread:(TSThread *)thread messageSender:(OWSMessageSender *)messageSender; ++ (TSOutgoingMessage *)sendMessageWithAttachment:(SignalAttachment *)attachment + inThread:(TSThread *)thread + messageSender:(OWSMessageSender *)messageSender + ignoreErrors:(BOOL)ignoreErrors; + // This method will create and/or remove any offers and indicators // necessary for this thread. This includes: // diff --git a/Signal/src/util/ThreadUtil.m b/Signal/src/util/ThreadUtil.m index 0739759d8..e3ea27574 100644 --- a/Signal/src/util/ThreadUtil.m +++ b/Signal/src/util/ThreadUtil.m @@ -60,14 +60,21 @@ NS_ASSUME_NONNULL_BEGIN return message; } ++ (TSOutgoingMessage *)sendMessageWithAttachment:(SignalAttachment *)attachment + inThread:(TSThread *)thread + messageSender:(OWSMessageSender *)messageSender +{ + return [self sendMessageWithAttachment:attachment inThread:thread messageSender:messageSender ignoreErrors:NO]; +} + (TSOutgoingMessage *)sendMessageWithAttachment:(SignalAttachment *)attachment inThread:(TSThread *)thread messageSender:(OWSMessageSender *)messageSender + ignoreErrors:(BOOL)ignoreErrors { OWSAssert([NSThread isMainThread]); OWSAssert(attachment); - OWSAssert(![attachment hasError]); + OWSAssert(ignoreErrors || ![attachment hasError]); OWSAssert([attachment mimeType].length > 0); OWSAssert(thread); OWSAssert(messageSender);