Skip to content

Commit 88d674c

Browse files
committed
Refactor retry policy implementation to improve exception handling and retry logic across various scenarios. Update method access modifiers for better visibility and consistency. Enhance unit tests for comprehensive coverage of retry conditions.
1 parent b9257eb commit 88d674c

File tree

11 files changed

+162
-128
lines changed

11 files changed

+162
-128
lines changed

Contentstack.Management.Core.Unit.Tests/Mokes/CustomJsonConverter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class CustomJsonConverter : JsonConverter
99
{
1010
public override bool CanConvert(Type objectType)
1111
{
12-
throw new NotImplementedException();
12+
return false; // Mock converter - not actually used for conversion
1313
}
1414

1515
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
@@ -28,7 +28,7 @@ public class CustomConverter : JsonConverter
2828
{
2929
public override bool CanConvert(Type objectType)
3030
{
31-
throw new NotImplementedException();
31+
return false; // Mock converter - not actually used for conversion
3232
}
3333

3434
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)

Contentstack.Management.Core.Unit.Tests/Mokes/MockRetryPolicy.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,19 @@ public MockRetryPolicy()
2323
RetryLimit = 5;
2424
}
2525

26-
protected override bool RetryForException(IExecutionContext executionContext, Exception exception)
26+
public override bool RetryForException(IExecutionContext executionContext, Exception exception)
2727
{
2828
LastException = exception;
2929
RetryCallCount++;
3030
return ShouldRetryValue;
3131
}
3232

33-
protected override bool CanRetry(IExecutionContext executionContext)
33+
public override bool CanRetry(IExecutionContext executionContext)
3434
{
3535
return CanRetryValue;
3636
}
3737

38-
protected override bool RetryLimitExceeded(IExecutionContext executionContext)
38+
public override bool RetryLimitExceeded(IExecutionContext executionContext)
3939
{
4040
return RetryLimitExceededValue;
4141
}

Contentstack.Management.Core.Unit.Tests/Runtime/Pipeline/RetryHandler/DefaultRetryPolicyTest.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,13 @@ public void RetryForException_HttpError_Exceeds_RetryLimit_Returns_False()
186186
};
187187
var policy = new DefaultRetryPolicy(config);
188188
var context = CreateExecutionContext();
189-
context.RequestContext.HttpRetryCount = 1;
190189
var exception = MockNetworkErrorGenerator.CreateContentstackErrorException(HttpStatusCode.InternalServerError);
191190

191+
context.RequestContext.HttpRetryCount = 0;
192+
var result0 = policy.RetryForException(context, exception);
193+
Assert.IsTrue(result0);
194+
195+
context.RequestContext.HttpRetryCount = 1;
192196
var result = policy.RetryForException(context, exception);
193197
Assert.IsFalse(result);
194198
}

