Skip to content

Commit 2d4795f

Browse files
msohailhussainMichael Ng
authored and
Michael Ng
committed
chore: 3.2.x cherry pick for release (#182)
1 parent 38b3df3 commit 2d4795f

File tree

5 files changed

+64
-16
lines changed

5 files changed

+64
-16
lines changed

CHANGELOG.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ July 22nd, 2019
55
* Added support for automatic datafile management via `HttpProjectConfigManager` for framework 4.0 or above:
66
* The [`HttpProjectConfigManager`](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Config/HttpProjectConfigManager.cs) is an implementation of the abstract
77
[`PollingProjectConfigManager`](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Config/PollingProjectConfigManager.cs) class.
8-
- Users must first build the `HttpProjectConfigManager` with an SDK key and then and provide that instance to the `Optimizely`.
9-
- An initial datafile can be provided to the `HttpProjectConfigManager` to bootstrap before making http requests for the hosted datafile.
8+
- Users must first build the `HttpProjectConfigManager` with an SDK key and then and provide that instance to the `Optimizely` instance.
9+
- An initial datafile can be provided to the `HttpProjectConfigManager` to bootstrap before making HTTP requests for the hosted datafile.
1010
- Requests for the datafile are made in a separate thread and are scheduled with fixed delay.
1111
- Configuration updates can be subscribed to via the NotificationCenter built with the `HttpProjectConfigManager`.
1212
- `Optimizely` instance must be disposed after the use or `HttpProjectConfigManager` must be disposed after the use to release resources.

OptimizelySDK.DemoApp/Controllers/DemoController.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public class DemoController : Controller
4444
new Visitor { Id = 5, Name = "Randall", Age = 29 },
4545
};
4646

47-
private static Config ConfigRepo = new Config();
47+
private static Models.Config ConfigRepo = new Models.Config();
4848
private static Optimizely Optimizely = null;
4949
private static InMemoryHandler InMemoryHandler = new InMemoryHandler();
5050
private static Logger.ILogger Logger = new MultiLogger(new[] { new Logger.DefaultLogger(), (Logger.ILogger)InMemoryHandler, new Log4NetLogger() });
@@ -76,7 +76,7 @@ public ActionResult Config()
7676
}
7777

7878
[HttpPost]
79-
public ActionResult Config(Config config)
79+
public ActionResult Config(Models.Config config)
8080
{
8181
ConfigRepo = config;
8282
string url = string.Format("https://cdn.optimizely.com/json/{0}.json", config.ProjectId);

OptimizelySDK.Net40/OptimizelySDK.Net40.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<DebugType>full</DebugType>
2020
<Optimize>false</Optimize>
2121
<OutputPath>bin\Debug\</OutputPath>
22-
<DefineConstants>TRACE;DEBUG;NET35</DefineConstants>
22+
<DefineConstants>TRACE;DEBUG;NET35;NET40</DefineConstants>
2323
<ErrorReport>prompt</ErrorReport>
2424
<WarningLevel>4</WarningLevel>
2525
</PropertyGroup>

OptimizelySDK.Tests/ConfigTest/HttpProjectConfigManagerTest.cs

+40-3
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public void TestDefaultBlockingTimeoutWhileProvidingZero()
190190
.WithStartByDefault(true)
191191
.Build(true);
192192

193-
LoggerMock.Verify(l => l.Log(LogLevel.INFO, $"Blocking timeout is not valid, using default blocking timeout {TimeSpan.FromSeconds(15).TotalMilliseconds}ms"));
193+
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, $"Blocking timeout is not valid, using default blocking timeout {TimeSpan.FromSeconds(15).TotalMilliseconds}ms"));
194194
}
195195

196196
[Test]
@@ -205,7 +205,7 @@ public void TestDefaultPeriodWhileProvidingZero()
205205
.WithStartByDefault(true)
206206
.Build(true);
207207

208-
LoggerMock.Verify(l => l.Log(LogLevel.INFO, $"Period is not valid for periodic calls, using default period {TimeSpan.FromMinutes(5).TotalMilliseconds}ms"));
208+
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, $"Polling interval is not valid for periodic calls, using default period {TimeSpan.FromMinutes(5).TotalMilliseconds}ms"));
209209
}
210210

211211
[Test]
@@ -220,7 +220,44 @@ public void TestDefaultPeriodWhileProvidingNegative()
220220
.WithStartByDefault(true)
221221
.Build(true);
222222

