|  |  |  | // | 
					
						
							|  |  |  | //  Copyright (c) 2019 Open Whisper Systems. All rights reserved. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #import "OWSDevice.h" | 
					
						
							|  |  |  | #import "OWSIncomingMessageFinder.h" | 
					
						
							|  |  |  | #import "OWSPrimaryStorage.h" | 
					
						
							|  |  |  | #import "SSKBaseTestObjC.h" | 
					
						
							|  |  |  | #import "TSContactThread.h" | 
					
						
							|  |  |  | #import "TSIncomingMessage.h" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NS_ASSUME_NONNULL_BEGIN | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @interface OWSIncomingMessageFinder (Testing) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - (void)registerExtension; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @interface OWSIncomingMessageFinderTest : SSKBaseTestObjC | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @property (nonatomic) NSString *sourceId; | 
					
						
							|  |  |  | @property (nonatomic) TSThread *thread; | 
					
						
							|  |  |  | @property (nonatomic) OWSIncomingMessageFinder *finder; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @implementation OWSIncomingMessageFinderTest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - (void)setUp | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     [super setUp]; | 
					
						
							|  |  |  |     self.sourceId = @"+19999999999"; | 
					
						
							|  |  |  |     self.thread = [TSContactThread getOrCreateThreadWithContactId:self.sourceId]; | 
					
						
							|  |  |  |     self.finder = [OWSIncomingMessageFinder new]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - (void)tearDown | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // Put teardown code here. This method is called after the invocation of each test method in the class. | 
					
						
							|  |  |  |     [super tearDown]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - (void)createIncomingMessageWithTimestamp:(uint64_t)timestamp | 
					
						
							|  |  |  |                                   authorId:(NSString *)authorId | 
					
						
							|  |  |  |                             sourceDeviceId:(uint32_t)sourceDeviceId | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     TSIncomingMessage *incomingMessage = [[TSIncomingMessage alloc] initIncomingMessageWithTimestamp:timestamp | 
					
						
							|  |  |  |                                                                                             inThread:self.thread | 
					
						
							|  |  |  |                                                                                             authorId:authorId | 
					
						
							|  |  |  |                                                                                       sourceDeviceId:sourceDeviceId | 
					
						
							|  |  |  |                                                                                          messageBody:@"foo" | 
					
						
							|  |  |  |                                                                                        attachmentIds:@[] | 
					
						
							|  |  |  |                                                                                     expiresInSeconds:0 | 
					
						
							|  |  |  |                                                                                        quotedMessage:nil | 
					
						
							|  |  |  |                                                                                         contactShare:nil | 
					
						
							|  |  |  |                                                                                          linkPreview:nil | 
					
						
							|  |  |  |                                                                                      serverTimestamp:nil | 
					
						
							|  |  |  |                                                                                      wasReceivedByUD:NO]; | 
					
						
							|  |  |  |     [incomingMessage save]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - (void)testExistingMessages | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     uint64_t timestamp = 1234; | 
					
						
							|  |  |  |     __block BOOL result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [self readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { | 
					
						
							|  |  |  |         result = [self.finder existsMessageWithTimestamp:timestamp | 
					
						
							|  |  |  |                                                 sourceId:self.sourceId | 
					
						
							|  |  |  |                                           sourceDeviceId:OWSDevicePrimaryDeviceId | 
					
						
							|  |  |  |                                              transaction:transaction]; | 
					
						
							|  |  |  |     }]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Sanity check. | 
					
						
							|  |  |  |     XCTAssertFalse(result); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Different timestamp | 
					
						
							|  |  |  |     [self createIncomingMessageWithTimestamp:timestamp + 1 | 
					
						
							|  |  |  |                                     authorId:self.sourceId | 
					
						
							|  |  |  |                               sourceDeviceId:OWSDevicePrimaryDeviceId]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [self readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { | 
					
						
							|  |  |  |         result = [self.finder existsMessageWithTimestamp:timestamp | 
					
						
							|  |  |  |                                                 sourceId:self.sourceId | 
					
						
							|  |  |  |                                           sourceDeviceId:OWSDevicePrimaryDeviceId | 
					
						
							|  |  |  |                                              transaction:transaction]; | 
					
						
							|  |  |  |     }]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     XCTAssertFalse(result); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Different authorId | 
					
						
							|  |  |  |     [self createIncomingMessageWithTimestamp:timestamp | 
					
						
							|  |  |  |                                     authorId:@"some-other-author-id" | 
					
						
							|  |  |  |                               sourceDeviceId:OWSDevicePrimaryDeviceId]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [self readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { | 
					
						
							|  |  |  |         result = [self.finder existsMessageWithTimestamp:timestamp | 
					
						
							|  |  |  |                                                 sourceId:self.sourceId | 
					
						
							|  |  |  |                                           sourceDeviceId:OWSDevicePrimaryDeviceId | 
					
						
							|  |  |  |                                              transaction:transaction]; | 
					
						
							|  |  |  |     }]; | 
					
						
							|  |  |  |     XCTAssertFalse(result); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Different device | 
					
						
							|  |  |  |     [self createIncomingMessageWithTimestamp:timestamp | 
					
						
							|  |  |  |                                     authorId:self.sourceId | 
					
						
							|  |  |  |                               sourceDeviceId:OWSDevicePrimaryDeviceId + 1]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [self readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { | 
					
						
							|  |  |  |         result = [self.finder existsMessageWithTimestamp:timestamp | 
					
						
							|  |  |  |                                                 sourceId:self.sourceId | 
					
						
							|  |  |  |                                           sourceDeviceId:OWSDevicePrimaryDeviceId | 
					
						
							|  |  |  |                                              transaction:transaction]; | 
					
						
							|  |  |  |     }]; | 
					
						
							|  |  |  |     XCTAssertFalse(result); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // The real deal... | 
					
						
							|  |  |  |     [self createIncomingMessageWithTimestamp:timestamp authorId:self.sourceId sourceDeviceId:OWSDevicePrimaryDeviceId]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [self readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { | 
					
						
							|  |  |  |         result = [self.finder existsMessageWithTimestamp:timestamp | 
					
						
							|  |  |  |                                                 sourceId:self.sourceId | 
					
						
							|  |  |  |                                           sourceDeviceId:OWSDevicePrimaryDeviceId | 
					
						
							|  |  |  |                                              transaction:transaction]; | 
					
						
							|  |  |  |     }]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     XCTAssertTrue(result); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NS_ASSUME_NONNULL_END |