Browse Source

Added tests for RetryResult, Adapter, Retrier, and Interceptor

Christian Noon 7 years ago
parent
commit
1d01bb5acf

+ 36 - 36
Alamofire.xcodeproj/project.pbxproj

@@ -137,14 +137,20 @@
 		31F9683C20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */; };
 		31F9683D20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */; };
 		31F9683E20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */; };
-		4C0CB636220CA74E00604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB635220CA74D00604EDC /* URLRequest+Alamofire.swift */; };
-		4C0CB637220CA74E00604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB635220CA74D00604EDC /* URLRequest+Alamofire.swift */; };
-		4C0CB638220CA74E00604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB635220CA74D00604EDC /* URLRequest+Alamofire.swift */; };
-		4C0CB639220CA74E00604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB635220CA74D00604EDC /* URLRequest+Alamofire.swift */; };
-		4C0CB63B220CA76300604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB63A220CA76300604EDC /* RedirectHandler.swift */; };
-		4C0CB63C220CA76300604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB63A220CA76300604EDC /* RedirectHandler.swift */; };
-		4C0CB63D220CA76300604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB63A220CA76300604EDC /* RedirectHandler.swift */; };
-		4C0CB63E220CA76300604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB63A220CA76300604EDC /* RedirectHandler.swift */; };
+		4C0CB631220BC70300604EDC /* RequestInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */; };
+		4C0CB632220BC70300604EDC /* RequestInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */; };
+		4C0CB633220BC70300604EDC /* RequestInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */; };
+		4C0CB641220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; };
+		4C0CB642220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; };
+		4C0CB643220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; };
+		4C0CB644220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; };
+		4C0CB646220CA8A400604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; };
+		4C0CB647220CA8A400604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; };
+		4C0CB648220CA8A400604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; };
+		4C0CB649220CA8A400604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; };
+		4C0CB64B220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */; };
+		4C0CB64C220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */; };
+		4C0CB64D220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */; };
 		4C0E5BF81B673D3400816CCC /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0E5BF71B673D3400816CCC /* Result.swift */; };
 		4C0E5BF91B673D3400816CCC /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0E5BF71B673D3400816CCC /* Result.swift */; };
 		4C1DC8541B68908E00476DE3 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1DC8531B68908E00476DE3 /* AFError.swift */; };
@@ -309,12 +315,6 @@
 		4CFB030D1D7D2FA20056F249 /* utf8_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */; };
 		4CFB030E1D7D2FA20056F249 /* utf8_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */; };
 		4CFB030F1D7D2FA20056F249 /* utf8_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */; };
-		4CFD6B102201145500FFB5E3 /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B0F2201145500FFB5E3 /* RedirectHandlerTests.swift */; };
-		4CFD6B112201145500FFB5E3 /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B0F2201145500FFB5E3 /* RedirectHandlerTests.swift */; };
-		4CFD6B122201145500FFB5E3 /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B0F2201145500FFB5E3 /* RedirectHandlerTests.swift */; };
-		4CFD6B142201338E00FFB5E3 /* CachedResponseHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */; };
-		4CFD6B152201338E00FFB5E3 /* CachedResponseHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */; };
-		4CFD6B162201338E00FFB5E3 /* CachedResponseHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */; };
 		4DD67C241A5C58FB00ED2280 /* Alamofire.h in Headers */ = {isa = PBXBuildFile; fileRef = F8111E3819A95C8B0040E7D1 /* Alamofire.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		4DD67C251A5C590000ED2280 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Alamofire.swift */; };
 		8035DB621BAB492500466CB3 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8111E3319A95C8B0040E7D1 /* Alamofire.framework */; };
@@ -384,9 +384,10 @@
 		31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLSessionConfiguration+Alamofire.swift"; sourceTree = "<group>"; };
 		31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLoggingEventMonitor.swift; sourceTree = "<group>"; };
 		4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResponseSerializationTests.swift; sourceTree = "<group>"; };