223-
LoggerMock.Verify(l => l.Log(LogLevel.INFO, $"Period is not valid for periodic calls, using default period {TimeSpan.FromMinutes(5).TotalMilliseconds}ms"));
223+
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, $"Polling interval is not valid for periodic calls, using default period {TimeSpan.FromMinutes(5).TotalMilliseconds}ms"));
224+
}
225+
226+
[Test]
227+
public void TestDefaultPeriodWhileNotProvidingValue()
228+
{
229+
var httpManager = new HttpProjectConfigManager.Builder()
230+
.WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
231+
.WithDatafile(TestData.Datafile)
232+
.WithLogger(LoggerMock.Object)
233+
.Build(true);
234+
235+
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, $"No polling interval provided, using default period {TimeSpan.FromMinutes(5).TotalMilliseconds}ms"));
236+
}
237+
238+
[Test]
239+
public void TestDefaultBlockingTimeoutWhileNotProvidingValue()
240+
{
241+
var httpManager = new HttpProjectConfigManager.Builder()
242+
.WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
243+
.WithDatafile(TestData.Datafile)
244+
.WithLogger(LoggerMock.Object)
245+
.Build(true);
246+
247+
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, $"No Blocking timeout provided, using default blocking timeout {TimeSpan.FromSeconds(15).TotalMilliseconds}ms"));
248+
}
249+
250+
[Test]
251+
public void TestDefaultValuesWhenNotProvided()
252+
{
253+
var httpManager = new HttpProjectConfigManager.Builder()
254+
.WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
255+
.WithDatafile(TestData.Datafile)
256+
.WithLogger(LoggerMock.Object)
257+
.Build(true);
258+
259+
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, $"No polling interval provided, using default period {TimeSpan.FromMinutes(5).TotalMilliseconds}ms"));
260+
LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, $"No Blocking timeout provided, using default blocking timeout {TimeSpan.FromSeconds(15).TotalMilliseconds}ms"));
224261
}
225262

226263
#endregion

OptimizelySDK/Config/HttpProjectConfigManager.cs

+19-8
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ private string GetRemoteDatafileResponse()
7878

7979
return content.Result;
8080
}
81-
#elif NET40
81+
#elif NET40
8282
private string GetRemoteDatafileResponse()
8383
{
8484
var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(Url);
@@ -87,8 +87,7 @@ private string GetRemoteDatafileResponse()
8787
if (!string.IsNullOrEmpty(LastModifiedSince))
8888
request.Headers.Add("If-Modified-Since", LastModifiedSince);
8989
var result = (System.Net.HttpWebResponse)request.GetResponse();
90-
91-
// TODO: Need to revise this code.
90+
9291
if (result.StatusCode != System.Net.HttpStatusCode.OK) {
9392
Logger.Log(LogLevel.ERROR, "Unexpected response from event endpoint, status: " + result.StatusCode);
9493
}
@@ -138,8 +137,14 @@ public class Builder
138137
private bool StartByDefault;
139138
private NotificationCenter NotificationCenter;
140139

140+
141+
private bool IsBlockingTimeoutProvided = false;
142+
private bool IsPollingIntervalProvided = false;
143+
141144
public Builder WithBlockingTimeoutPeriod(TimeSpan blockingTimeoutSpan)
142145
{
146+
IsBlockingTimeoutProvided = true;
147+
143148
BlockingTimeoutSpan = blockingTimeoutSpan;
144149

145150
return this;
@@ -166,7 +171,9 @@ public Builder WithUrl(string url)
166171
}
167172

168173
public Builder WithPollingInterval(TimeSpan period)
169-
{
174+
{
175+
IsPollingIntervalProvided = true;
176+
170177
Period = period;
171178

172179
return this;
@@ -249,15 +256,19 @@ public HttpProjectConfigManager Build(bool defer)
249256
Url = string.Format(Format, SdkKey);
250257
}
251258

252-
if (Period.TotalMilliseconds <= 0 || Period.TotalMilliseconds > MAX_MILLISECONDS_LIMIT) {
253-
Logger.Log(LogLevel.INFO, $"Period is not valid for periodic calls, using default period {DEFAULT_PERIOD.TotalMilliseconds}ms");
259+
if (IsPollingIntervalProvided && (Period.TotalMilliseconds <= 0 || Period.TotalMilliseconds > MAX_MILLISECONDS_LIMIT)) {
260+
Logger.Log(LogLevel.DEBUG, $"Polling interval is not valid for periodic calls, using default period {DEFAULT_PERIOD.TotalMilliseconds}ms");
254261
Period = DEFAULT_PERIOD;
262+
} else {
263+
Logger.Log(LogLevel.DEBUG, $"No polling interval provided, using default period {DEFAULT_PERIOD.TotalMilliseconds}ms");
255264
}
256265

257266

258-
if (BlockingTimeoutSpan.TotalMilliseconds <= 0 || BlockingTimeoutSpan.TotalMilliseconds > MAX_MILLISECONDS_LIMIT) {
259-
Logger.Log(LogLevel.INFO, $"Blocking timeout is not valid, using default blocking timeout {DEFAULT_BLOCKINGOUT_PERIOD.TotalMilliseconds}ms");
267+
if (IsBlockingTimeoutProvided && (BlockingTimeoutSpan.TotalMilliseconds <= 0 || BlockingTimeoutSpan.TotalMilliseconds > MAX_MILLISECONDS_LIMIT)) {
268+
Logger.Log(LogLevel.DEBUG, $"Blocking timeout is not valid, using default blocking timeout {DEFAULT_BLOCKINGOUT_PERIOD.TotalMilliseconds}ms");
260269
BlockingTimeoutSpan = DEFAULT_BLOCKINGOUT_PERIOD;
270+
} else {
271+
Logger.Log(LogLevel.DEBUG, $"No Blocking timeout provided, using default blocking timeout {DEFAULT_BLOCKINGOUT_PERIOD.TotalMilliseconds}ms");
261272
}
262273

263274

0 commit comments

Comments
 (0)