Skip to content
This repository was archived by the owner on Apr 18, 2023. It is now read-only.

Commit 45fc4c6

Browse files
author
Vikas Dadheech
committed
Making minor changes for retry handler-
- Added 504 status code - Removed unused global variable of retryPower - Changed check for internal server error to service unavailable status code - Added unit tests for the same
1 parent 61c6622 commit 45fc4c6

File tree

3 files changed

+52
-6
lines changed

3 files changed

+52
-6
lines changed

MSGraphCoreSDK/MSGraphCoreSDK/Common/MSConstants.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ typedef NS_ENUM(NSInteger, MSClientErrorCode)
2626
MSClientErrorCodeInternalServerError = 500,
2727
MSClientErrorCodeNotImplemented = 501,
2828
MSClientErrorCodeServiceUnavailable = 503,
29+
MSClientErrorCodeGatewayTimeout = 504,
2930
MSClientErrorCodeInsufficientStorage = 507,
3031
MSClientErrorCodeUnknownError = 999,
3132
};

MSGraphCoreSDK/MSGraphCoreSDK/Middleware/Implementations/RetryHandler/MSRetryHandler.m

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
#define DELAY_SECONDS 10;
1414
#define DEFAULT_MAX_RETRIES 10;
15-
#define DEFAULT_RETRY_POWER 1;
1615

1716
@interface MSURLSessionTask()
1817

@@ -29,7 +28,6 @@ @interface MSRetryHandler()
2928
@implementation MSRetryHandler
3029
{
3130
NSInteger maxRetries;
32-
double retryPower;
3331
}
3432

3533
- (instancetype)init
@@ -38,7 +36,6 @@ - (instancetype)init
3836
if(self)
3937
{
4038
maxRetries = DEFAULT_MAX_RETRIES;
41-
retryPower = DEFAULT_RETRY_POWER;
4239
}
4340
return self;
4441
}
@@ -111,7 +108,8 @@ - (void)execute:(MSURLSessionTask *)task retriesAttempted:(NSInteger)retriesAtte
111108
- (BOOL)isRetry:(NSInteger)statusCode
112109
{
113110
if (statusCode == MSClientErrorCodeTooManyRequests ||
114-
statusCode == MSClientErrorCodeInternalServerError)
111+
statusCode == MSClientErrorCodeServiceUnavailable ||
112+
statusCode == MSClientErrorCodeGatewayTimeout)
115113
{
116114
return true;
117115
}
@@ -144,8 +142,7 @@ - (double)retryDelay:(NSHTTPURLResponse *)response andRetryCount:(NSInteger)retr
144142
}
145143
else
146144
{
147-
retryPower = pow(2, retryCount);
148-
delay = retryPower*DELAY_SECONDS;
145+
delay = pow(2, retryCount)*DELAY_SECONDS;
149146
}
150147
return delay;
151148
}

MSGraphCoreSDK/MSGraphCoreSDKTests/Middleware/Implementations/MSRetryHandlerTests.m

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,54 @@ - (void)testExecuteWithRedirectResopnseAndMaxRetries {
111111
[self checkCompletionBlockCodeInvoked];
112112
}
113113

114+
- (void)testExecuteWithRetryResopnse503AndSuccessfullRetry {
115+
XCTestExpectation *retryWaitExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for retry attempt execution"];
116+
117+
HTTPRequestCompletionHandler requestCompletion = ^(id data, NSURLResponse * _Nullable response, NSError * _Nullable error){
118+
[self completionBlockCodeInvoked];
119+
XCTAssertNil(error);
120+
XCTAssertNotNil(response);
121+
XCTAssertEqual(((NSHTTPURLResponse *)response).statusCode, MSExpectedResponseCodesOK);
122+
XCTAssertNotNil(data);
123+
[retryWaitExpectation fulfill];
124+
};
125+
126+
__block NSHTTPURLResponse *retryResponseWith503 = [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:MSGraphBaseURL] statusCode:MSClientErrorCodeServiceUnavailable HTTPVersion:@"foo" headerFields:nil];
127+
OCMStub([self.mockHttpProvider execute:[OCMArg any] withCompletionHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation){
128+
HTTPRequestCompletionHandler completionHandler;
129+
[invocation getArgument:&completionHandler atIndex:3];
130+
completionHandler([NSData new], retryResponseWith503, nil);
131+
retryResponseWith503 = self->_OKResponse;
132+
});
133+
[self.retryHandler execute:_mockDataTask withCompletionHandler:requestCompletion];
134+
[self waitForExpectations:@[retryWaitExpectation] timeout:12.0];
135+
[self checkCompletionBlockCodeInvoked];
136+
}
137+
138+
- (void)testExecuteWithRetryResopnse504AndSuccessfullRetry {
139+
XCTestExpectation *retryWaitExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for retry attempt execution"];
140+
141+
HTTPRequestCompletionHandler requestCompletion = ^(id data, NSURLResponse * _Nullable response, NSError * _Nullable error){
142+
[self completionBlockCodeInvoked];
143+
XCTAssertNil(error);
144+
XCTAssertNotNil(response);
145+
XCTAssertEqual(((NSHTTPURLResponse *)response).statusCode, MSExpectedResponseCodesOK);
146+
XCTAssertNotNil(data);
147+
[retryWaitExpectation fulfill];
148+
};
149+
150+
__block NSHTTPURLResponse *retryResponseWith504 = [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:MSGraphBaseURL] statusCode:MSClientErrorCodeGatewayTimeout HTTPVersion:@"foo" headerFields:nil];
151+
OCMStub([self.mockHttpProvider execute:[OCMArg any] withCompletionHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation){
152+
HTTPRequestCompletionHandler completionHandler;
153+
[invocation getArgument:&completionHandler atIndex:3];
154+
completionHandler([NSData new], retryResponseWith504, nil);
155+
retryResponseWith504 = self->_OKResponse;
156+
});
157+
[self.retryHandler execute:_mockDataTask withCompletionHandler:requestCompletion];
158+
[self waitForExpectations:@[retryWaitExpectation] timeout:12.0];
159+
[self checkCompletionBlockCodeInvoked];
160+
}
161+
114162
- (void)testExecuteWithNormalResponse {
115163
HTTPRequestCompletionHandler requestCompletion = ^(id data, NSURLResponse * _Nullable response, NSError * _Nullable error){
116164
[self completionBlockCodeInvoked];

0 commit comments

Comments
 (0)