From b201124f5b8aa38464d1bf6df0b55d5e7f354180 Mon Sep 17 00:00:00 2001 From: muhammadnoman Date: Tue, 12 Jan 2021 21:08:41 +0500 Subject: [PATCH 1/4] Cloned OptimizelyUserContext to maintain the same state in case of any modifications. --- OptimizelySDK/OptimizelyUserContext.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/OptimizelySDK/OptimizelyUserContext.cs b/OptimizelySDK/OptimizelyUserContext.cs index 77471d1d..8538506e 100644 --- a/OptimizelySDK/OptimizelyUserContext.cs +++ b/OptimizelySDK/OptimizelyUserContext.cs @@ -46,6 +46,8 @@ public OptimizelyUserContext(Optimizely optimizely, string userId, UserAttribute UserId = userId; } + private OptimizelyUserContext Clone() => new OptimizelyUserContext(Optimizely, UserId, Attributes, ErrorHandler, Logger); + /// /// Returns Optimizely instance associated with the UserContext. /// @@ -123,7 +125,8 @@ public OptimizelyDecision Decide(string key) public OptimizelyDecision Decide(string key, OptimizelyDecideOption[] options) { - return Optimizely.Decide(this, key, options); + var optimizelyUserContext = Clone(); + return Optimizely.Decide(optimizelyUserContext, key, options); } /// @@ -133,7 +136,8 @@ public OptimizelyDecision Decide(string key, /// A dictionary of all decision results, mapped by flag keys. public Dictionary DecideForKeys(string[] keys, OptimizelyDecideOption[] options) { - return Optimizely.DecideForKeys(this, keys, options); + var optimizelyUserContext = Clone(); + return Optimizely.DecideForKeys(optimizelyUserContext, keys, options); } /// @@ -162,7 +166,8 @@ public Dictionary DecideAll() /// All decision results mapped by flag keys. public Dictionary DecideAll(OptimizelyDecideOption[] options) { - return Optimizely.DecideAll(this, options); + var optimizelyUserContext = Clone(); + return Optimizely.DecideAll(optimizelyUserContext, options); } /// From 18889ae1d348500a9694c339a27ea34e7162ea4f Mon Sep 17 00:00:00 2001 From: muhammadnoman Date: Tue, 12 Jan 2021 21:10:50 +0500 Subject: [PATCH 2/4] updated header --- OptimizelySDK/OptimizelyUserContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OptimizelySDK/OptimizelyUserContext.cs b/OptimizelySDK/OptimizelyUserContext.cs index 8538506e..d2aa5ea4 100644 --- a/OptimizelySDK/OptimizelyUserContext.cs +++ b/OptimizelySDK/OptimizelyUserContext.cs @@ -1,5 +1,5 @@ /* - * Copyright 2020, Optimizely + * Copyright 2020-2021, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 5642d4876afdc2434ddd2f6539bc0e389ae62865 Mon Sep 17 00:00:00 2001 From: muhammadnoman Date: Tue, 12 Jan 2021 21:15:50 +0500 Subject: [PATCH 3/4] Updated testcases to compare object should not be equal but content should --- .../OptimizelyUserContextTest.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/OptimizelySDK.Tests/OptimizelyUserContextTest.cs b/OptimizelySDK.Tests/OptimizelyUserContextTest.cs index 3ee5c22d..ae5ff887 100644 --- a/OptimizelySDK.Tests/OptimizelyUserContextTest.cs +++ b/OptimizelySDK.Tests/OptimizelyUserContextTest.cs @@ -1,6 +1,6 @@ /** * - * Copyright 2020, Optimizely and contributors + * Copyright 2020-2021, Optimizely and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -181,7 +181,8 @@ public void TestDecide() Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected.ToDictionary()); Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate"); Assert.AreEqual(decision.FlagKey, flagKey); - Assert.AreEqual(decision.UserContext, user); + Assert.AreNotEqual(decision.UserContext, user); + Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user)); Assert.AreEqual(decision.Reasons.Length, 0); } @@ -551,7 +552,8 @@ public void DecideExcludeVariablesDecideOptions() Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected); Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate"); Assert.AreEqual(decision.FlagKey, flagKey); - Assert.AreEqual(decision.UserContext, user); + Assert.AreNotEqual(decision.UserContext, user); + Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user)); Assert.True(decision.Reasons.IsNullOrEmpty()); } @@ -580,7 +582,8 @@ public void DecideIncludeReasonsDecideOptions() Assert.False(decision.Enabled); Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate"); Assert.AreEqual(decision.FlagKey, flagKey); - Assert.AreEqual(decision.UserContext, user); + Assert.AreNotEqual(decision.UserContext, user); + Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user)); Assert.True(decision.Reasons.IsNullOrEmpty()); decision = user.Decide(flagKey, decideOptions); @@ -611,7 +614,8 @@ public void TestDoNotSendEventDecide() Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected.ToDictionary()); Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate"); Assert.AreEqual(decision.FlagKey, flagKey); - Assert.AreEqual(decision.UserContext, user); + Assert.AreNotEqual(decision.UserContext, user); + Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user)); } [Test] @@ -638,7 +642,8 @@ public void TestDefaultDecideOptions() Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected.ToDictionary()); Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate"); Assert.AreEqual(decision.FlagKey, flagKey); - Assert.AreEqual(decision.UserContext, user); + Assert.AreNotEqual(decision.UserContext, user); + Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user)); } [Test] From 2358d1fc0359eeece5e6eec976d95eab98399ce5 Mon Sep 17 00:00:00 2001 From: muhammadnoman Date: Wed, 13 Jan 2021 13:51:48 +0500 Subject: [PATCH 4/4] Renamed clone to copy and using GetAttributes in it directly --- OptimizelySDK/OptimizelyUserContext.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OptimizelySDK/OptimizelyUserContext.cs b/OptimizelySDK/OptimizelyUserContext.cs index d2aa5ea4..aca35788 100644 --- a/OptimizelySDK/OptimizelyUserContext.cs +++ b/OptimizelySDK/OptimizelyUserContext.cs @@ -46,7 +46,7 @@ public OptimizelyUserContext(Optimizely optimizely, string userId, UserAttribute UserId = userId; } - private OptimizelyUserContext Clone() => new OptimizelyUserContext(Optimizely, UserId, Attributes, ErrorHandler, Logger); + private OptimizelyUserContext Copy() => new OptimizelyUserContext(Optimizely, UserId, GetAttributes(), ErrorHandler, Logger); /// /// Returns Optimizely instance associated with the UserContext. @@ -125,7 +125,7 @@ public OptimizelyDecision Decide(string key) public OptimizelyDecision Decide(string key, OptimizelyDecideOption[] options) { - var optimizelyUserContext = Clone(); + var optimizelyUserContext = Copy(); return Optimizely.Decide(optimizelyUserContext, key, options); } @@ -136,7 +136,7 @@ public OptimizelyDecision Decide(string key, /// A dictionary of all decision results, mapped by flag keys. public Dictionary DecideForKeys(string[] keys, OptimizelyDecideOption[] options) { - var optimizelyUserContext = Clone(); + var optimizelyUserContext = Copy(); return Optimizely.DecideForKeys(optimizelyUserContext, keys, options); } @@ -166,7 +166,7 @@ public Dictionary DecideAll() /// All decision results mapped by flag keys. public Dictionary DecideAll(OptimizelyDecideOption[] options) { - var optimizelyUserContext = Clone(); + var optimizelyUserContext = Copy(); return Optimizely.DecideAll(optimizelyUserContext, options); }