From 3f3e301f20c5ee5612a12e7dbe129b40d5e23c74 Mon Sep 17 00:00:00 2001
From: muhammadnoman <muhammadnoman@folio3.com>
Date: Wed, 27 Jan 2021 22:30:24 +0500
Subject: [PATCH 1/2] SendImpressionEvent will return false when event is not
 sent

---
 OptimizelySDK/Optimizely.cs | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/OptimizelySDK/Optimizely.cs b/OptimizelySDK/Optimizely.cs
index c52bdbd7..c61d8b70 100644
--- a/OptimizelySDK/Optimizely.cs
+++ b/OptimizelySDK/Optimizely.cs
@@ -811,8 +811,7 @@ internal OptimizelyDecision Decide(OptimizelyUserContext user,
             var decisionSource = flagDecisionResult.ResultObject?.Source ?? FeatureDecision.DECISION_SOURCE_ROLLOUT;
             if (!allOptions.Contains(OptimizelyDecideOption.DISABLE_DECISION_EVENT))
             {
-                SendImpressionEvent(flagDecisionResult.ResultObject?.Experiment, variation, userId, userAttributes, config, key, decisionSource, featureEnabled);
-                decisionEventDispatched = true;
+                decisionEventDispatched = SendImpressionEvent(flagDecisionResult.ResultObject?.Experiment, variation, userId, userAttributes, config, key, decisionSource, featureEnabled);
             }
             var decisionReasons = flagDecisionResult.DecisionReasons;
             var reasonsToReport = decisionReasons.ToReport(allOptions.Contains(OptimizelyDecideOption.INCLUDE_REASONS));
@@ -929,7 +928,7 @@ private void SendImpressionEvent(Experiment experiment, Variation variation, str
         /// <param name="userAttributes">The user's attributes</param>
         /// <param name="flagKey">It can either be experiment key in case if ruleType is experiment or it's feature key in case ruleType is feature-test or rollout</param>
         /// <param name="ruleType">It can either be experiment in case impression event is sent from activate or it's feature-test or rollout</param>
-        private void SendImpressionEvent(Experiment experiment, Variation variation, string userId,
+        private bool SendImpressionEvent(Experiment experiment, Variation variation, string userId,
                                          UserAttributes userAttributes, ProjectConfig config,
                                          string flagKey, string ruleType, bool enabled)
         {
@@ -941,7 +940,7 @@ private void SendImpressionEvent(Experiment experiment, Variation variation, str
             var userEvent = UserEventFactory.CreateImpressionEvent(config, experiment, variation, userId, userAttributes, flagKey, ruleType, enabled);
             if (userEvent == null)
             {
-                return;
+                return false;
             }
             EventProcessor.Process(userEvent);
 
@@ -958,6 +957,7 @@ private void SendImpressionEvent(Experiment experiment, Variation variation, str
                 NotificationCenter.SendNotifications(NotificationCenter.NotificationType.Activate, experiment, userId,
                 userAttributes, variation, impressionEvent);
             }
+            return true;
         }
 
         /// <summary>

From 9db1a1a150c4779f49d56c59b97539b6c2e63280 Mon Sep 17 00:00:00 2001
From: Sohail Hussain <mirza.sohailhussain@gmail.com>
Date: Thu, 28 Jan 2021 15:26:29 -0800
Subject: [PATCH 2/2] notification should pass array

---
 OptimizelySDK.Tests/OptimizelyUserContextTest.cs | 2 +-
 OptimizelySDK/Optimizely.cs                      | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/OptimizelySDK.Tests/OptimizelyUserContextTest.cs b/OptimizelySDK.Tests/OptimizelyUserContextTest.cs
index c6e7e387..6d9630ca 100644
--- a/OptimizelySDK.Tests/OptimizelyUserContextTest.cs
+++ b/OptimizelySDK.Tests/OptimizelyUserContextTest.cs
@@ -654,7 +654,7 @@ public void TestDecisionNotification()
             var enabled = true;
             var variables = Optimizely.GetAllFeatureVariables(flagKey, UserID);
             var ruleKey = "test_experiment_with_feature_rollout";
-            var reasons = new Dictionary<string, object>();
+            var reasons = new string[] { };
             var user = Optimizely.CreateUserContext(UserID);
             user.SetAttribute("browser_type", "chrome");
 
diff --git a/OptimizelySDK/Optimizely.cs b/OptimizelySDK/Optimizely.cs
index c61d8b70..5aae0da4 100644
--- a/OptimizelySDK/Optimizely.cs
+++ b/OptimizelySDK/Optimizely.cs
@@ -814,7 +814,7 @@ internal OptimizelyDecision Decide(OptimizelyUserContext user,
                 decisionEventDispatched = SendImpressionEvent(flagDecisionResult.ResultObject?.Experiment, variation, userId, userAttributes, config, key, decisionSource, featureEnabled);
             }
             var decisionReasons = flagDecisionResult.DecisionReasons;
-            var reasonsToReport = decisionReasons.ToReport(allOptions.Contains(OptimizelyDecideOption.INCLUDE_REASONS));
+            var reasonsToReport = decisionReasons.ToReport(allOptions.Contains(OptimizelyDecideOption.INCLUDE_REASONS)).ToArray();
             var variationKey = flagDecisionResult.ResultObject?.Variation?.Key;
 
             // TODO: add ruleKey values when available later. use a copy of experimentKey until then.
@@ -827,7 +827,7 @@ internal OptimizelyDecision Decide(OptimizelyUserContext user,
                 { "variables", variableMap },
                 { "variationKey", variationKey },
                 { "ruleKey", ruleKey },
-                { "reasons", decisionReasons },
+                { "reasons", reasonsToReport },
                 { "decisionEventDispatched", decisionEventDispatched }
             };
 
@@ -841,7 +841,7 @@ internal OptimizelyDecision Decide(OptimizelyUserContext user,
                 ruleKey,
                 key,
                 user,
-                reasonsToReport.ToArray());
+                reasonsToReport);
         }
 
         internal Dictionary<string, OptimizelyDecision> DecideAll(OptimizelyUserContext user,