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]
diff --git a/OptimizelySDK/OptimizelyUserContext.cs b/OptimizelySDK/OptimizelyUserContext.cs
index 77471d1d..aca35788 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.
@@ -46,6 +46,8 @@ public OptimizelyUserContext(Optimizely optimizely, string userId, UserAttribute
UserId = userId;
}
+ private OptimizelyUserContext Copy() => new OptimizelyUserContext(Optimizely, UserId, GetAttributes(), 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 = Copy();
+ 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 = Copy();
+ 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 = Copy();
+ return Optimizely.DecideAll(optimizelyUserContext, options);
}
///