-		4C0CB635220CA74D00604EDC /* URLRequest+Alamofire.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URLRequest+Alamofire.swift"; sourceTree = "<group>"; };
-		4C0CB63A220CA76300604EDC /* RedirectHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedirectHandler.swift; sourceTree = "<group>"; };
-		4C0E02681BF99A18004E7F18 /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-tvOS.plist"; path = "Source/Info-tvOS.plist"; sourceTree = SOURCE_ROOT; };
+		4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestInterceptorTests.swift; sourceTree = "<group>"; };
+		4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URLRequest+Alamofire.swift"; sourceTree = "<group>"; };
+		4C0CB645220CA8A400604EDC /* RedirectHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedirectHandler.swift; sourceTree = "<group>"; };
+		4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedirectHandlerTests.swift; sourceTree = "<group>"; };
 		4C0E5BF71B673D3400816CCC /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
 		4C1DC8531B68908E00476DE3 /* AFError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AFError.swift; sourceTree = "<group>"; };
 		4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultipartFormData.swift; sourceTree = "<group>"; };
@@ -448,7 +449,6 @@
 		4CFB02F21D7D2FA20056F249 /* empty_string.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = empty_string.txt; sourceTree = "<group>"; };
 		4CFB02F31D7D2FA20056F249 /* utf32_string.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = utf32_string.txt; sourceTree = "<group>"; };
 		4CFB02F41D7D2FA20056F249 /* utf8_string.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = utf8_string.txt; sourceTree = "<group>"; };
-		4CFD6B0F2201145500FFB5E3 /* RedirectHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedirectHandlerTests.swift; sourceTree = "<group>"; };
 		4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedResponseHandlerTests.swift; sourceTree = "<group>"; };
 		4DD67C0B1A5C55C900ED2280 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		B39E2F831C1A72F8002DA1A9 /* certDER.cer */ = {isa = PBXFileReference; lastKnownFileType = file; name = certDER.cer; path = selfSignedAndMalformedCerts/certDER.cer; sourceTree = "<group>"; };
@@ -558,7 +558,8 @@
 				3113D46A21878227001CCD21 /* HTTPHeadersTests.swift */,
 				4C3238E61B3604DB00FE04AE /* MultipartFormDataTests.swift */,
 				4C3D00571C66A8B900D1F709 /* NetworkReachabilityManagerTests.swift */,
-				4CFD6B0F2201145500FFB5E3 /* RedirectHandlerTests.swift */,
+				4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */,
+				4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */,
 				4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */,
 				4CBD217F220B48AE008F1C59 /* RetryPolicyTests.swift */,
 				4C33A1421B52089C00873DFF /* ServerTrustEvaluatorTests.swift */,
@@ -654,7 +655,7 @@
 			children = (
 				4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */,
 				319917B8209CE53A00103A19 /* OperationQueue+Alamofire.swift */,
-				4C0CB635220CA74D00604EDC /* URLRequest+Alamofire.swift */,
+				4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */,
 				31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */,
 			);
 			name = Extensions;
@@ -729,7 +730,7 @@
 				4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */,
 				311B198F20B0D3B40036823B /* MultipartUpload.swift */,
 				4C3D00531C66A63000D1F709 /* NetworkReachabilityManager.swift */,
-				4C0CB63A220CA76300604EDC /* RedirectHandler.swift */,
+				4C0CB645220CA8A400604EDC /* RedirectHandler.swift */,
 				4C256A0521EEB69000AD5D87 /* RequestInterceptor.swift */,
 				4CDE2C451AF89FF300BABAE5 /* ResponseSerialization.swift */,
 				4C256A1921F1449C00AD5D87 /* RetryPolicy.swift */,
@@ -889,7 +890,6 @@
 			isa = PBXGroup;
 			children = (
 				F8111E4119A95C8B0040E7D1 /* Info.plist */,
-				4C0E02681BF99A18004E7F18 /* Info-tvOS.plist */,
 			);
 			name = "Supporting Files";
 			sourceTree = "<group>";
