Skip to content

Commit 9e08223

Browse files
[FSSDK-9538] chore Cherry-pick & prep for 3.11.4 release (#364)
* [FSSDK-9538] bug: Fix last modified formatting (#361) * Fix non-RFC1123 formatting * Update tests to ensure expected format * Add more accurate assert * Lint fixes (cherry picked from commit 962bd68) * Update CI to run for release branch * Update (fix) assembly versions I can't believe I missed the main project fully 😫 * Update CHANGELOG.md
1 parent 97b240a commit 9e08223

File tree

12 files changed

+83
-70
lines changed

12 files changed

+83
-70
lines changed

.github/workflows/csharp.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ name: Continuous Integration
22

33
on:
44
push:
5-
branches: [ release-3.11.3 ]
5+
branches: [ release-3.11.4 ]
66
pull_request:
7-
branches: [ release-3.11.3 ]
7+
branches: [ release-3.11.4 ]
88

99
jobs:
1010
lintCodebase:
@@ -101,15 +101,15 @@ jobs:
101101
integration_tests:
102102
name: Run Integration Tests
103103
needs: [ netFrameworksAndUnitTest, netStandard16, netStandard20 ]
104-
uses: optimizely/csharp-sdk/.github/workflows/integration_test.yml@cb1c68ba0847f04ea54384c9b4500502c00681e6
104+
uses: optimizely/csharp-sdk/.github/workflows/integration_test.yml@mike/pick-prep-3.11.4
105105
secrets:
106106
CI_USER_TOKEN: ${{ secrets.CI_USER_TOKEN }}
107107
TRAVIS_COM_TOKEN: ${{ secrets.TRAVIS_COM_TOKEN }}
108108

109109
fullstack_production_suite:
110110
name: Run Performance Tests
111111
needs: [ netFrameworksAndUnitTest, netStandard16, netStandard20 ]
112-
uses: optimizely/csharp-sdk/.github/workflows/integration_test.yml@cb1c68ba0847f04ea54384c9b4500502c00681e6
112+
uses: optimizely/csharp-sdk/.github/workflows/integration_test.yml@mike/pick-prep-3.11.4
113113
with:
114114
FULLSTACK_TEST_REPO: ProdTesting
115115
secrets:

.github/workflows/integration_test.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ jobs:
4141
GITHUB_TOKEN: ${{ secrets.CI_USER_TOKEN }}
4242
EVENT_TYPE: ${{ github.event_name }}
4343
GITHUB_CONTEXT: ${{ toJson(github) }}
44-
REPO_SLUG: optimizely/fullstack-sdk-compatibility-suite@b45d804ce7670090341fcbae91f5daa39b03aa94
44+
# REPO_SLUG: ${{ github.repository }}
4545
PULL_REQUEST_SLUG: ${{ github.repository }}
4646
UPSTREAM_REPO: ${{ github.repository }}
4747
PULL_REQUEST_SHA: ${{ github.event.pull_request.head.sha }}
@@ -52,4 +52,6 @@ jobs:
5252
HOME: 'home/runner'
5353
run: |
5454
echo "$GITHUB_CONTEXT"
55-
home/runner/travisci-tools/trigger-script-with-status-update.sh
55+
# Adding the FSC branch that does not include tests for ODP (before-odp)
56+
# Remember to also disable the ODP_SERVER and ATS_API features in app-dot
57+
home/runner/travisci-tools/trigger-script-with-status-update.sh before-odp

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Optimizely C# SDK Changelog
22

3+
## 3.11.4
4+
July 26, 2023
5+
6+
### Bug Fix
7+
- Fix Last-Modified date & time format for If-Modified-Since ([#361](https://github.com/optimizely/csharp-sdk/pull/361)).
8+
39
## 3.11.3
410
July 18, 2023
511

OptimizelySDK.DemoApp/Properties/AssemblyInfo.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
// Build Number
3636
// Revision
3737
//
38-
[assembly: AssemblyVersion("3.11.3.0")]
39-
[assembly: AssemblyFileVersion("3.11.3.0")]
40-
[assembly: AssemblyInformationalVersion("3.11.3")] // Used by Nuget.
38+
[assembly: AssemblyVersion("3.11.4.0")]
39+
[assembly: AssemblyFileVersion("3.11.4.0")]
40+
[assembly: AssemblyInformationalVersion("3.11.4")] // Used by Nuget.
4141

OptimizelySDK.Net35/Properties/AssemblyInfo.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@
3535
// Build Number
3636
// Revision
3737
//
38-
[assembly: AssemblyVersion("3.11.3.0")]
39-
[assembly: AssemblyFileVersion("3.11.3.0")]
40-
[assembly: AssemblyInformationalVersion("3.11.3")] // Used by Nuget.
38+
[assembly: AssemblyVersion("3.11.4.0")]
39+
[assembly: AssemblyFileVersion("3.11.4.0")]
40+
[assembly: AssemblyInformationalVersion("3.11.4")] // Used by Nuget.

OptimizelySDK.Net40/Properties/AssemblyInfo.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@
3535
// Build Number
3636
// Revision
3737
//
38-
[assembly: AssemblyVersion("3.11.3.0")]
39-
[assembly: AssemblyFileVersion("3.11.3.0")]
40-
[assembly: AssemblyInformationalVersion("3.11.3")] // Used by Nuget.
38+
[assembly: AssemblyVersion("3.11.4.0")]
39+
[assembly: AssemblyFileVersion("3.11.4.0")]
40+
[assembly: AssemblyInformationalVersion("3.11.4")] // Used by Nuget.

OptimizelySDK.NetStandard16/Properties/AssemblyInfo.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@
3535
// Build Number
3636
// Revision
3737
//
38-
[assembly: AssemblyVersion("3.11.3.0")]
39-
[assembly: AssemblyFileVersion("3.11.3.0")]
40-
[assembly: AssemblyInformationalVersion("3.11.3")] // Used by Nuget.
38+
[assembly: AssemblyVersion("3.11.4.0")]
39+
[assembly: AssemblyFileVersion("3.11.4.0")]
40+
[assembly: AssemblyInformationalVersion("3.11.4")] // Used by Nuget.

OptimizelySDK.NetStandard20/Properties/AssemblyInfo.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@
3535
// Build Number
3636
// Revision
3737
//
38-
[assembly: AssemblyVersion("3.11.3.0")]
39-
[assembly: AssemblyFileVersion("3.11.3.0")]
40-
[assembly: AssemblyInformationalVersion("3.11.3")] // Used by Nuget.
38+
[assembly: AssemblyVersion("3.11.4.0")]
39+
[assembly: AssemblyFileVersion("3.11.4.0")]
40+
[assembly: AssemblyInformationalVersion("3.11.4")] // Used by Nuget.

OptimizelySDK.Tests/ConfigTest/HttpProjectConfigManagerTest.cs

+42-37
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@
2222
using OptimizelySDK.Tests.Utils;
2323
using System;
2424
using System.Collections.Generic;
25-
using System.Diagnostics;
2625
using System.Net;
2726
using System.Net.Http;
28-
using System.Threading;
2927
using System.Threading.Tasks;
3028

3129
namespace 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
)));

OptimizelySDK.Tests/Properties/AssemblyInfo.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@
2929
// Build Number
3030
// Revision
3131
//
32-
[assembly: AssemblyVersion("3.11.3.0")]
33-
[assembly: AssemblyFileVersion("3.11.3.0")]
34-
[assembly: AssemblyInformationalVersion("3.11.3")] // Used by Nuget.
32+
[assembly: AssemblyVersion("3.11.4.0")]
33+
[assembly: AssemblyFileVersion("3.11.4.0")]
34+
[assembly: AssemblyInformationalVersion("3.11.4")] // Used by Nuget.

0 commit comments

Comments
 (0)