22
22
using OptimizelySDK . Tests . Utils ;
23
23
using System ;
24
24
using System . Collections . Generic ;
25
- using System . Diagnostics ;
26
25
using System . Net ;
27
26
using System . Net . Http ;
28
- using System . Threading ;
29
27
using System . Threading . Tasks ;
30
28
31
29
namespace OptimizelySDK . Tests . DatafileManagement_Tests
@@ -39,6 +37,11 @@ public class HttpProjectConfigManagerTest
39
37
private Mock < TestNotificationCallbacks > NotificationCallbackMock =
40
38
new Mock < TestNotificationCallbacks > ( ) ;
41
39
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
+
42
45
[ SetUp ]
43
46
public void Setup ( )
44
47
{
@@ -54,7 +57,7 @@ public void Setup()
54
57
public void TestHttpConfigManagerRetrieveProjectConfigByURL ( )
55
58
{
56
59
var t = MockSendAsync ( TestData . Datafile ) ;
57
- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
60
+ var httpManager = new HttpProjectConfigManager . Builder ( )
58
61
. WithUrl ( "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json" )
59
62
. WithLogger ( LoggerMock . Object )
60
63
. WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -67,7 +70,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigByURL()
67
70
t . Wait ( 1000 ) ;
68
71
69
72
HttpClientMock . Verify ( _ => _ . SendAsync (
70
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
73
+ It . Is < HttpRequestMessage > ( requestMessage =>
71
74
requestMessage . RequestUri . ToString ( ) ==
72
75
"https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
73
76
) ) ) ;
@@ -77,9 +80,9 @@ public void TestHttpConfigManagerRetrieveProjectConfigByURL()
77
80
[ Test ]
78
81
public void TestHttpConfigManagerWithInvalidStatus ( )
79
82
{
80
- var t = MockSendAsync ( statusCode : HttpStatusCode . Forbidden ) ;
83
+ MockSendAsync ( statusCode : HttpStatusCode . Forbidden ) ;
81
84
82
- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
85
+ var httpManager = new HttpProjectConfigManager . Builder ( )
83
86
. WithUrl ( "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json" )
84
87
. WithLogger ( LoggerMock . Object )
85
88
. WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -102,24 +105,29 @@ public void TestSettingIfModifiedSinceInRequestHeader()
102
105
statusCode : HttpStatusCode . NotModified ,
103
106
responseContentHeaders : new Dictionary < string , string >
104
107
{
105
- {
106
- "Last-Modified" , new DateTime ( 2050 , 10 , 10 ) . ToString ( "R" )
107
- } ,
108
+ { "Last-Modified" , _pastLastModified . ToString ( "r" ) } ,
108
109
}
109
110
) ;
110
111
111
112
var httpManager = new HttpProjectConfigManager . Builder ( )
112
- . WithDatafile ( string . Empty )
113
+ . WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
113
114
. WithLogger ( LoggerMock . Object )
114
115
. WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
115
116
. WithBlockingTimeoutPeriod ( TimeSpan . FromMilliseconds ( 2000 ) )
116
117
. WithStartByDefault ( )
117
118
. Build ( defer : true ) ;
118
- httpManager . LastModifiedSince = new DateTime ( 2020 , 4 , 4 ) . ToString ( "R " ) ;
119
+ httpManager . LastModifiedSince = _pastLastModified . ToString ( "r " ) ;
119
120
t . Wait ( 3000 ) ;
120
121
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 ) ;
121
128
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 } ") ,
123
131
Times . AtLeastOnce ) ;
124
132
125
133
httpManager . Dispose ( ) ;
@@ -129,24 +137,24 @@ public void TestSettingIfModifiedSinceInRequestHeader()
129
137
public void TestSettingLastModifiedFromResponseHeader ( )
130
138
{
131
139
MockSendAsync (
140
+ datafile : TestData . Datafile ,
132
141
statusCode : HttpStatusCode . OK ,
133
142
responseContentHeaders : new Dictionary < string , string >
134
143
{
135
- {
136
- "Last-Modified" , new DateTime ( 2050 , 10 , 10 ) . ToString ( "R" )
137
- } ,
144
+ { "Last-Modified" , _pastLastModified . ToString ( "r" ) } ,
138
145
}
139
146
) ;
140
147
var httpManager = new HttpProjectConfigManager . Builder ( )
141
- . WithUrl ( "https://cdn.optimizely.com/datafiles/ QBw9gFM8oTn7ogY9ANCC1z.json ")
148
+ . WithSdkKey ( " QBw9gFM8oTn7ogY9ANCC1z")
142
149
. WithLogger ( LoggerMock . Object )
143
150
. WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
144
151
. WithBlockingTimeoutPeriod ( TimeSpan . FromMilliseconds ( 500 ) )
145
152
. WithStartByDefault ( )
146
153
. Build ( ) ;
147
154
148
155
LoggerMock . Verify (
149
- _ => _ . Log ( LogLevel . DEBUG , "Set LastModifiedSince from response header." ) ,
156
+ _ => _ . Log ( LogLevel . DEBUG ,
157
+ $ "Set LastModifiedSince from response header: { ExpectedRfc1123DateTime } ") ,
150
158
Times . AtLeastOnce ) ;
151
159
152
160
httpManager . Dispose ( ) ;
@@ -157,16 +165,15 @@ public void TestHttpClientHandler()
157
165
{
158
166
var httpConfigHandler = HttpProjectConfigManager . HttpClient . GetHttpClientHandler ( ) ;
159
167
Assert . IsTrue ( httpConfigHandler . AutomaticDecompression ==
160
- ( System . Net . DecompressionMethods . Deflate |
161
- System . Net . DecompressionMethods . GZip ) ) ;
168
+ ( DecompressionMethods . Deflate | DecompressionMethods . GZip ) ) ;
162
169
}
163
170
164
171
[ Test ]
165
172
public void TestHttpConfigManagerRetrieveProjectConfigGivenEmptyFormatUseDefaultFormat ( )
166
173
{
167
174
var t = MockSendAsync ( TestData . Datafile ) ;
168
175
169
- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
176
+ var httpManager = new HttpProjectConfigManager . Builder ( )
170
177
. WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
171
178
. WithFormat ( "" )
172
179
. WithLogger ( LoggerMock . Object )
@@ -179,7 +186,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigGivenEmptyFormatUseDefault
179
186
// Time is given here to avoid hanging-up in any worst case.
180
187
t . Wait ( 1000 ) ;
181
188
HttpClientMock . Verify ( _ => _ . SendAsync (
182
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
189
+ It . Is < HttpRequestMessage > ( requestMessage =>
183
190
requestMessage . RequestUri . ToString ( ) ==
184
191
"https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
185
192
) ) ) ;
@@ -191,7 +198,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigBySDKKey()
191
198
{
192
199
var t = MockSendAsync ( TestData . Datafile ) ;
193
200
194
- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
201
+ var httpManager = new HttpProjectConfigManager . Builder ( )
195
202
. WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
196
203
. WithLogger ( LoggerMock . Object )
197
204
. WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -201,7 +208,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigBySDKKey()
201
208
202
209
t . Wait ( 1000 ) ;
203
210
HttpClientMock . Verify ( _ => _ . SendAsync (
204
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
211
+ It . Is < HttpRequestMessage > ( requestMessage =>
205
212
requestMessage . RequestUri . ToString ( ) ==
206
213
"https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
207
214
) ) ) ;
@@ -214,8 +221,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigByFormat()
214
221
{
215
222
var t = MockSendAsync ( TestData . Datafile ) ;
216
223
217
- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
218
- . WithSdkKey ( "10192104166" )
224
+ var httpManager = new HttpProjectConfigManager . Builder ( ) . WithSdkKey ( "10192104166" )
219
225
. WithFormat ( "https://cdn.optimizely.com/json/{0}.json" )
220
226
. WithLogger ( LoggerMock . Object )
221
227
. WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -225,7 +231,7 @@ public void TestHttpConfigManagerRetrieveProjectConfigByFormat()
225
231
226
232
t . Wait ( 1000 ) ;
227
233
HttpClientMock . Verify ( _ => _ . SendAsync (
228
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
234
+ It . Is < HttpRequestMessage > ( requestMessage =>
229
235
requestMessage . RequestUri . ToString ( ) ==
230
236
"https://cdn.optimizely.com/json/10192104166.json"
231
237
) ) ) ;
@@ -242,8 +248,7 @@ public void TestHttpProjectConfigManagerDoesntRaiseExceptionForDefaultErrorHandl
242
248
{
243
249
var t = MockSendAsync ( TestData . Datafile ) ;
244
250
245
- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
246
- . WithSdkKey ( "10192104166" )
251
+ var httpManager = new HttpProjectConfigManager . Builder ( ) . WithSdkKey ( "10192104166" )
247
252
. WithFormat ( "https://cdn.optimizely.com/json/{0}.json" )
248
253
. WithLogger ( LoggerMock . Object )
249
254
. WithPollingInterval ( TimeSpan . FromMilliseconds ( 1000 ) )
@@ -253,7 +258,7 @@ public void TestHttpProjectConfigManagerDoesntRaiseExceptionForDefaultErrorHandl
253
258
254
259
t . Wait ( 1000 ) ;
255
260
HttpClientMock . Verify ( _ => _ . SendAsync (
256
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
261
+ It . Is < HttpRequestMessage > ( requestMessage =>
257
262
requestMessage . RequestUri . ToString ( ) ==
258
263
"https://cdn.optimizely.com/json/10192104166.json"
259
264
) ) ) ;
@@ -272,7 +277,7 @@ public void TestOnReadyPromiseResolvedImmediatelyWhenDatafileIsProvided()
272
277
var t = MockSendAsync ( TestData . SimpleABExperimentsDatafile ,
273
278
TimeSpan . FromMilliseconds ( 100 ) ) ;
274
279
275
- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
280
+ var httpManager = new HttpProjectConfigManager . Builder ( )
276
281
// Revision - 15
277
282
. WithSdkKey ( "10192104166" )
278
283
. WithDatafile ( TestData . Datafile )
@@ -302,7 +307,7 @@ public void TestOnReadyPromiseWaitsForProjectConfigRetrievalWhenDatafileIsNotPro
302
307
var t = MockSendAsync ( TestData . SimpleABExperimentsDatafile ,
303
308
TimeSpan . FromMilliseconds ( 1000 ) ) ;
304
309
305
- HttpProjectConfigManager httpManager = new HttpProjectConfigManager . Builder ( )
310
+ var httpManager = new HttpProjectConfigManager . Builder ( )
306
311
. WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
307
312
. WithLogger ( LoggerMock . Object )
308
313
. WithPollingInterval ( TimeSpan . FromSeconds ( 2 ) )
@@ -350,7 +355,7 @@ public void TestHttpConfigManagerDoesNotWaitForTheConfigWhenDeferIsTrue()
350
355
[ Test ]
351
356
public void TestHttpConfigManagerSendConfigUpdateNotificationWhenProjectConfigGetsUpdated ( )
352
357
{
353
- var t = MockSendAsync ( TestData . Datafile ) ;
358
+ MockSendAsync ( TestData . Datafile ) ;
354
359
355
360
var httpManager = new HttpProjectConfigManager . Builder ( )
356
361
. WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
@@ -373,7 +378,7 @@ public void TestHttpConfigManagerSendConfigUpdateNotificationWhenProjectConfigGe
373
378
[ Test ]
374
379
public void TestHttpConfigManagerDoesNotSendConfigUpdateNotificationWhenDatafileIsProvided ( )
375
380
{
376
- var t = MockSendAsync ( TestData . Datafile , TimeSpan . FromMilliseconds ( 100 ) ) ;
381
+ MockSendAsync ( TestData . Datafile , TimeSpan . FromMilliseconds ( 100 ) ) ;
377
382
378
383
var httpManager = new HttpProjectConfigManager . Builder ( )
379
384
. WithSdkKey ( "QBw9gFM8oTn7ogY9ANCC1z" )
@@ -533,7 +538,7 @@ public void TestAuthUrlWhenTokenProvided()
533
538
t . Wait ( 2000 ) ;
534
539
535
540
HttpClientMock . Verify ( _ => _ . SendAsync (
536
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
541
+ It . Is < HttpRequestMessage > ( requestMessage =>
537
542
requestMessage . RequestUri . ToString ( ) ==
538
543
"https://config.optimizely.com/datafiles/auth/QBw9gFM8oTn7ogY9ANCC1z.json"
539
544
) ) ) ;
@@ -554,7 +559,7 @@ public void TestDefaultUrlWhenTokenNotProvided()
554
559
// it's to wait if SendAsync is not triggered.
555
560
t . Wait ( 2000 ) ;
556
561
HttpClientMock . Verify ( _ => _ . SendAsync (
557
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
562
+ It . Is < HttpRequestMessage > ( requestMessage =>
558
563
requestMessage . RequestUri . ToString ( ) ==
559
564
"https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
560
565
) ) ) ;
@@ -577,7 +582,7 @@ public void TestAuthenticationHeaderWhenTokenProvided()
577
582
t . Wait ( 2000 ) ;
578
583
579
584
HttpClientMock . Verify ( _ => _ . SendAsync (
580
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
585
+ It . Is < HttpRequestMessage > ( requestMessage =>
581
586
requestMessage . Headers . Authorization . ToString ( ) == "Bearer datafile1"
582
587
) ) ) ;
583
588
httpManager . Dispose ( ) ;
@@ -597,7 +602,7 @@ public void TestFormatUrlHigherPriorityThanDefaultUrl()
597
602
// it's to wait if SendAsync is not triggered.
598
603
t . Wait ( 2000 ) ;
599
604
HttpClientMock . Verify ( _ => _ . SendAsync (
600
- It . Is < System . Net . Http . HttpRequestMessage > ( requestMessage =>
605
+ It . Is < HttpRequestMessage > ( requestMessage =>
601
606
requestMessage . RequestUri . ToString ( ) ==
602
607
"http://customformat/QBw9gFM8oTn7ogY9ANCC1z.json"
603
608
) ) ) ;
0 commit comments