From 8507843abe72b7fda3f7405e63ab7d1e970cd6cc Mon Sep 17 00:00:00 2001 From: mfahadahmed Date: Mon, 2 Jul 2018 18:28:16 +0500 Subject: [PATCH 1/5] Fix HttpClientEventDispatcher45 exception logging issue. --- .../OptimizelySDK.Net35.csproj | 3 +++ .../OptimizelySDK.Net40.csproj | 3 +++ .../OptimizelySDK.NetStandard16.csproj | 1 + .../OptimizelySDK.Tests.csproj | 1 + OptimizelySDK.Tests/OptimizelyTest.cs | 5 ++-- .../UtilsTests/ExtensionMethodsTest.cs | 18 +++++++++++++ .../Dispatcher/HttpClientEventDispatcher45.cs | 3 ++- OptimizelySDK/OptimizelySDK.csproj | 1 + OptimizelySDK/Utils/ExtensionMethods.cs | 27 +++++++++++++++++++ 9 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs create mode 100644 OptimizelySDK/Utils/ExtensionMethods.cs diff --git a/OptimizelySDK.Net35/OptimizelySDK.Net35.csproj b/OptimizelySDK.Net35/OptimizelySDK.Net35.csproj index c89f5c86..3b03c18c 100644 --- a/OptimizelySDK.Net35/OptimizelySDK.Net35.csproj +++ b/OptimizelySDK.Net35/OptimizelySDK.Net35.csproj @@ -150,6 +150,9 @@ Utils\ControlAttributes.cs + + + Utils\ExtensionMethods.cs diff --git a/OptimizelySDK.Net40/OptimizelySDK.Net40.csproj b/OptimizelySDK.Net40/OptimizelySDK.Net40.csproj index 20daf229..dd012a03 100644 --- a/OptimizelySDK.Net40/OptimizelySDK.Net40.csproj +++ b/OptimizelySDK.Net40/OptimizelySDK.Net40.csproj @@ -151,6 +151,9 @@ Utils\ControlAttributes.cs + + + Utils\ExtensionMethods.cs diff --git a/OptimizelySDK.NetStandard16/OptimizelySDK.NetStandard16.csproj b/OptimizelySDK.NetStandard16/OptimizelySDK.NetStandard16.csproj index 134e5ede..9cb9c3d6 100644 --- a/OptimizelySDK.NetStandard16/OptimizelySDK.NetStandard16.csproj +++ b/OptimizelySDK.NetStandard16/OptimizelySDK.NetStandard16.csproj @@ -49,6 +49,7 @@ + diff --git a/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj b/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj index 61eb932d..5ce0dcc0 100644 --- a/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj +++ b/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj @@ -85,6 +85,7 @@ + diff --git a/OptimizelySDK.Tests/OptimizelyTest.cs b/OptimizelySDK.Tests/OptimizelyTest.cs index 490ef7e7..8755d3c5 100644 --- a/OptimizelySDK.Tests/OptimizelyTest.cs +++ b/OptimizelySDK.Tests/OptimizelyTest.cs @@ -41,7 +41,6 @@ public class OptimizelyTest private Mock ErrorHandlerMock; private Mock EventDispatcherMock; private Optimizely Optimizely; - private IEventDispatcher EventDispatcher; private const string TestUserId = "testUserId"; private OptimizelyHelper Helper; private Mock OptimizelyMock; @@ -740,7 +739,7 @@ public void TestTrackNoAttributesWithDeprecatedEventValue() [Test] public void TestForcedVariationPreceedsWhitelistedVariation() { - var optimizely = new Optimizely(TestData.Datafile, EventDispatcher, LoggerMock.Object, ErrorHandlerMock.Object); + var optimizely = new Optimizely(TestData.Datafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object); var projectConfig = ProjectConfig.Create(TestData.Datafile, LoggerMock.Object, ErrorHandlerMock.Object); Variation expectedVariation1 = projectConfig.GetVariationFromKey("etag3", "vtag5"); Variation expectedVariation2 = projectConfig.GetVariationFromKey("etag3", "vtag6"); @@ -788,7 +787,7 @@ public void TestForcedVariationPreceedsUserProfile() userProfileServiceMock.Setup(_ => _.Lookup(userId)).Returns(userProfile.ToMap()); - var optimizely = new Optimizely(TestData.Datafile, EventDispatcher, LoggerMock.Object, ErrorHandlerMock.Object, userProfileServiceMock.Object); + var optimizely = new Optimizely(TestData.Datafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object, userProfileServiceMock.Object); var projectConfig = ProjectConfig.Create(TestData.Datafile, LoggerMock.Object, ErrorHandlerMock.Object); Variation expectedFbVariation = projectConfig.GetVariationFromKey(experimentKey, fbVariationKey); Variation expectedVariation = projectConfig.GetVariationFromKey(experimentKey, variationKey); diff --git a/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs b/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs new file mode 100644 index 00000000..b1828e0f --- /dev/null +++ b/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs @@ -0,0 +1,18 @@ +using NUnit.Framework; +using OptimizelySDK.Utils; +using System; + +namespace OptimizelySDK.Tests.UtilsTests +{ + public class ExtensionMethodsTest + { + [Test] + public void TestGetAllMessagesReturnsAllInnerExceptionMessages() + { + var exception = new Exception("Outer exception.", new Exception("Inner exception.", new Exception("Second level inner exception."))); + var expectedMessage = "Outer exception. Inner exception. Second level inner exception."; + + Assert.AreEqual(expectedMessage, exception.GetAllMessages()); + } + } +} diff --git a/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs b/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs index 4498e7aa..000604d2 100644 --- a/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs +++ b/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs @@ -15,6 +15,7 @@ */ #if !NET35 && !NET40 using OptimizelySDK.Logger; +using OptimizelySDK.Utils; using System; using System.Net.Http; using System.Threading.Tasks; @@ -63,7 +64,7 @@ private async void DispatchEventAsync(LogEvent logEvent) } catch (Exception ex) { - Logger.Log(LogLevel.ERROR, string.Format("Error Dispatching Event: {0}", ex.Message)); + Logger.Log(LogLevel.ERROR, string.Format("Error Dispatching Event: {0}", ex.GetAllMessages())); } } diff --git a/OptimizelySDK/OptimizelySDK.csproj b/OptimizelySDK/OptimizelySDK.csproj index b021922d..a8a9e1a6 100644 --- a/OptimizelySDK/OptimizelySDK.csproj +++ b/OptimizelySDK/OptimizelySDK.csproj @@ -104,6 +104,7 @@ + diff --git a/OptimizelySDK/Utils/ExtensionMethods.cs b/OptimizelySDK/Utils/ExtensionMethods.cs new file mode 100644 index 00000000..ee2c891b --- /dev/null +++ b/OptimizelySDK/Utils/ExtensionMethods.cs @@ -0,0 +1,27 @@ +using System; +using System.Text; + +namespace OptimizelySDK.Utils +{ + public static class ExtensionMethods + { + public static string GetAllMessages(this Exception exception) + { + StringBuilder sb = new StringBuilder(); + while (exception != null) + { + if (!string.IsNullOrEmpty(exception.Message)) + { + if (sb.Length > 0) + sb.Append(" "); + + sb.Append(exception.Message); + } + + exception = exception.InnerException; + } + + return sb.ToString(); + } + } +} From 761ddbb431cf22a5a9ac87f19df96ae69f5c6b3e Mon Sep 17 00:00:00 2001 From: mfahadahmed Date: Tue, 3 Jul 2018 15:05:43 +0500 Subject: [PATCH 2/5] Added file headers. --- .../UtilsTests/ExtensionMethodsTest.cs | 18 +++++++++++++++++- OptimizelySDK/Utils/ExtensionMethods.cs | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs b/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs index b1828e0f..deeef57c 100644 --- a/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs +++ b/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs @@ -1,4 +1,20 @@ -using NUnit.Framework; +/* + * Copyright 2018, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using NUnit.Framework; using OptimizelySDK.Utils; using System; diff --git a/OptimizelySDK/Utils/ExtensionMethods.cs b/OptimizelySDK/Utils/ExtensionMethods.cs index ee2c891b..a2074148 100644 --- a/OptimizelySDK/Utils/ExtensionMethods.cs +++ b/OptimizelySDK/Utils/ExtensionMethods.cs @@ -1,4 +1,20 @@ -using System; +/* + * Copyright 2018, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; using System.Text; namespace OptimizelySDK.Utils From cdd6add1159a81acd0899956e27baafca11cce08 Mon Sep 17 00:00:00 2001 From: mfahadahmed Date: Thu, 8 Nov 2018 14:41:23 +0500 Subject: [PATCH 3/5] Update headers. --- OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs b/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs index 000604d2..af44bd08 100644 --- a/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs +++ b/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs @@ -1,5 +1,5 @@ /* - * Copyright 2017, Optimizely + * Copyright 2017-2018, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 8450754b75da303886bae42f596f1d9959986015 Mon Sep 17 00:00:00 2001 From: mfahadahmed Date: Fri, 9 Nov 2018 18:02:08 +0500 Subject: [PATCH 4/5] Rename ExtensionMethods class as ExceptionExtensions. --- .../OptimizelySDK.Net35.csproj | 4 ++-- .../OptimizelySDK.Net40.csproj | 4 ++-- .../OptimizelySDK.NetStandard16.csproj | 2 +- .../OptimizelySDK.Tests.csproj | 2 +- ...hodsTest.cs => ExceptionExtensionsTest.cs} | 4 ++-- OptimizelySDK/OptimizelySDK.csproj | 2 +- ...nsionMethods.cs => ExceptionExtensions.cs} | 23 +++++-------------- 7 files changed, 15 insertions(+), 26 deletions(-) rename OptimizelySDK.Tests/UtilsTests/{ExtensionMethodsTest.cs => ExceptionExtensionsTest.cs} (88%) rename OptimizelySDK/Utils/{ExtensionMethods.cs => ExceptionExtensions.cs} (59%) diff --git a/OptimizelySDK.Net35/OptimizelySDK.Net35.csproj b/OptimizelySDK.Net35/OptimizelySDK.Net35.csproj index ba8d19fd..9e0338b1 100644 --- a/OptimizelySDK.Net35/OptimizelySDK.Net35.csproj +++ b/OptimizelySDK.Net35/OptimizelySDK.Net35.csproj @@ -154,8 +154,8 @@ Utils\ControlAttributes.cs - - Utils\ExtensionMethods.cs + + Utils\ExceptionExtensions.cs diff --git a/OptimizelySDK.Net40/OptimizelySDK.Net40.csproj b/OptimizelySDK.Net40/OptimizelySDK.Net40.csproj index 0202eab8..ddda8411 100644 --- a/OptimizelySDK.Net40/OptimizelySDK.Net40.csproj +++ b/OptimizelySDK.Net40/OptimizelySDK.Net40.csproj @@ -155,8 +155,8 @@ Utils\ControlAttributes.cs - - Utils\ExtensionMethods.cs + + Utils\ExceptionExtensions.cs diff --git a/OptimizelySDK.NetStandard16/OptimizelySDK.NetStandard16.csproj b/OptimizelySDK.NetStandard16/OptimizelySDK.NetStandard16.csproj index d1c18d4b..be4ee867 100644 --- a/OptimizelySDK.NetStandard16/OptimizelySDK.NetStandard16.csproj +++ b/OptimizelySDK.NetStandard16/OptimizelySDK.NetStandard16.csproj @@ -50,7 +50,7 @@ - + diff --git a/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj b/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj index f26e9019..4d28d6b9 100644 --- a/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj +++ b/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj @@ -85,7 +85,7 @@ - + diff --git a/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs b/OptimizelySDK.Tests/UtilsTests/ExceptionExtensionsTest.cs similarity index 88% rename from OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs rename to OptimizelySDK.Tests/UtilsTests/ExceptionExtensionsTest.cs index deeef57c..6d9a1a0b 100644 --- a/OptimizelySDK.Tests/UtilsTests/ExtensionMethodsTest.cs +++ b/OptimizelySDK.Tests/UtilsTests/ExceptionExtensionsTest.cs @@ -20,13 +20,13 @@ namespace OptimizelySDK.Tests.UtilsTests { - public class ExtensionMethodsTest + public class ExceptionExtensionsTest { [Test] public void TestGetAllMessagesReturnsAllInnerExceptionMessages() { var exception = new Exception("Outer exception.", new Exception("Inner exception.", new Exception("Second level inner exception."))); - var expectedMessage = "Outer exception. Inner exception. Second level inner exception."; + var expectedMessage = "Outer exception.\nInner exception.\nSecond level inner exception."; Assert.AreEqual(expectedMessage, exception.GetAllMessages()); } diff --git a/OptimizelySDK/OptimizelySDK.csproj b/OptimizelySDK/OptimizelySDK.csproj index add0d1c9..12d5ea0b 100644 --- a/OptimizelySDK/OptimizelySDK.csproj +++ b/OptimizelySDK/OptimizelySDK.csproj @@ -105,7 +105,7 @@ - + diff --git a/OptimizelySDK/Utils/ExtensionMethods.cs b/OptimizelySDK/Utils/ExceptionExtensions.cs similarity index 59% rename from OptimizelySDK/Utils/ExtensionMethods.cs rename to OptimizelySDK/Utils/ExceptionExtensions.cs index a2074148..7df8bab9 100644 --- a/OptimizelySDK/Utils/ExtensionMethods.cs +++ b/OptimizelySDK/Utils/ExceptionExtensions.cs @@ -15,29 +15,18 @@ */ using System; -using System.Text; namespace OptimizelySDK.Utils { - public static class ExtensionMethods + public static class ExceptionExtensions { - public static string GetAllMessages(this Exception exception) + public static string GetAllMessages(this Exception exception, string separator = "\n") { - StringBuilder sb = new StringBuilder(); - while (exception != null) - { - if (!string.IsNullOrEmpty(exception.Message)) - { - if (sb.Length > 0) - sb.Append(" "); + if (exception.InnerException == null) + return exception.Message; - sb.Append(exception.Message); - } - - exception = exception.InnerException; - } - - return sb.ToString(); + return (string.IsNullOrEmpty(exception.Message) ? "" : string.Format("{0}{1}", exception.Message, separator)) + + GetAllMessages(exception.InnerException, separator); } } } From 0b05a04e9548f81b17add1e06d2329a23e030872 Mon Sep 17 00:00:00 2001 From: Sohail Hussain Date: Fri, 15 Feb 2019 12:26:37 -0800 Subject: [PATCH 5/5] Updated headers. --- OptimizelySDK.Tests/UtilsTests/ExceptionExtensionsTest.cs | 2 +- OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs | 2 +- OptimizelySDK/Utils/ExceptionExtensions.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OptimizelySDK.Tests/UtilsTests/ExceptionExtensionsTest.cs b/OptimizelySDK.Tests/UtilsTests/ExceptionExtensionsTest.cs index 6d9a1a0b..9eb1020b 100644 --- a/OptimizelySDK.Tests/UtilsTests/ExceptionExtensionsTest.cs +++ b/OptimizelySDK.Tests/UtilsTests/ExceptionExtensionsTest.cs @@ -1,5 +1,5 @@ /* - * Copyright 2018, Optimizely + * Copyright 2019, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs b/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs index af44bd08..8dbbfbbb 100644 --- a/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs +++ b/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018, Optimizely + * Copyright 2017, 2019, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/OptimizelySDK/Utils/ExceptionExtensions.cs b/OptimizelySDK/Utils/ExceptionExtensions.cs index 7df8bab9..45c04e45 100644 --- a/OptimizelySDK/Utils/ExceptionExtensions.cs +++ b/OptimizelySDK/Utils/ExceptionExtensions.cs @@ -1,5 +1,5 @@ /* - * Copyright 2018, Optimizely + * Copyright 2019, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.