TwitterNetworkLayerTests/TNLAutoDependencyTest.m (101 lines of code) (raw):

// // TNLAutoDependencyTest.m // TwitterNetworkLayer // // Created on 9/23/16. // Copyright © 2020 Twitter. All rights reserved. // #import <XCTest/XCTest.h> #import "TNLGlobalConfiguration.h" #import "TNLHTTPRequest.h" #import "TNLPseudoURLProtocol.h" #import "TNLRequestOperationCancelSource.h" #import "TNLRequestOperationQueue.h" #define SLEEP_LOOP(sleep) [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:(sleep)]] @interface TNLAutoDependencyTest : XCTestCase @end @implementation TNLAutoDependencyTest - (void)tearDown { [TNLPseudoURLProtocol unregisterAllEndpoints]; [TNLGlobalConfiguration sharedInstance].operationAutomaticDependencyPriorityThreshold = (TNLPriority)NSIntegerMax; [super tearDown]; } - (void)_run:(TNLRequestOperationQueue *)queue slowOp:(TNLRequestOperation *)slowOp fastOp1:(TNLRequestOperation *)fastOp1 fastOp2:(TNLRequestOperation *)fastOp2 cancelMidway:(BOOL)cancelMidway { [queue enqueueRequestOperation:slowOp]; SLEEP_LOOP(0.25); [queue enqueueRequestOperation:fastOp1]; SLEEP_LOOP(0.25); [queue enqueueRequestOperation:fastOp2]; if (cancelMidway) { SLEEP_LOOP(0.25); [slowOp cancelWithSource:@"Cancel"]; } [slowOp waitUntilFinishedWithoutBlockingRunLoop]; [fastOp1 waitUntilFinishedWithoutBlockingRunLoop]; [fastOp2 waitUntilFinishedWithoutBlockingRunLoop]; } - (void)testAutoDependency { // Prep TNLHTTPRequest *slowRequest = [TNLHTTPRequest GETRequestWithURL:[NSURL URLWithString:@"http://www.dummy.com/slow"] HTTPHeaderFields:nil]; TNLHTTPRequest *fastRequest = [TNLHTTPRequest GETRequestWithURL:[NSURL URLWithString:@"http://www.dummy.com/fast"] HTTPHeaderFields:nil]; NSHTTPURLResponse *slowResponse = [[NSHTTPURLResponse alloc] initWithURL:slowRequest.URL statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:nil]; NSHTTPURLResponse *fastResponse = [[NSHTTPURLResponse alloc] initWithURL:slowRequest.URL statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:nil]; NSData *slowData = [@"{response:\"slow\"}" dataUsingEncoding:NSUTF8StringEncoding]; NSData *fastData = [@"{response:\"fast\"}" dataUsingEncoding:NSUTF8StringEncoding]; TNLPseudoURLResponseConfig *slowConfig = [[TNLPseudoURLResponseConfig alloc] init]; slowConfig.delay = 1750 /*ms*/; TNLPseudoURLResponseConfig *fastConfig = nil; [TNLPseudoURLProtocol registerURLResponse:slowResponse body:slowData config:slowConfig withEndpoint:slowRequest.URL]; [TNLPseudoURLProtocol registerURLResponse:fastResponse body:fastData config:fastConfig withEndpoint:fastRequest.URL]; TNLMutableRequestConfiguration *requestConfig = [TNLMutableRequestConfiguration defaultConfiguration]; requestConfig.protocolOptions = TNLRequestProtocolOptionPseudo; TNLRequestOperationQueue *queue = [TNLRequestOperationQueue defaultOperationQueue]; NSMutableArray<TNLRequestOperation *> *completionOrder = [[NSMutableArray alloc] init]; TNLRequestDidCompleteBlock completeBlock = ^(TNLRequestOperation *op, TNLResponse *response) { [completionOrder addObject:op]; }; TNLRequestOperation *slowOp = nil; TNLRequestOperation *fastOp1 = nil; TNLRequestOperation *fastOp2 = nil; #define RESET_TEST() \ do { \ [completionOrder removeAllObjects]; \ slowOp = [TNLRequestOperation operationWithRequest:slowRequest configuration:requestConfig completion:completeBlock]; \ slowOp.priority = TNLPriorityVeryHigh; \ fastOp1 = [TNLRequestOperation operationWithRequest:fastRequest configuration:requestConfig completion:completeBlock]; \ fastOp2 = [TNLRequestOperation operationWithRequest:fastRequest configuration:requestConfig completion:completeBlock]; \ } while (0) // Test No Auto Dependency RESET_TEST(); [TNLGlobalConfiguration sharedInstance].operationAutomaticDependencyPriorityThreshold = (TNLPriority)NSIntegerMax; [self _run:queue slowOp:slowOp fastOp1:fastOp1 fastOp2:fastOp2 cancelMidway:NO]; XCTAssertEqual(completionOrder.count, (NSUInteger)3); XCTAssertEqualObjects([completionOrder objectAtIndex:2], slowOp, @"%@", completionOrder); // Test With Auto Dependency RESET_TEST(); [TNLGlobalConfiguration sharedInstance].operationAutomaticDependencyPriorityThreshold = TNLPriorityHigh; [self _run:queue slowOp:slowOp fastOp1:fastOp1 fastOp2:fastOp2 cancelMidway:NO]; XCTAssertEqual(completionOrder.count, (NSUInteger)3); XCTAssertEqualObjects([completionOrder objectAtIndex:0], slowOp, @"%@", completionOrder); // Test With Auto Dependency (Cancel) RESET_TEST(); [TNLGlobalConfiguration sharedInstance].operationAutomaticDependencyPriorityThreshold = TNLPriorityHigh; [self _run:queue slowOp:slowOp fastOp1:fastOp1 fastOp2:fastOp2 cancelMidway:YES]; XCTAssertEqual(completionOrder.count, (NSUInteger)3); XCTAssertEqualObjects([completionOrder objectAtIndex:0], slowOp, @"%@", completionOrder); } @end