@@ -1312,7 +1312,6 @@
 				4CF627081BA7CBF60011A099 /* AFError.swift in Sources */,
 				3191B5771F5F53A6003960A8 /* Protector.swift in Sources */,
 				3199179A209CDA7F00103A19 /* Response.swift in Sources */,
-				4C0CB638220CA74E00604EDC /* URLRequest+Alamofire.swift in Sources */,
 				31D83FD020D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */,
 				319917A7209CDAC400103A19 /* RequestTaskMap.swift in Sources */,
 				4CF627131BA7CBF60011A099 /* Validation.swift in Sources */,
@@ -1321,9 +1320,10 @@
 				319917BB209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */,
 				319917AC209CDCB000103A19 /* HTTPHeaders.swift in Sources */,
 				3172741A218BAEC90039FFCC /* HTTPMethod.swift in Sources */,
+				4C0CB648220CA8A400604EDC /* RedirectHandler.swift in Sources */,
 				4CF6270E1BA7CBF60011A099 /* MultipartFormData.swift in Sources */,
 				4CB9282B1C66BFBC00CE5F08 /* Notifications.swift in Sources */,
-				4C0CB63D220CA76300604EDC /* RedirectHandler.swift in Sources */,
+				4C0CB643220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */,
 				4CF6270F1BA7CBF60011A099 /* ResponseSerialization.swift in Sources */,
 				4C256A0821EEB69000AD5D87 /* RequestInterceptor.swift in Sources */,
 				4C43669D1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */,
@@ -1350,9 +1350,10 @@
 				3111CE9420A7EC32008315E2 /* ResponseSerializationTests.swift in Sources */,
 				3111CE8E20A7EBE7008315E2 /* MultipartFormDataTests.swift in Sources */,
 				311B199620B0ED990036823B /* UploadTests.swift in Sources */,
-				4CFD6B162201338E00FFB5E3 /* CachedResponseHandlerTests.swift in Sources */,
+				4C0CB633220BC70300604EDC /* RequestInterceptorTests.swift in Sources */,
 				3107EA3720A11AE200445260 /* AuthenticationTests.swift in Sources */,
 				31ED52EA1D73891C00199085 /* AFError+AlamofireTests.swift in Sources */,
+				4C0CB64D220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */,
 				3107EA3A20A11F9700445260 /* ResponseTests.swift in Sources */,
 				4CFB02921D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */,
 				4CF627141BA7CC240011A099 /* BaseTestCase.swift in Sources */,
@@ -1365,7 +1366,6 @@
 				317A6A7820B2208000A9FEC5 /* DownloadTests.swift in Sources */,
 				31F9683E20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */,
 				3113D46D21878227001CCD21 /* HTTPHeadersTests.swift in Sources */,
-				4CFD6B122201145500FFB5E3 /* RedirectHandlerTests.swift in Sources */,
 				31501E8A2196962A005829F2 /* ParameterEncoderTests.swift in Sources */,
 				3107EA4120A1267D00445260 /* SessionDelegateTests.swift in Sources */,
 				31C2B0EC20B271060089BA7C /* CacheTests.swift in Sources */,
@@ -1383,7 +1383,6 @@
 				3191B5761F5F53A6003960A8 /* Protector.swift in Sources */,
 				4CDE2C471AF89FF300BABAE5 /* ResponseSerialization.swift in Sources */,
 				31991799209CDA7F00103A19 /* Response.swift in Sources */,
-				4C0CB637220CA74E00604EDC /* URLRequest+Alamofire.swift in Sources */,
 				31D83FCF20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */,
 				319917A6209CDAC400103A19 /* RequestTaskMap.swift in Sources */,
 				4C1DC8551B68908E00476DE3 /* AFError.swift in Sources */,
@@ -1392,9 +1391,10 @@
 				319917BA209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */,
 				319917AB209CDCB000103A19 /* HTTPHeaders.swift in Sources */,
 				31727419218BAEC90039FFCC /* HTTPMethod.swift in Sources */,