Contentstack.Management.Core.Unit.Tests/Runtime/Pipeline/RetryHandler/RetryHandlerIntegrationTest.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
using System.Net;
33
using System.Net.Sockets;
44
using Contentstack.Management.Core;
5+
using Contentstack.Management.Core.Exceptions;
6+
using Contentstack.Management.Core.Internal;
57
using Contentstack.Management.Core.Runtime.Contexts;
68
using Contentstack.Management.Core.Runtime.Pipeline.RetryHandler;
9+
using RetryHandlerClass = Contentstack.Management.Core.Runtime.Pipeline.RetryHandler.RetryHandler;
710
using Contentstack.Management.Core.Unit.Tests.Mokes;
811
using Microsoft.VisualStudio.TestTools.UnitTesting;
912
using System.Threading.Tasks;
@@ -36,7 +39,7 @@ public async Task EndToEnd_NetworkError_Retries_And_Succeeds()
3639
NetworkBackoffStrategy = BackoffStrategy.Exponential
3740
};
3841
var policy = new DefaultRetryPolicy(config);
39-
var handler = new RetryHandler(policy);
42+
var handler = new RetryHandlerClass(policy);
4043
var mockInnerHandler = new MockHttpHandlerWithRetries();
4144
mockInnerHandler.AddFailuresThenSuccess(2, MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
4245
handler.InnerHandler = mockInnerHandler;
@@ -64,7 +67,7 @@ public async Task EndToEnd_HttpError_Retries_And_Succeeds()
6467
}
6568
};
6669
var policy = new DefaultRetryPolicy(config);
67-
var handler = new RetryHandler(policy);
70+
var handler = new RetryHandlerClass(policy);
6871
var mockInnerHandler = new MockHttpHandlerWithRetries();
6972
mockInnerHandler.AddHttpErrorsThenSuccess(2, HttpStatusCode.InternalServerError);
7073
handler.InnerHandler = mockInnerHandler;
@@ -93,7 +96,7 @@ public async Task EndToEnd_Mixed_Network_And_Http_Errors()
9396
RetryDelay = TimeSpan.FromMilliseconds(10)
9497
};
9598
var policy = new DefaultRetryPolicy(config);
96-
var handler = new RetryHandler(policy);
99+
var handler = new RetryHandlerClass(policy);
97100
var mockInnerHandler = new MockHttpHandlerWithRetries();
98101
mockInnerHandler.AddException(MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
99102
mockInnerHandler.AddResponse(HttpStatusCode.InternalServerError);
@@ -120,7 +123,7 @@ public async Task EndToEnd_Respects_RetryConfiguration()
120123
RetryOnError = false
121124
};
122125
var policy = new DefaultRetryPolicy(config);
123-
var handler = new RetryHandler(policy);
126+
var handler = new RetryHandlerClass(policy);
124127
var mockInnerHandler = new MockHttpHandlerWithRetries();
125128
mockInnerHandler.AddException(MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
126129
handler.InnerHandler = mockInnerHandler;
@@ -154,7 +157,7 @@ public async Task EndToEnd_ExponentialBackoff_Delays_Increase()
154157
NetworkBackoffStrategy = BackoffStrategy.Exponential
155158
};
156159
var policy = new DefaultRetryPolicy(config);
157-
var handler = new RetryHandler(policy);
160+
var handler = new RetryHandlerClass(policy);
158161
var mockInnerHandler = new MockHttpHandlerWithRetries();
159162
mockInnerHandler.AddFailuresThenSuccess(2, MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
160163
handler.InnerHandler = mockInnerHandler;
@@ -179,7 +182,7 @@ public async Task EndToEnd_RetryLimit_Stops_Retries()
179182
RetryDelay = TimeSpan.FromMilliseconds(10)
180183
};
181184
var policy = new DefaultRetryPolicy(config);
182-
var handler = new RetryHandler(policy);
185+
var handler = new RetryHandlerClass(policy);
183186
var mockInnerHandler = new MockHttpHandlerWithRetries();
184187
mockInnerHandler.AddResponse(HttpStatusCode.TooManyRequests);
185188
mockInnerHandler.AddResponse(HttpStatusCode.TooManyRequests);
@@ -214,7 +217,7 @@ public async Task EndToEnd_With_CustomRetryCondition()
214217
RetryCondition = (statusCode) => statusCode == HttpStatusCode.NotFound
215218
};
216219
var policy = new DefaultRetryPolicy(config);
217-
var handler = new RetryHandler(policy);
220+
var handler = new RetryHandlerClass(policy);
218221
var mockInnerHandler = new MockHttpHandlerWithRetries();
219222
mockInnerHandler.AddHttpErrorsThenSuccess(2, HttpStatusCode.NotFound);
220223
handler.InnerHandler = mockInnerHandler;
@@ -242,7 +245,7 @@ public async Task EndToEnd_With_CustomBackoff()
242245
}
243246
};
244247
var policy = new DefaultRetryPolicy(config);
245-
var handler = new RetryHandler(policy);
248+
var handler = new RetryHandlerClass(policy);
246249
var mockInnerHandler = new MockHttpHandlerWithRetries();
247250
mockInnerHandler.AddHttpErrorsThenSuccess(2, HttpStatusCode.TooManyRequests);
248251
handler.InnerHandler = mockInnerHandler;

