mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			172 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Matlab
		
	
		
		
			
		
	
	
			172 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Matlab
		
	
| 
											9 years ago
										 | //  Created by Michael Kirk on 9/23/16. | ||
|  | //  Copyright © 2016 Open Whisper Systems. All rights reserved. | ||
|  | 
 | ||
|  | #import <XCTest/XCTest.h> | ||
|  | 
 | ||
|  | #import "ContactsUpdater.h" | ||
|  | #import "OWSSignalServiceProtos.pb.h" | ||
|  | #import "TSMessagesManager.h" | ||
|  | #import "TSNetworkManager.h" | ||
|  | #import "TSStorageManager.h" | ||
|  | #import "objc/runtime.h" | ||
|  | 
 | ||
|  | @interface TSMessagesManagerTest : XCTestCase | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | @interface TSMessagesManager (Testing) | ||
|  | 
 | ||
|  | // private method we are testing | ||
|  | - (void)handleIncomingEnvelope:(OWSSignalServiceProtosEnvelope *)messageEnvelope | ||
|  |                withSyncMessage:(OWSSignalServiceProtosSyncMessage *)syncMessage; | ||
|  | 
 | ||
|  | // private method we are stubbing via swizzle. | ||
|  | - (BOOL)uploadDataWithProgress:(NSData *)cipherText location:(NSString *)location attachmentID:(NSString *)attachmentID; | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | @implementation TSMessagesManager (Testing) | ||
|  | 
 | ||