+				4C0CB647220CA8A400604EDC /* RedirectHandler.swift in Sources */,
 				4CB9282A1C66BFBC00CE5F08 /* Notifications.swift in Sources */,
 				4DD67C251A5C590000ED2280 /* Alamofire.swift in Sources */,
-				4C0CB63C220CA76300604EDC /* RedirectHandler.swift in Sources */,
+				4C0CB642220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */,
 				4C23EB441B327C5B0090E0BC /* MultipartFormData.swift in Sources */,
 				4C256A0721EEB69000AD5D87 /* RequestInterceptor.swift in Sources */,
 				4C43669C1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */,
@@ -1420,7 +1420,6 @@
 				E4202FD01B667AA100C997FB /* ParameterEncoding.swift in Sources */,
 				3191B5781F5F53A6003960A8 /* Protector.swift in Sources */,
 				3199179B209CDA7F00103A19 /* Response.swift in Sources */,
-				4C0CB639220CA74E00604EDC /* URLRequest+Alamofire.swift in Sources */,
 				31D83FD120D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */,
 				319917A8209CDAC400103A19 /* RequestTaskMap.swift in Sources */,
 				4CEC605A1B745C9100E684F4 /* AFError.swift in Sources */,
@@ -1429,9 +1428,10 @@
 				319917BC209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */,
 				319917AD209CDCB000103A19 /* HTTPHeaders.swift in Sources */,
 				3172741B218BAEC90039FFCC /* HTTPMethod.swift in Sources */,
+				4C0CB649220CA8A400604EDC /* RedirectHandler.swift in Sources */,
 				E4202FD21B667AA100C997FB /* ResponseSerialization.swift in Sources */,
 				4CB9282C1C66BFBC00CE5F08 /* Notifications.swift in Sources */,
-				4C0CB63E220CA76300604EDC /* RedirectHandler.swift in Sources */,
+				4C0CB644220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */,
 				4CEC605B1B745C9100E684F4 /* Result.swift in Sources */,
 				4C256A0921EEB69000AD5D87 /* RequestInterceptor.swift in Sources */,
 				4C43669E1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */,
@@ -1457,7 +1457,6 @@
 				3191B5751F5F53A6003960A8 /* Protector.swift in Sources */,
 				4CDE2C461AF89FF300BABAE5 /* ResponseSerialization.swift in Sources */,
 				31991798209CDA7F00103A19 /* Response.swift in Sources */,
-				4C0CB636220CA74E00604EDC /* URLRequest+Alamofire.swift in Sources */,
 				31D83FCE20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */,
 				319917A5209CDAC400103A19 /* RequestTaskMap.swift in Sources */,
 				4C1DC8541B68908E00476DE3 /* AFError.swift in Sources */,
@@ -1466,9 +1465,10 @@
 				319917B9209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */,
 				319917AA209CDCB000103A19 /* HTTPHeaders.swift in Sources */,
 				31727418218BAEC90039FFCC /* HTTPMethod.swift in Sources */,
+				4C0CB646220CA8A400604EDC /* RedirectHandler.swift in Sources */,
 				F897FF4119AA800700AB5182 /* Alamofire.swift in Sources */,
 				4C23EB431B327C5B0090E0BC /* MultipartFormData.swift in Sources */,
-				4C0CB63B220CA76300604EDC /* RedirectHandler.swift in Sources */,
+				4C0CB641220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */,
 				4C811F8D1B51856D00E0F59A /* ServerTrustEvaluation.swift in Sources */,
 				4C256A0621EEB69000AD5D87 /* RequestInterceptor.swift in Sources */,
 				4C43669B1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */,
@@ -1495,9 +1495,10 @@
 				3111CE9220A7EC30008315E2 /* ResponseSerializationTests.swift in Sources */,
 				3111CE8C20A7EBE6008315E2 /* MultipartFormDataTests.swift in Sources */,
 				311B199420B0ED980036823B /* UploadTests.swift in Sources */,
-				4CFD6B142201338E00FFB5E3 /* CachedResponseHandlerTests.swift in Sources */,
+				4C0CB631220BC70300604EDC /* RequestInterceptorTests.swift in Sources */,
 				3107EA3520A11AE100445260 /* AuthenticationTests.swift in Sources */,
 				4CFB02901D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */,