Contentstack.Management.Core.Unit.Tests/Runtime/Pipeline/RetryHandler/RetryHandlerTest.cs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
using System.Net.Sockets;
44
using Contentstack.Management.Core;
55
using Contentstack.Management.Core.Exceptions;
6+
using Contentstack.Management.Core.Internal;
67
using Contentstack.Management.Core.Runtime.Contexts;
78
using Contentstack.Management.Core.Runtime.Pipeline.RetryHandler;
9+
using RetryHandlerClass = Contentstack.Management.Core.Runtime.Pipeline.RetryHandler.RetryHandler;
810
using Contentstack.Management.Core.Unit.Tests.Mokes;
911
using Microsoft.VisualStudio.TestTools.UnitTesting;
1012
using Moq;
@@ -35,7 +37,7 @@ public async Task InvokeAsync_Success_NoRetry()
3537
MaxNetworkRetries = 2
3638
};
3739
var policy = new DefaultRetryPolicy(config);
38-
var handler = new RetryHandler(policy);
40+
var handler = new RetryHandlerClass(policy);
3941
var mockInnerHandler = new MockHttpHandlerWithRetries();
4042
mockInnerHandler.AddSuccessResponse();
4143
handler.InnerHandler = mockInnerHandler;
@@ -61,7 +63,7 @@ public async Task InvokeAsync_NetworkError_Retries_UpTo_MaxNetworkRetries()
6163
NetworkRetryDelay = TimeSpan.FromMilliseconds(10)
6264
};
6365
var policy = new DefaultRetryPolicy(config);
64-
var handler = new RetryHandler(policy);
66+
var handler = new RetryHandlerClass(policy);
6567
var mockInnerHandler = new MockHttpHandlerWithRetries();
6668
mockInnerHandler.AddFailuresThenSuccess(2, MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
6769
handler.InnerHandler = mockInnerHandler;
@@ -86,7 +88,7 @@ public async Task InvokeAsync_NetworkError_Exceeds_MaxNetworkRetries_Throws()
8688
NetworkRetryDelay = TimeSpan.FromMilliseconds(10)
8789
};
8890
var policy = new DefaultRetryPolicy(config);
89-
var handler = new RetryHandler(policy);
91+
var handler = new RetryHandlerClass(policy);
9092
var mockInnerHandler = new MockHttpHandlerWithRetries();
9193
mockInnerHandler.AddException(MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
9294
mockInnerHandler.AddException(MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
@@ -119,7 +121,7 @@ public async Task InvokeAsync_HttpError_429_Retries_UpTo_RetryLimit()
119121
RetryDelay = TimeSpan.FromMilliseconds(10)
120122
};
121123
var policy = new DefaultRetryPolicy(config);
122-
var handler = new RetryHandler(policy);
124+
var handler = new RetryHandlerClass(policy);
123125
var mockInnerHandler = new MockHttpHandlerWithRetries();
124126
mockInnerHandler.AddHttpErrorsThenSuccess(2, HttpStatusCode.TooManyRequests);
125127
handler.InnerHandler = mockInnerHandler;
@@ -143,7 +145,7 @@ public async Task InvokeAsync_HttpError_500_Retries_UpTo_RetryLimit()
143145
RetryDelay = TimeSpan.FromMilliseconds(10)
144146
};
145147
var policy = new DefaultRetryPolicy(config);
146-
var handler = new RetryHandler(policy);
148+
var handler = new RetryHandlerClass(policy);
147149
var mockInnerHandler = new MockHttpHandlerWithRetries();
148150
mockInnerHandler.AddHttpErrorsThenSuccess(2, HttpStatusCode.InternalServerError);
149151
handler.InnerHandler = mockInnerHandler;
@@ -166,7 +168,7 @@ public async Task InvokeAsync_HttpError_Exceeds_RetryLimit_Throws()
166168
RetryDelay = TimeSpan.FromMilliseconds(10)
167169
};
168170
var policy = new DefaultRetryPolicy(config);
169-
var handler = new RetryHandler(policy);
171+
var handler = new RetryHandlerClass(policy);
170172
var mockInnerHandler = new MockHttpHandlerWithRetries();
171173
mockInnerHandler.AddResponse(HttpStatusCode.TooManyRequests);
172174
mockInnerHandler.AddResponse(HttpStatusCode.TooManyRequests);
@@ -201,7 +203,7 @@ public async Task InvokeAsync_NetworkError_Tracks_NetworkRetryCount()
201203
NetworkRetryDelay = TimeSpan.FromMilliseconds(10)
202204
};
203205
var policy = new DefaultRetryPolicy(config);
204-
var handler = new RetryHandler(policy);
206+
var handler = new RetryHandlerClass(policy);
205207
var mockInnerHandler = new MockHttpHandlerWithRetries();
206208
mockInnerHandler.AddFailuresThenSuccess(1, MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
207209
handler.InnerHandler = mockInnerHandler;
@@ -223,7 +225,7 @@ public async Task InvokeAsync_HttpError_Tracks_HttpRetryCount()
223225
RetryDelay = TimeSpan.FromMilliseconds(10)
224226
};
225227
var policy = new DefaultRetryPolicy(config);
226-
var handler = new RetryHandler(policy);
228+
var handler = new RetryHandlerClass(policy);
227229
var mockInnerHandler = new MockHttpHandlerWithRetries();
228230
mockInnerHandler.AddHttpErrorsThenSuccess(1, HttpStatusCode.TooManyRequests);
229231
handler.InnerHandler = mockInnerHandler;
@@ -249,7 +251,7 @@ public async Task InvokeAsync_NetworkError_Then_HttpError_Tracks_Both_Counts()
249251
RetryDelay = TimeSpan.FromMilliseconds(10)
250252
};
251253
var policy = new DefaultRetryPolicy(config);
252-
var handler = new RetryHandler(policy);
254+
var handler = new RetryHandlerClass(policy);
253255
var mockInnerHandler = new MockHttpHandlerWithRetries();
254256
mockInnerHandler.AddException(MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
255257
mockInnerHandler.AddResponse(HttpStatusCode.TooManyRequests);
@@ -276,7 +278,7 @@ public async Task InvokeAsync_Applies_NetworkRetryDelay()
276278
NetworkBackoffStrategy = BackoffStrategy.Fixed
277279
};
278280
var policy = new DefaultRetryPolicy(config);
279-
var handler = new RetryHandler(policy);
281+
var handler = new RetryHandlerClass(policy);
280282
var mockInnerHandler = new MockHttpHandlerWithRetries();
281283
mockInnerHandler.AddFailuresThenSuccess(1, MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
282284
handler.InnerHandler = mockInnerHandler;
@@ -304,7 +306,7 @@ public async Task InvokeAsync_Applies_HttpRetryDelay()
304306
}
305307
};
306308
var policy = new DefaultRetryPolicy(config);
307-
var handler = new RetryHandler(policy);
309+
var handler = new RetryHandlerClass(policy);
308310
var mockInnerHandler = new MockHttpHandlerWithRetries();
309311
mockInnerHandler.AddHttpErrorsThenSuccess(1, HttpStatusCode.TooManyRequests);
310312
handler.InnerHandler = mockInnerHandler;
@@ -324,7 +326,7 @@ public async Task InvokeAsync_RequestId_Is_Generated()
324326
{
325327
var config = new RetryConfiguration();
326328
var policy = new DefaultRetryPolicy(config);
327-
var handler = new RetryHandler(policy);
329+
var handler = new RetryHandlerClass(policy);
328330
var mockInnerHandler = new MockHttpHandlerWithRetries();
329331
mockInnerHandler.AddSuccessResponse();
330332
handler.InnerHandler = mockInnerHandler;
@@ -341,7 +343,7 @@ public void InvokeSync_Success_NoRetry()
341343
{
342344
var config = new RetryConfiguration();
343345
var policy = new DefaultRetryPolicy(config);
344-
var handler = new RetryHandler(policy);
346+
var handler = new RetryHandlerClass(policy);
345347
var mockInnerHandler = new MockHttpHandlerWithRetries();
346348
mockInnerHandler.AddSuccessResponse();
347349
handler.InnerHandler = mockInnerHandler;
@@ -364,7 +366,7 @@ public void InvokeSync_NetworkError_Retries()
364366
NetworkRetryDelay = TimeSpan.FromMilliseconds(10)
365367
};
366368
var policy = new DefaultRetryPolicy(config);
367-
var handler = new RetryHandler(policy);
369+
var handler = new RetryHandlerClass(policy);
368370
var mockInnerHandler = new MockHttpHandlerWithRetries();
369371
mockInnerHandler.AddFailuresThenSuccess(2, MockNetworkErrorGenerator.CreateSocketException(SocketError.ConnectionReset));
370372
handler.InnerHandler = mockInnerHandler;
@@ -386,7 +388,7 @@ public void InvokeSync_HttpError_Retries()
386388
RetryDelay = TimeSpan.FromMilliseconds(10)
387389
};
388390
var policy = new DefaultRetryPolicy(config);
389-
var handler = new RetryHandler(policy);
391+
var handler = new RetryHandlerClass(policy);
390392
var mockInnerHandler = new MockHttpHandlerWithRetries();
391393
mockInnerHandler.AddHttpErrorsThenSuccess(2, HttpStatusCode.TooManyRequests);
392394
handler.InnerHandler = mockInnerHandler;