|  | + (void)swapOriginalSelector:(SEL)originalSelector replacement:(SEL)replacementSelector | ||
|  | { | ||
|  |     Class class = [self class]; | ||
|  |     Method originalMethod = class_getInstanceMethod(class, originalSelector); | ||
|  |     Method replacementMethod = class_getInstanceMethod(class, replacementSelector); | ||
|  | 
 | ||
|  |     // When swizzling a class method, use the following: | ||
|  |     // Class class = object_getClass((id)self); | ||
|  |     // ... | ||
|  |     // Method originalMethod = class_getClassMethod(class, originalSelector); | ||
|  |     // Method swizzledMethod = class_getClassMethod(class, swizzledSelector); | ||
|  | 
 | ||
|  |     BOOL didAddMethod = class_addMethod(class, | ||
|  |         originalSelector, | ||
|  |         method_getImplementation(replacementMethod), | ||
|  |         method_getTypeEncoding(replacementMethod)); | ||
|  | 
 | ||
|  |     if (didAddMethod) { | ||
|  |         class_replaceMethod(class, | ||
|  |             replacementSelector, | ||
|  |             method_getImplementation(originalMethod), | ||
|  |             method_getTypeEncoding(originalMethod)); | ||
|  |     } else { | ||
|  |         method_exchangeImplementations(originalMethod, replacementMethod); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | + (void)load | ||
|  | { | ||
|  |     static dispatch_once_t onceToken; | ||
|  |     dispatch_once(&onceToken, ^{ | ||
|  |         [self swapOriginalSelector:@selector(uploadDataWithProgress:location:attachmentID:) | ||
|  |                        replacement:@selector(stubbedUploadDataWithProgress:location:attachmentID:)]; | ||
|  | 
 | ||
|  |         [self swapOriginalSelector:@selector(deviceMessages:forRecipient:inThread:) | ||
|  |                        replacement:@selector(stubbedDeviceMessages:forRecipient:inThread:)]; | ||
|  |     }); | ||
|  | } | ||
|  | 
 | ||
|  | #pragma mark - Method Swizzling | ||
|  | 
 | ||
|  | - (BOOL)stubbedUploadDataWithProgress:(NSData *)cipherText | ||
|  |                              location:(NSString *)location | ||
|  |                          attachmentID:(NSString *)attachmentID | ||
|  | { | ||
|  |     NSLog(@"Faking successful upload."); | ||
|  |     return YES; | ||
|  | } | ||
|  | 
 | ||
|  | - (NSArray<NSDictionary *> *)stubbedDeviceMessages:(TSOutgoingMessage *)message | ||
|  |                                       forRecipient:(SignalRecipient *)recipient | ||
|  |                                           inThread:(TSThread *)thread | ||
|  | { | ||
|  |     // Upon originally provisioning, we won't have a device to send to. | ||
|  |     NSLog(@"Stubbed device message to return empty list."); | ||
|  |     return @[]; | ||
|  | } | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | 
 | ||
|  | @interface OWSTSMessagesManagerTestNetworkManager : TSNetworkManager | ||
|  | 
 | ||
|  | - (instancetype)initWithExpectation:(XCTestExpectation *)messageWasSubmitted; | ||
|  | 
 | ||
|  | @property XCTestExpectation *messageWasSubmitted; | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | @implementation OWSTSMessagesManagerTestNetworkManager | ||
|  | 
 | ||
|  | - (instancetype)initWithExpectation:(XCTestExpectation *)messageWasSubmitted | ||
|  | { | ||
|  |     _messageWasSubmitted = messageWasSubmitted; | ||
|  | 
 | ||
|  |     return self; | ||
|  | } | ||
|  | 
 | ||
|  | - (void)makeRequest:(TSRequest *)request | ||
|  |             success:(void (^)(NSURLSessionDataTask *task, id responseObject))success | ||
|  |             failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure | ||
|  | { | ||
|  |     if ([request isKindOfClass:[TSAllocAttachmentRequest class]]) { | ||
|  |         NSDictionary *fakeResponse = @{ @"id" : @(1234), @"location" : @"fake-location" }; | ||
|  |         success(nil, fakeResponse); | ||
|  |     } else if ([request isKindOfClass:[TSSubmitMessageRequest class]]) { | ||
|  |         [self.messageWasSubmitted fulfill]; | ||
|  |     } else { | ||
|  |         NSLog(@"Ignoring unhandled request: %@", request); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | @interface OWSFakeContactsUpdater : ContactsUpdater | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | @implementation OWSFakeContactsUpdater | ||
|  | 
 | ||
|  | - (void)synchronousLookup:(NSString *)identifier | ||
|  |                   success:(void (^)(SignalRecipient *))success | ||
|  |                   failure:(void (^)(NSError *error))failure | ||
|  | { | ||
|  |     NSLog(@"Fake contact lookup."); | ||
|  |     SignalRecipient *fakeRecipient = | ||
|  |         [[SignalRecipient alloc] initWithTextSecureIdentifier:@"fake-recipient-id" relay:nil supportsVoice:YES]; | ||
|  |     success(fakeRecipient); | ||
|  | } | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | @implementation TSMessagesManagerTest | ||
|  | 
 | ||
|  | - (void)testIncomingSyncContactMessage | ||
|  | { | ||
|  |     OWSFakeContactsUpdater *fakeContactsUpdater = [OWSFakeContactsUpdater new]; | ||
|  |     XCTestExpectation *messageWasSubmitted = [self expectationWithDescription:@"message was submitted"]; | ||
|  |     OWSTSMessagesManagerTestNetworkManager *fakeNetworkManager = | ||
|  |         [[OWSTSMessagesManagerTestNetworkManager alloc] initWithExpectation:messageWasSubmitted]; | ||
|  |     TSMessagesManager *messagesManager = | ||
|  |         [[TSMessagesManager alloc] initWithNetworkManager:fakeNetworkManager | ||
|  |                                              dbConnection:[TSStorageManager sharedManager].newDatabaseConnection | ||
|  |                                           contactsUpdater:fakeContactsUpdater]; | ||
|  | 
 | ||
|  |     OWSSignalServiceProtosEnvelopeBuilder *envelopeBuilder = [OWSSignalServiceProtosEnvelopeBuilder new]; | ||
|  |     OWSSignalServiceProtosSyncMessageBuilder *messageBuilder = [OWSSignalServiceProtosSyncMessageBuilder new]; | ||
|  |     OWSSignalServiceProtosSyncMessageRequestBuilder *requestBuilder = | ||
|  |         [OWSSignalServiceProtosSyncMessageRequestBuilder new]; | ||
|  |     [requestBuilder setType:OWSSignalServiceProtosSyncMessageRequestTypeGroups]; | ||
|  |     [messageBuilder setRequest:[requestBuilder build]]; | ||
|  | 
 | ||
|  |     [messagesManager handleIncomingEnvelope:[envelopeBuilder build] withSyncMessage:[messageBuilder build]]; | ||
|  | 
 | ||
|  |     [self waitForExpectationsWithTimeout:5 | ||
|  |                                  handler:^(NSError *error) { | ||
|  |                                      NSLog(@"No message submitted."); | ||
|  |                                  }]; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | @end |