2222using OptimizelySDK . Tests . Utils ;
2323using System ;
2424using System . Collections . Generic ;
25- using System . Diagnostics ;
2625using System . Net ;
2726using System . Net . Http ;
28- using System . Threading ;
2927using System . Threading . Tasks ;
3028
3129namespace OptimizelySDK . Tests . DatafileManagement_Tests
@@ -39,6 +37,11 @@ public class HttpProjectConfigManagerTest
3937 private Mock < TestNotificationCallbacks > NotificationCallbackMock =
4038 new Mock < TestNotificationCallbacks > ( ) ;
4139
40+ private const string ExpectedRfc1123DateTime = "Thu, 03 Nov 2022 16:00:00 GMT" ;
41+
42+ private readonly DateTime _pastLastModified =
43+ new DateTimeOffset ( new DateTime ( 2022 , 11 , 3 , 16 , 0 , 0 , DateTimeKind . Utc ) ) . UtcDateTime ;
44+
4245 [ SetUp ]
4346 public void Setup ( )
4447 {
@@ -54,7 +57,7 @@ public void Setup()
5457 public void TestHttpConfigManagerRetrieveProjectConfigByURL ( )
5558 {
5659 var t = MockSendAsync ( TestData . Datafile ) ;
57- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
60+ var httpManager = new HttpProjectConfigManager . Builder ( )
5861 . WithUrl ( "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json" )
5962 . WithLogger ( LoggerMock . Object )
6063 . WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -67,7 +70,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigByURL()
6770 t . Wait ( 1000 ) ;
6871
6972 HttpClientMock . Verify ( _ => _ . SendAsync (
70- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
73+ It . Is < HttpRequestMessage > ( requestMessage =>
7174 requestMessage . RequestUri . ToString ( ) ==
7275 "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
7376 ) ) ) ;
@@ -77,9 +80,9 @@ public void TestHttpConfigManagerRetrieveProjectConfigByURL()
7780 [ Test ]
7881 public void TestHttpConfigManagerWithInvalidStatus ( )
7982 {
80- var t = MockSendAsync ( statusCode : HttpStatusCode . Forbidden ) ;
83+ MockSendAsync ( statusCode : HttpStatusCode . Forbidden ) ;
8184
82- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
85+ var httpManager = new HttpProjectConfigManager . Builder ( )
8386 . WithUrl ( "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json" )
8487 . WithLogger ( LoggerMock . Object )
8588 . WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -102,24 +105,29 @@ public void TestSettingIfModifiedSinceInRequestHeader()
102105 statusCode : HttpStatusCode . NotModified ,
103106 responseContentHeaders : new Dictionary < string , string >
104107 {
105- {
106- "Last-Modified" , new DateTime ( 2050 , 10 , 10 ) . ToString ( "R" )
107- } ,
108+ { "Last-Modified" , _pastLastModified . ToString ( "r" ) } ,
108109 }
109110 ) ;
110111
111112 var httpManager = new HttpProjectConfigManager . Builder ( )
112- . WithDatafile ( string . Empty )
113+ . WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
113114 . WithLogger ( LoggerMock . Object )
114115 . WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
115116 . WithBlockingTimeoutPeriod ( TimeSpan . FromMilliseconds ( 2000 ) )
116117 . WithStartByDefault ( )
117118 . Build ( defer : true ) ;
118- httpManager . LastModifiedSince = new DateTime ( 2020 , 4 , 4 ) . ToString ( "R " ) ;
119+ httpManager . LastModifiedSince = _pastLastModified . ToString ( "r " ) ;
119120 t . Wait ( 3000 ) ;
120121
122+ HttpClientMock . Verify ( _ => _ . SendAsync (
123+ It . Is < HttpRequestMessage > ( requestMessage =>
124+ requestMessage . Headers . IfModifiedSince . HasValue &&
125+ requestMessage . Headers . IfModifiedSince . Value . UtcDateTime . ToString ( "r" ) ==
126+ ExpectedRfc1123DateTime
127+ ) ) , Times . Once ) ;
121128 LoggerMock . Verify (
122- _ => _ . Log ( LogLevel . DEBUG , "Set If-Modified-Since in request header." ) ,
129+ _ => _ . Log ( LogLevel . DEBUG ,
130+ $ "Set If-Modified-Since in request header: { ExpectedRfc1123DateTime } ") ,
123131 Times . AtLeastOnce ) ;
124132
125133 httpManager . Dispose ( ) ;
@@ -129,24 +137,24 @@ public void TestSettingIfModifiedSinceInRequestHeader()
129137 public void TestSettingLastModifiedFromResponseHeader ( )
130138 {
131139 MockSendAsync (
140+ datafile : TestData . Datafile ,
132141 statusCode : HttpStatusCode . OK ,
133142 responseContentHeaders : new Dictionary < string , string >
134143 {
135- {
136- "Last-Modified" , new DateTime ( 2050 , 10 , 10 ) . ToString ( "R" )
137- } ,
144+ { "Last-Modified" , _pastLastModified . ToString ( "r" ) } ,
138145 }
139146 ) ;
140147 var httpManager = new HttpProjectConfigManager . Builder ( )
141- . WithUrl ( "https://cdn.optimizely.com/datafiles/ QBw9gFM8oTn7ogY9ANCC1z.json ")
148+ . WithSdkKey ( " QBw9gFM8oTn7ogY9ANCC1z")
142149 . WithLogger ( LoggerMock . Object )
143150 . WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
144151 . WithBlockingTimeoutPeriod ( TimeSpan . FromMilliseconds ( 500 ) )
145152 . WithStartByDefault ( )
146153 . Build ( ) ;
147154
148155 LoggerMock . Verify (
149- _ => _ . Log ( LogLevel . DEBUG , "Set LastModifiedSince from response header." ) ,
156+ _ => _ . Log ( LogLevel . DEBUG ,
157+ $ "Set LastModifiedSince from response header: { ExpectedRfc1123DateTime } ") ,
150158 Times . AtLeastOnce ) ;
151159
152160 httpManager . Dispose ( ) ;
@@ -157,16 +165,15 @@ public void TestHttpClientHandler()
157165 {
158166 var httpConfigHandler = HttpProjectConfigManager . HttpClient . GetHttpClientHandler ( ) ;
159167 Assert . IsTrue ( httpConfigHandler . AutomaticDecompression ==
160- ( System . Net . DecompressionMethods . Deflate |
161- System . Net . DecompressionMethods . GZip ) ) ;
168+ ( DecompressionMethods . Deflate | DecompressionMethods . GZip ) ) ;
162169 }
163170
164171 [ Test ]
165172 public void TestHttpConfigManagerRetrieveProjectConfigGivenEmptyFormatUseDefaultFormat ( )
166173 {
167174 var t = MockSendAsync ( TestData . Datafile ) ;
168175
169- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
176+ var httpManager = new HttpProjectConfigManager . Builder ( )
170177 . WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
171178 . WithFormat ( "" )
172179 . WithLogger ( LoggerMock . Object )
@@ -179,7 +186,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigGivenEmptyFormatUseDefault
179186 // Time is given here to avoid hanging-up in any worst case.
180187 t . Wait ( 1000 ) ;
181188 HttpClientMock . Verify ( _ => _ . SendAsync (
182- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
189+ It . Is < HttpRequestMessage > ( requestMessage =>
183190 requestMessage . RequestUri . ToString ( ) ==
184191 "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
185192 ) ) ) ;
@@ -191,7 +198,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigBySDKKey()
191198 {
192199 var t = MockSendAsync ( TestData . Datafile ) ;
193200
194- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
201+ var httpManager = new HttpProjectConfigManager . Builder ( )
195202 . WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
196203 . WithLogger ( LoggerMock . Object )
197204 . WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -201,7 +208,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigBySDKKey()
201208
202209 t . Wait ( 1000 ) ;
203210 HttpClientMock . Verify ( _ => _ . SendAsync (
204- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
211+ It . Is < HttpRequestMessage > ( requestMessage =>
205212 requestMessage . RequestUri . ToString ( ) ==
206213 "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
207214 ) ) ) ;
@@ -214,8 +221,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigByFormat()
214221 {
215222 var t = MockSendAsync ( TestData . Datafile ) ;
216223
217- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
218- . WithSdkKey ( "10192104166" )
224+ var httpManager = new HttpProjectConfigManager . Builder ( ) . WithSdkKey ( "10192104166" )
219225 . WithFormat ( "https://cdn.optimizely.com/json/{0}.json" )
220226 . WithLogger ( LoggerMock . Object )
221227 . WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -225,7 +231,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigByFormat()
225231
226232 t . Wait ( 1000 ) ;
227233 HttpClientMock . Verify ( _ => _ . SendAsync (
228- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
234+ It . Is < HttpRequestMessage > ( requestMessage =>
229235 requestMessage . RequestUri . ToString ( ) ==
230236 "https://cdn.optimizely.com/json/10192104166.json"
231237 ) ) ) ;
@@ -242,8 +248,7 @@ public void TestHttpProjectConfigManagerDoesntRaiseExceptionForDefaultErrorHandl
242248 {
243249 var t = MockSendAsync ( TestData . Datafile ) ;
244250
245- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
246- . WithSdkKey ( "10192104166" )
251+ var httpManager = new HttpProjectConfigManager . Builder ( ) . WithSdkKey ( "10192104166" )
247252 . WithFormat ( "https://cdn.optimizely.com/json/{0}.json" )
248253 . WithLogger ( LoggerMock . Object )
249254 . WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -253,7 +258,7 @@ public void TestHttpProjectConfigManagerDoesntRaiseExceptionForDefaultErrorHandl
253258
254259 t . Wait ( 1000 ) ;
255260 HttpClientMock . Verify ( _ => _ . SendAsync (
256- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
261+ It . Is < HttpRequestMessage > ( requestMessage =>
257262 requestMessage . RequestUri . ToString ( ) ==
258263 "https://cdn.optimizely.com/json/10192104166.json"
259264 ) ) ) ;
@@ -272,7 +277,7 @@ public void TestOnReadyPromiseResolvedImmediatelyWhenDatafileIsProvided()
272277 var t = MockSendAsync ( TestData . SimpleABExperimentsDatafile ,
273278 TimeSpan . FromMilliseconds ( 100 ) ) ;
274279
275- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
280+ var httpManager = new HttpProjectConfigManager . Builder ( )
276281 // Revision - 15
277282 . WithSdkKey ( "10192104166" )
278283 . WithDatafile ( TestData . Datafile )
@@ -302,7 +307,7 @@ public void TestOnReadyPromiseWaitsForProjectConfigRetrievalWhenDatafileIsNotPro
302307 var t = MockSendAsync ( TestData . SimpleABExperimentsDatafile ,
303308 TimeSpan . FromMilliseconds ( 1000 ) ) ;
304309
305- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
310+ var httpManager = new HttpProjectConfigManager . Builder ( )
306311 . WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
307312 . WithLogger ( LoggerMock . Object )
308313 . WithPollingInterval ( TimeSpan . FromSeconds ( 2 ) )
@@ -350,7 +355,7 @@ public void TestHttpConfigManagerDoesNotWaitForTheConfigWhenDeferIsTrue()
350355 [ Test ]
351356 public void TestHttpConfigManagerSendConfigUpdateNotificationWhenProjectConfigGetsUpdated ( )
352357 {
353- var t = MockSendAsync ( TestData . Datafile ) ;
358+ MockSendAsync ( TestData . Datafile ) ;
354359
355360 var httpManager = new HttpProjectConfigManager . Builder ( )
356361 . WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
@@ -373,7 +378,7 @@ public void TestHttpConfigManagerSendConfigUpdateNotificationWhenProjectConfigGe
373378 [ Test ]
374379 public void TestHttpConfigManagerDoesNotSendConfigUpdateNotificationWhenDatafileIsProvided ( )
375380 {
376- var t = MockSendAsync ( TestData . Datafile , TimeSpan . FromMilliseconds ( 100 ) ) ;
381+ MockSendAsync ( TestData . Datafile , TimeSpan . FromMilliseconds ( 100 ) ) ;
377382
378383 var httpManager = new HttpProjectConfigManager . Builder ( )
379384 . WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
@@ -533,7 +538,7 @@ public void TestAuthUrlWhenTokenProvided()
533538 t . Wait ( 2000 ) ;
534539
535540 HttpClientMock . Verify ( _ => _ . SendAsync (
536- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
541+ It . Is < HttpRequestMessage > ( requestMessage =>
537542 requestMessage . RequestUri . ToString ( ) ==
538543 "https://config.optimizely.com/datafiles/auth/QBw9gFM8oTn7ogY9ANCC1z.json"
539544 ) ) ) ;
@@ -554,7 +559,7 @@ public void TestDefaultUrlWhenTokenNotProvided()
554559 // it's to wait if SendAsync is not triggered.
555560 t . Wait ( 2000 ) ;
556561 HttpClientMock . Verify ( _ => _ . SendAsync (
557- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
562+ It . Is < HttpRequestMessage > ( requestMessage =>
558563 requestMessage . RequestUri . ToString ( ) ==
559564 "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
560565 ) ) ) ;
@@ -577,7 +582,7 @@ public void TestAuthenticationHeaderWhenTokenProvided()
577582 t . Wait ( 2000 ) ;
578583
579584 HttpClientMock . Verify ( _ => _ . SendAsync (
580- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
585+ It . Is < HttpRequestMessage > ( requestMessage =>
581586 requestMessage . Headers . Authorization . ToString ( ) == "Bearer datafile1"
582587 ) ) ) ;
583588 httpManager . Dispose ( ) ;
@@ -597,7 +602,7 @@ public void TestFormatUrlHigherPriorityThanDefaultUrl()
597602 // it's to wait if SendAsync is not triggered.
598603 t . Wait ( 2000 ) ;
599604 HttpClientMock . Verify ( _ => _ . SendAsync (
600- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
605+ It . Is < HttpRequestMessage > ( requestMessage =>
601606 requestMessage . RequestUri . ToString ( ) ==
602607 "http://customformat/QBw9gFM8oTn7ogY9ANCC1z.json"
603608 ) ) ) ;
0 commit comments