TwitterNetworkLayerTests/TNLRequestRetryPolicyConfigurationTest.m (99 lines of code) (raw):
//
// TNLRequestRetryPolicyConfigurationTest.m
// TwitterNetworkLayer
//
// Created on 11/14/14.
// Copyright © 2020 Twitter. All rights reserved.
//
#import "TNLHTTPRequest.h"
#import "TNLRequestConfiguration_Project.h"
#import "TNLRequestOperation.h"
#import "TNLRequestOperation_Project.h"
#import "TNLRequestRetryPolicyConfiguration.h"
@import XCTest;
@interface TNLRequestRetryPolicyConfigurationTest : XCTestCase
@end
@interface TNLTestRetryPolicyConfigurationRequestOperation : TNLRequestOperation
- (void)setStatusCodeOverride:(TNLHTTPStatusCode)statusCode;
- (void)setMethodOverride:(TNLHTTPMethod)methodOverride;
@end
@implementation TNLRequestRetryPolicyConfigurationTest
- (void)testRetryPolicyConfiguration
{
TNLMutableRequestRetryPolicyConfiguration *testConfig = [[TNLMutableRequestRetryPolicyConfiguration defaultConfiguration] mutableCopy];
TNLTestRetryPolicyConfigurationRequestOperation *testRequest = [[TNLTestRetryPolicyConfigurationRequestOperation alloc] initWithRequest:[[TNLMutableHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.dummy.com"]] responseClass:Nil configuration:nil delegate:nil];
// GET, 503, no URL errors
testRequest.statusCodeOverride = TNLHTTPStatusCodeAccepted; // 200
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = TNLHTTPStatusCodeEnhanceYourCalm; // 420
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = TNLHTTPStatusCodeServiceUnavailable; // 503
XCTAssertTrue([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.methodOverride = TNLHTTPMethodPOST;
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.methodOverride = TNLHTTPMethodDELETE;
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.methodOverride = TNLHTTPMethodGET;
testRequest.statusCodeOverride = TNLHTTPStatusCodeBadGateway; // 502
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = TNLHTTPStatusCodeNotImplemented; // 501
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = TNLHTTPStatusCodeInternalServerError; // 500
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = 0;
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
[testConfig setMethodsThatCanBeRetried:@[@"GET", @"POST"]];
[testConfig setStatusCodesThatCanBeRetried:@[@500, @502, @503]];
// GET & POST, 500 & 502 & 503
testRequest.statusCodeOverride = TNLHTTPStatusCodeAccepted; // 200
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = TNLHTTPStatusCodeEnhanceYourCalm; // 420
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = TNLHTTPStatusCodeServiceUnavailable; // 503
XCTAssertTrue([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.methodOverride = TNLHTTPMethodPOST;
XCTAssertTrue([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.methodOverride = TNLHTTPMethodDELETE;
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.methodOverride = TNLHTTPMethodGET;
testRequest.statusCodeOverride = TNLHTTPStatusCodeBadGateway; // 502
XCTAssertTrue([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = TNLHTTPStatusCodeNotImplemented; // 501
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = TNLHTTPStatusCodeInternalServerError; // 500
XCTAssertTrue([testConfig requestCanBeRetriedForResponse:testRequest.response]);
testRequest.statusCodeOverride = 0;
XCTAssertFalse([testConfig requestCanBeRetriedForResponse:testRequest.response]);
}
@end
@implementation TNLTestRetryPolicyConfigurationRequestOperation
{
TNLMutableHTTPRequest *_overrideRequest;
TNLHTTPStatusCode _overrideStatusCode;
}
- (instancetype)initWithRequest:(id<TNLRequest>)request responseClass:(nullable Class)responseClass configuration:(nullable TNLRequestConfiguration *)config delegate:(nullable id<TNLRequestDelegate>)delegate
{
if (self = [super initWithRequest:request responseClass:Nil configuration:config delegate:delegate]) {
_overrideRequest = [TNLMutableHTTPRequest HTTPRequestWithRequest:request];
}
return self;
}
- (BOOL)isFinished
{
return YES;
}
- (id<TNLRequest>)originalRequest
{
return _overrideRequest;
}
- (id<TNLRequest>)hydratedRequest
{
return _overrideRequest;
}
- (void)setStatusCodeOverride:(TNLHTTPStatusCode)statusCode
{
_overrideStatusCode = statusCode;
}
- (void)setMethodOverride:(TNLHTTPMethod)methodOverride
{
_overrideRequest.HTTPMethodValue = methodOverride;
}
- (TNLResponse *)response
{
// generate a fake response
NSHTTPURLResponse *httpResponse = [[NSHTTPURLResponse alloc] initWithURL:self.hydratedRequest.URL statusCode:_overrideStatusCode HTTPVersion:@"HTTP/1.1" headerFields:@{}];
TNLResponseInfo *info = [[TNLResponseInfo alloc] initWithFinalURLRequest:TNLRequestToNSURLRequest(self.hydratedRequest, nil /*config*/, NULL /*error*/) URLResponse:httpResponse source:TNLResponseSourceNetworkRequest data:[NSData data] temporarySavedFile:nil];
TNLResponse *response = [self.responseClass responseWithRequest:self.hydratedRequest operationError:nil info:info metrics:[[TNLResponseMetrics alloc] init]];
return response;
}
@end