+				4C0CB64B220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */,
 				3107EA3820A11F9600445260 /* ResponseTests.swift in Sources */,
 				F8858DDD19A96B4300F55F93 /* RequestTests.swift in Sources */,
 				4C256A531B096C770065714F /* BaseTestCase.swift in Sources */,
@@ -1510,7 +1511,6 @@
 				317A6A7620B2207F00A9FEC5 /* DownloadTests.swift in Sources */,
 				31F9683C20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */,
 				3113D46B21878227001CCD21 /* HTTPHeadersTests.swift in Sources */,
-				4CFD6B102201145500FFB5E3 /* RedirectHandlerTests.swift in Sources */,
 				31501E882196962A005829F2 /* ParameterEncoderTests.swift in Sources */,
 				3107EA3F20A1267C00445260 /* SessionDelegateTests.swift in Sources */,
 				31C2B0EA20B271040089BA7C /* CacheTests.swift in Sources */,
@@ -1529,9 +1529,10 @@
 				3111CE9320A7EC31008315E2 /* ResponseSerializationTests.swift in Sources */,
 				3111CE8D20A7EBE7008315E2 /* MultipartFormDataTests.swift in Sources */,
 				311B199520B0ED980036823B /* UploadTests.swift in Sources */,
-				4CFD6B152201338E00FFB5E3 /* CachedResponseHandlerTests.swift in Sources */,
+				4C0CB632220BC70300604EDC /* RequestInterceptorTests.swift in Sources */,
 				3107EA3620A11AE100445260 /* AuthenticationTests.swift in Sources */,
 				4CFB02911D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */,
+				4C0CB64C220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */,
 				3107EA3920A11F9600445260 /* ResponseTests.swift in Sources */,
 				F829C6BE1A7A950600A2CD59 /* ParameterEncodingTests.swift in Sources */,
 				F829C6BF1A7A950600A2CD59 /* RequestTests.swift in Sources */,
@@ -1544,7 +1545,6 @@
 				317A6A7720B2208000A9FEC5 /* DownloadTests.swift in Sources */,
 				31F9683D20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */,
 				3113D46C21878227001CCD21 /* HTTPHeadersTests.swift in Sources */,
-				4CFD6B112201145500FFB5E3 /* RedirectHandlerTests.swift in Sources */,
 				31501E892196962A005829F2 /* ParameterEncoderTests.swift in Sources */,
 				3107EA4020A1267C00445260 /* SessionDelegateTests.swift in Sources */,
 				31C2B0EB20B271050089BA7C /* CacheTests.swift in Sources */,

+ 0 - 1
Source/RequestInterceptor.swift