Contentstack.Management.Core.Unit.Tests/Utils/ContentstackUtilitiesTest.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,12 @@ public void Return_Query_Parameters_On_ParameterCollection()
9393
JObject q_obj = JObject.Parse("{ \"price_in_usd\": { \"$lt\": 600 } }");
9494
param.AddQuery(q_obj);
9595
var result = ContentstackUtilities.GetQueryParameter(param);
96-
Assert.AreEqual("include=type&limit=10&query=%7B%0D%0A%20%20%22price_in_usd%22%3A%20%7B%0D%0A%20%20%20%20%22%24lt%22%3A%20600%0D%0A%20%20%7D%0D%0A%7D", result);
96+
// Normalize line endings for cross-platform compatibility (JObject.ToString() uses platform-specific line endings)
97+
var expected = "include=type&limit=10&query=%7B%0D%0A%20%20%22price_in_usd%22%3A%20%7B%0D%0A%20%20%20%20%22%24lt%22%3A%20600%0D%0A%20%20%7D%0D%0A%7D";
98+
// Normalize both to use \n for comparison
99+
var normalizedExpected = expected.Replace("%0D%0A", "%0A");
100+
var normalizedActual = result.Replace("%0D%0A", "%0A");
101+
Assert.AreEqual(normalizedExpected, normalizedActual);
97102
}
98103

99104
[TestMethod]

0 commit comments

Comments
 (0)