TwitterNetworkLayerTests/TNLRequestConfigurationTest.m (132 lines of code) (raw):
//
// TNLRequestConfigurationTest.m
// TwitterNetworkLayer
//
// Created on 11/11/14.
// Copyright © 2020 Twitter. All rights reserved.
//
#import "NSHTTPCookieStorage+TNLAdditions.h"
#import "NSURLCache+TNLAdditions.h"
#import "NSURLCredentialStorage+TNLAdditions.h"
#import "NSURLSessionConfiguration+TNLAdditions.h"
#import "TNL_Project.h"
#import "TNLGlobalConfiguration.h"
#import "TNLRequestConfiguration_Project.h"
@import XCTest;
@interface TNLRequestConfigurationTest : XCTestCase
@end
@implementation TNLRequestConfigurationTest
- (void)runTestParamsEqualBetweenOriginal:(TNLParameterCollection *)originalParams roundTrip:(TNLParameterCollection *)roundTripParams
{
for (NSString *key in originalParams) {
id<NSObject> val1 = originalParams[key];
NSString *val2 = roundTripParams[key];
if ([val1 isKindOfClass:[NSNumber class]]) {
XCTAssertEqual([(NSNumber *)val1 doubleValue], [val2 doubleValue]);
} else {
XCTAssertEqualObjects(val1, val2);
}
}
}
- (void)testConfigRoundTrips
{
const BOOL connectivityOptionsDisabled = ![NSURLSessionConfiguration tnl_URLSessionCanUseWaitsForConnectivity];
TNLMutableRequestConfiguration *config = [TNLMutableRequestConfiguration defaultConfiguration];
TNLMutableParameterCollection *params;
TNLParameterCollection *roundTripParams;
TNLMutableRequestConfiguration *roundTripConfig;
NSString *paramString;
NSString *testParamString;
params = TNLMutableParametersFromRequestConfiguration(config, nil, nil, nil);
params[@"double"] = @(3.14159265359);
paramString = params.stableURLEncodedStringValue;
roundTripParams = [[TNLParameterCollection alloc] initWithURLEncodedString:paramString options:0];
roundTripConfig = (id)[TNLRequestConfiguration configurationFromParameters:params executionMode:config.executionMode version:[TNLGlobalConfiguration version]];
#if TARGET_OS_IPHONE // == IOS + WATCH + TV
testParamString = @"aca=1&atmpTO=60&ckiplcy=1&cnvty=0&dfrI=0&dis=0&double=3.14159265359&idlTO=30&nst=0&opTO=180&ptcls=0&rcp=0&rdcm=1&rdp=1&setcki=0&ssle=1&xbim=0";
#else
testParamString = @"aca=1&atmpTO=60&ckiplcy=1&cnvty=0&dfrI=0&dis=0&double=3.14159265359&idlTO=30&nst=0&opTO=180&ptcls=0&rcp=0&rdcm=1&rdp=1&setcki=0&ssle=0&xbim=0";
#endif
XCTAssertEqualObjects(paramString, testParamString);
XCTAssertEqual(params.count, roundTripParams.count);
[self runTestParamsEqualBetweenOriginal:params roundTrip:roundTripParams];
XCTAssertEqualObjects(roundTripConfig, config);
#if TARGET_OS_IOS
if (tnl_available_ios_11) {
config.multipathServiceType = NSURLSessionMultipathServiceTypeInteractive;
testParamString = @"aca=1&atmpTO=60&ckiplcy=1&cnvty=0&dfrI=0&dis=0&idlTO=30&mptcp=2&nst=0&opTO=180&ptcls=0&rcp=0&rdcm=1&rdp=1&setcki=0&ssle=1&xbim=0";
params = TNLMutableParametersFromRequestConfiguration(config, nil, nil, nil);
paramString = params.stableURLEncodedStringValue;
roundTripParams = [[TNLParameterCollection alloc] initWithURLEncodedString:paramString options:0];
roundTripConfig = (id)[TNLRequestConfiguration configurationFromParameters:params executionMode:config.executionMode version:[TNLGlobalConfiguration version]];
XCTAssertEqualObjects(paramString, testParamString);
XCTAssertEqual(params.count, roundTripParams.count);
[self runTestParamsEqualBetweenOriginal:params roundTrip:roundTripParams];
XCTAssertEqualObjects(roundTripConfig, config);
config.multipathServiceType = 0;
}
#endif // TARGET_OS_IOS
config.contributeToExecutingNetworkConnectionsCount = NO;
config.executionMode = TNLRequestExecutionModeBackground;
config.redirectPolicy = TNLRequestRedirectPolicyDontRedirect;
config.responseDataConsumptionMode = TNLResponseDataConsumptionModeSaveToDisk;
config.protocolOptions = TNLRequestProtocolOptionPseudo;
config.connectivityOptions = TNLRequestConnectivityOptionWaitForConnectivity | TNLRequestConnectivityOptionInvalidateAttemptTimeoutWhenWaitForConnectivityTriggered;
config.idleTimeout = 180.1;
config.attemptTimeout = 360.1;
config.operationTimeout = 720.1;
config.deferrableInterval = 30.1;
config.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
config.networkServiceType = NSURLNetworkServiceTypeBackground;
config.allowsCellularAccess = NO;
config.discretionary = YES;
config.sharedContainerIdentifier = @"container.id";
config.shouldLaunchAppForBackgroundEvents = NO;
config.shouldSetCookies = NO;
config.cookieAcceptPolicy = NSHTTPCookieAcceptPolicyNever;
config.shouldUseExtendedBackgroundIdleMode = YES;
XCTAssertNotNil(config.sharedContainerIdentifier);
XCTAssertEqualObjects(config, [config copy]);
params = TNLMutableParametersFromRequestConfiguration(config, nil, nil, nil);
paramString = params.stableURLEncodedStringValue;
roundTripParams = [[TNLParameterCollection alloc] initWithURLEncodedString:paramString options:0];
roundTripConfig = (id)[TNLRequestConfiguration configurationFromParameters:params executionMode:config.executionMode version:[TNLGlobalConfiguration version]];
XCTAssertNotEqual(roundTripConfig.contributeToExecutingNetworkConnectionsCount, config.contributeToExecutingNetworkConnectionsCount);
roundTripConfig.contributeToExecutingNetworkConnectionsCount = config.contributeToExecutingNetworkConnectionsCount;
testParamString = [NSString stringWithFormat:@"aca=0&atmpTO=360.1&ckiplcy=1&cnvty=%@&dfrI=30.1&dis=1&idlTO=180.1&nst=3&opTO=720.1&ptcls=2&rcp=2&rdcm=2&rdp=0&%@setcki=0&ssle=0&xbim=1", (connectivityOptionsDisabled) ? @0 : @5, config.sharedContainerIdentifier ? @"scid=container.id&" : @""];
XCTAssertEqualObjects(paramString, testParamString);
[self runTestParamsEqualBetweenOriginal:params roundTrip:roundTripParams];
XCTAssertEqualObjects(roundTripConfig, config);
// Re-test with shared URL cache and credential storage
config.URLCache = [NSURLCache sharedURLCache];
config.URLCredentialStorage = [NSURLCredentialStorage sharedCredentialStorage];
config.cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
params = TNLMutableParametersFromRequestConfiguration(config, nil, nil, nil);
paramString = params.stableURLEncodedStringValue;
roundTripParams = [[TNLParameterCollection alloc] initWithURLEncodedString:paramString];
roundTripConfig = (id)[TNLRequestConfiguration configurationFromParameters:params executionMode:config.executionMode version:[TNLGlobalConfiguration version]];
XCTAssertNotEqual(roundTripConfig.contributeToExecutingNetworkConnectionsCount, config.contributeToExecutingNetworkConnectionsCount);
XCTAssertNil(roundTripConfig.URLCache);
XCTAssertNil(roundTripConfig.URLCredentialStorage);
roundTripConfig.contributeToExecutingNetworkConnectionsCount = config.contributeToExecutingNetworkConnectionsCount;
roundTripConfig.URLCredentialStorage = config.URLCredentialStorage;
roundTripConfig.URLCache = config.URLCache;
roundTripConfig.cookieStorage = config.cookieStorage;
testParamString = [NSString stringWithFormat:@"aca=0&atmpTO=360.1&ckiplcy=1&ckisto=NSHTTPCookieStorage_%p&cnvty=%@&crdsto=NSURLCredentialStorage_%p&dfrI=30.1&dis=1&idlTO=180.1&nst=3&opTO=720.1&ptcls=2&rcp=2&rdcm=2&rdp=0&%@setcki=0&ssle=0&urlcch=NSURLCache_%p&xbim=1", config.cookieStorage, (connectivityOptionsDisabled) ? @0 : @5, config.URLCredentialStorage, config.sharedContainerIdentifier ? @"scid=container.id&" : @"", config.URLCache];
XCTAssertEqualObjects(paramString, testParamString);
[self runTestParamsEqualBetweenOriginal:params roundTrip:roundTripParams];
XCTAssertEqualObjects(roundTripConfig, config);
// Re-test with proxies to shared URL cache and credential storage
config.URLCache = [NSURLCache tnl_sharedURLCacheProxy];
config.URLCredentialStorage = [NSURLCredentialStorage tnl_sharedCredentialStorageProxy];
config.cookieStorage = [NSHTTPCookieStorage tnl_sharedHTTPCookieStorageProxy];
params = TNLMutableParametersFromRequestConfiguration(config, nil, nil, nil);
paramString = params.stableURLEncodedStringValue;
roundTripParams = [[TNLParameterCollection alloc] initWithURLEncodedString:paramString options:0];
roundTripConfig = (id)[TNLRequestConfiguration configurationFromParameters:params executionMode:config.executionMode version:[TNLGlobalConfiguration version]];
XCTAssertNotEqual(roundTripConfig.contributeToExecutingNetworkConnectionsCount, config.contributeToExecutingNetworkConnectionsCount);
XCTAssertNil(roundTripConfig.URLCache);
XCTAssertNil(roundTripConfig.URLCredentialStorage);
roundTripConfig.contributeToExecutingNetworkConnectionsCount = config.contributeToExecutingNetworkConnectionsCount;
roundTripConfig.URLCredentialStorage = config.URLCredentialStorage;
roundTripConfig.URLCache = config.URLCache;
roundTripConfig.cookieStorage = config.cookieStorage;
testParamString = [NSString stringWithFormat:@"aca=0&atmpTO=360.1&ckiplcy=1&ckisto=NSHTTPCookieStorage_%p&cnvty=%@&crdsto=NSURLCredentialStorage_%p&dfrI=30.1&dis=1&idlTO=180.1&nst=3&opTO=720.1&ptcls=2&rcp=2&rdcm=2&rdp=0&%@setcki=0&ssle=0&urlcch=NSURLCache_%p&xbim=1", config.cookieStorage, (connectivityOptionsDisabled) ? @0 : @5, config.URLCredentialStorage, config.sharedContainerIdentifier ? @"scid=container.id&" : @"", config.URLCache];
XCTAssertNotEqualObjects(paramString, testParamString);
testParamString = [NSString stringWithFormat:@"aca=0&atmpTO=360.1&ckiplcy=1&ckisto=NSHTTPCookieStorage_%p&cnvty=%@&crdsto=NSURLCredentialStorage_%p&dfrI=30.1&dis=1&idlTO=180.1&nst=3&opTO=720.1&ptcls=2&rcp=2&rdcm=2&rdp=0&%@setcki=0&ssle=0&urlcch=NSURLCache_%p&xbim=1", TNLUnwrappedCookieStorage(config.cookieStorage), (connectivityOptionsDisabled) ? @0 : @5, TNLUnwrappedURLCredentialStorage(config.URLCredentialStorage), config.sharedContainerIdentifier ? @"scid=container.id&" : @"", TNLUnwrappedURLCache(config.URLCache)];
XCTAssertEqualObjects(paramString, testParamString);
[self runTestParamsEqualBetweenOriginal:params roundTrip:roundTripParams];
XCTAssertEqualObjects(roundTripConfig, config);
}
@end