@@ -55,7 +55,6 @@ extension RetryResult {
     var delay: TimeInterval? {
         switch self {
         case .retryWithDelay(let delay): return delay
-        case .retry:                     return 0.0
         default:                         return nil
         }
     }

+ 399 - 0
Tests/RequestInterceptorTests.swift

@@ -0,0 +1,399 @@
+//
+//  RequestInterceptorTests.swift
+//
+//  Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)
+//
+//  Permission is hereby granted, free of charge, to any person obtaining a copy
+//  of this software and associated documentation files (the "Software"), to deal
+//  in the Software without restriction, including without limitation the rights
+//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+//  copies of the Software, and to permit persons to whom the Software is
+//  furnished to do so, subject to the following conditions:
+//
+//  The above copyright notice and this permission notice shall be included in
+//  all copies or substantial portions of the Software.
+//
+//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+//  THE SOFTWARE.
+//
+
+@testable import Alamofire
+import Foundation
+import XCTest
+
+fileprivate struct MockError: Error {}
+fileprivate struct RetryError: Error {}
+
+// MARK: -
+
+final class RetryResultTestCase: BaseTestCase {
+    func testRetryRequiredProperty() {
+        // Given, When
+        let retry = RetryResult.retry
+        let retryWithDelay = RetryResult.retryWithDelay(1.0)
+        let doNotRetry = RetryResult.doNotRetry
+        let doNotRetryWithError = RetryResult.doNotRetryWithError(MockError())
+
+        // Then
+        XCTAssertTrue(retry.retryRequired)
+        XCTAssertTrue(retryWithDelay.retryRequired)
+        XCTAssertFalse(doNotRetry.retryRequired)
+        XCTAssertFalse(doNotRetryWithError.retryRequired)
+    }
+
+    func testDelayProperty() {
+        // Given, When
+        let retry = RetryResult.retry
+        let retryWithDelay = RetryResult.retryWithDelay(1.0)
+        let doNotRetry = RetryResult.doNotRetry
+        let doNotRetryWithError = RetryResult.doNotRetryWithError(MockError())
+
+        // Then
+        XCTAssertEqual(retry.delay, nil)
+        XCTAssertEqual(retryWithDelay.delay, 1.0)
+        XCTAssertEqual(doNotRetry.delay, nil)
+        XCTAssertEqual(doNotRetryWithError.delay, nil)
+    }
+
+    func testErrorProperty() {
+        // Given, When
+        let retry = RetryResult.retry
+        let retryWithDelay = RetryResult.retryWithDelay(1.0)
+        let doNotRetry = RetryResult.doNotRetry
+        let doNotRetryWithError = RetryResult.doNotRetryWithError(MockError())
+
+        // Then
+        XCTAssertNil(retry.error)
+        XCTAssertNil(retryWithDelay.error)
+        XCTAssertNil(doNotRetry.error)
+        XCTAssertTrue(doNotRetryWithError.error is MockError)
+    }
+}
+
+// MARK: -
+
+final class AdapterTestCase: BaseTestCase {
+    func testThatAdapterCallsAdaptHandler() {
+        // Given
+        let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/get")!)
+        let session = Session()
+        var adapted = false
+
+        let adapter = Adapter { request, _, completion in
+            adapted = true
+            completion(.success(request))
+        }
+
+        var result: Result<URLRequest>!
+
+        // When
+        adapter.adapt(urlRequest, for: session) { result = $0 }
+
+        // Then
+        XCTAssertTrue(adapted)
+        XCTAssertTrue(result.isSuccess)
+    }
+
+    func testThatAdapterCallsRequestRetrierDefaultImplementationInProtocolExtension() {
+        // Given
+        let url = URL(string: "https://httpbin.org/get")!
+        let session = Session(startRequestsImmediately: false)
+        let request = session.request(url)
+
+        let adapter = Adapter { request, _, completion in
+            completion(.success(request))
+        }
+
+        var result: RetryResult!
+
+        // When
+        adapter.retry(request, for: session, dueTo: MockError()) { result = $0 }
+
+        // Then
+        XCTAssertEqual(result, .doNotRetry)
+    }
+}
+
+// MARK: -
+
+final class RetrierTestCase: BaseTestCase {
+    func testThatRetrierCallsRetryHandler() {
+        // Given
+        let url = URL(string: "https://httpbin.org/get")!
+        let session = Session(startRequestsImmediately: false)
+        let request = session.request(url)
+        var retried = false
+
+        let retrier = Retrier { request, session, error, completion in
+            retried = true
+            completion(.retry)
+        }
+
+        var result: RetryResult!
+
+        // When
+        retrier.retry(request, for: session, dueTo: MockError()) { result = $0 }
+
+        // Then
+        XCTAssertTrue(retried)
+        XCTAssertEqual(result, .retry)
+    }
+
+    func testThatRetrierCallsRequestAdapterDefaultImplementationInProtocolExtension() {
+        // Given
+        let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/get")!)
+        let session = Session()
+
+        let retrier = Retrier { _, _, _, completion in
+            completion(.retry)
+        }
+
+        var result: Result<URLRequest>!
+
+        // When
+        retrier.adapt(urlRequest, for: session) { result = $0 }
+
+        // Then
+        XCTAssertTrue(result.isSuccess)
+    }
+}
+
+// MARK: -
+
+final class InterceptorTestCase: BaseTestCase {
+    func testAdaptHandlerAndRetryHandlerDefaultInitializer() {
+        // Given
+        let adaptHandler: AdaptHandler = { urlRequest, _, completion in completion(.success(urlRequest)) }
+        let retryHandler: RetryHandler = { _, _, _, completion in completion(.doNotRetry) }
+
+        // When
+        let interceptor = Interceptor(adaptHandler: adaptHandler, retryHandler: retryHandler)
+
+        // Then
+        XCTAssertEqual(interceptor.adapters.count, 1)
+        XCTAssertEqual(interceptor.retriers.count, 1)
+    }
+
+    func testAdapterAndRetrierDefaultInitializer() {
+        // Given
+        let adapter = Adapter { urlRequest, _, completion in completion(.success(urlRequest)) }
+        let retrier = Retrier { _, _, _, completion in completion(.doNotRetry) }
+
+        // When
+        let interceptor = Interceptor(adapter: adapter, retrier: retrier)
+
+        // Then
+        XCTAssertEqual(interceptor.adapters.count, 1)
+        XCTAssertEqual(interceptor.retriers.count, 1)
+    }
+
+    func testAdaptersAndRetriersDefaultInitializer() {
+        // Given
+        let adapter = Adapter { urlRequest, _, completion in completion(.success(urlRequest)) }
+        let retrier = Retrier { _, _, _, completion in completion(.doNotRetry) }
+
+        // When
+        let interceptor = Interceptor(adapters: [adapter, adapter], retriers: [retrier, retrier])
+
+        // Then
+        XCTAssertEqual(interceptor.adapters.count, 2)
+        XCTAssertEqual(interceptor.retriers.count, 2)
+    }
+
+    func testThatInterceptorCanAdaptRequestWithNoAdapters() {
+        // Given
+        let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/get")!)
+        let session = Session()
+        let interceptor = Interceptor()
+
+        var result: Result<URLRequest>!
+
+        // When
+        interceptor.adapt(urlRequest, for: session) { result = $0 }
+
+        // Then
+        XCTAssertTrue(result.isSuccess)
+        XCTAssertEqual(result.value, urlRequest)
+    }
+
+    func testThatInterceptorCanAdaptRequestWithOneAdapter() {
+        // Given
+        let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/get")!)
+        let session = Session()
+
+        let adapter = Adapter { urlRequest, _, completion in completion(.failure(MockError())) }
+        let interceptor = Interceptor(adapters: [adapter])
+
+        var result: Result<URLRequest>!
+
+        // When
+        interceptor.adapt(urlRequest, for: session) { result = $0 }
+
+        // Then
+        XCTAssertTrue(result.isFailure)
+        XCTAssertTrue(result.error is MockError)
+    }
+
+    func testThatInterceptorCanAdaptRequestWithMultipleAdapters() {
+        // Given
+        let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/get")!)
+        let session = Session()
+
+        let adapter1 = Adapter { urlRequest, _, completion in completion(.success(urlRequest)) }
+        let adapter2 = Adapter { urlRequest, _, completion in completion(.failure(MockError())) }
+        let interceptor = Interceptor(adapters: [adapter1, adapter2])
+
+        var result: Result<URLRequest>!
+
+        // When
+        interceptor.adapt(urlRequest, for: session) { result = $0 }
+
+        // Then
+        XCTAssertTrue(result.isFailure)
+        XCTAssertTrue(result.error is MockError)
+    }
+
+    func testThatInterceptorCanRetryRequestWithNoRetriers() {
+        // Given
+        let url = URL(string: "https://httpbin.org/get")!
+        let session = Session(startRequestsImmediately: false)
+        let request = session.request(url)
+
+        let interceptor = Interceptor()
+
+        var result: RetryResult!
+
+        // When
+        interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 }
+
+        // Then
+        XCTAssertEqual(result, .doNotRetry)
+    }
+
+    func testThatInterceptorCanRetryRequestWithOneRetrier() {
+        // Given
+        let url = URL(string: "https://httpbin.org/get")!
+        let session = Session(startRequestsImmediately: false)
+        let request = session.request(url)
+
+        let retrier = Retrier { _, _, _, completion in completion(.retry) }
+        let interceptor = Interceptor(retriers: [retrier])
+
+        var result: RetryResult!
+
+        // When
+        interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 }
+
+        // Then
+        XCTAssertEqual(result, .retry)
+    }
+
+    func testThatInterceptorCanRetryRequestWithMultipleRetriers() {
+        // Given
+        let url = URL(string: "https://httpbin.org/get")!
+        let session = Session(startRequestsImmediately: false)
+        let request = session.request(url)
+
+        let retrier1 = Retrier { _, _, _, completion in completion(.doNotRetry) }
+        let retrier2 = Retrier { _, _, _, completion in completion(.retry) }
+        let interceptor = Interceptor(retriers: [retrier1, retrier2])
+
+        var result: RetryResult!
+
+        // When
+        interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 }
+
+        // Then
+        XCTAssertEqual(result, .retry)
+    }
+
+    func testThatInterceptorStopsIteratingThroughPendingRetriersWithRetryResult() {
+        // Given
+        let url = URL(string: "https://httpbin.org/get")!
+        let session = Session(startRequestsImmediately: false)
+        let request = session.request(url)
+
+        var retrier2Called = false
+
+        let retrier1 = Retrier { _, _, _, completion in completion(.retry) }
+        let retrier2 = Retrier { _, _, _, completion in retrier2Called = true; completion(.doNotRetry) }
+        let interceptor = Interceptor(retriers: [retrier1, retrier2])
+
+        var result: RetryResult!
+
+        // When
+        interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 }
+
+        // Then
+        XCTAssertEqual(result, .retry)
+        XCTAssertFalse(retrier2Called)
+    }
+
+    func testThatInterceptorStopsIteratingThroughPendingRetriersWithRetryWithDelayResult() {
+        // Given
+        let url = URL(string: "https://httpbin.org/get")!
+        let session = Session(startRequestsImmediately: false)
+        let request = session.request(url)
+
+        var retrier2Called = false
+
+        let retrier1 = Retrier { _, _, _, completion in completion(.retryWithDelay(1.0)) }
+        let retrier2 = Retrier { _, _, _, completion in retrier2Called = true; completion(.doNotRetry) }
+        let interceptor = Interceptor(retriers: [retrier1, retrier2])
+
+        var result: RetryResult!
+
+        // When
+        interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 }
+
+        // Then
+        XCTAssertEqual(result, .retryWithDelay(1.0))
+        XCTAssertEqual(result.delay, 1.0)
+        XCTAssertFalse(retrier2Called)
+    }
+
+    func testThatInterceptorStopsIteratingThroughPendingRetriersWithDoNotRetryResult() {
+        // Given
+        let url = URL(string: "https://httpbin.org/get")!
+        let session = Session(startRequestsImmediately: false)
+        let request = session.request(url)
+
+        var retrier2Called = false
+
+        let retrier1 = Retrier { _, _, _, completion in completion(.doNotRetryWithError(RetryError())) }
+        let retrier2 = Retrier { _, _, _, completion in retrier2Called = true; completion(.doNotRetry) }
+        let interceptor = Interceptor(retriers: [retrier1, retrier2])
+
+        var result: RetryResult!
+
+        // When
+        interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 }
+
+        // Then
+        XCTAssertEqual(result, .doNotRetryWithError(RetryError()))
+        XCTAssertTrue(result.error is RetryError)
+        XCTAssertFalse(retrier2Called)
+    }
+}
+
+// MARK: -
+
+extension RetryResult: Equatable {
+    public static func == (lhs: RetryResult, rhs: RetryResult) -> Bool {
+        switch (lhs, rhs) {
+        case (.retry, .retry),
+             (.retryWithDelay, .retryWithDelay),
+             (.doNotRetry, .doNotRetry),
+             (.doNotRetryWithError, .doNotRetryWithError):
+            return true
+
+        default:
+            return false
+        }
+    }
+}