diff --git a/OptimizelySDK.Tests/OptimizelyTest.cs b/OptimizelySDK.Tests/OptimizelyTest.cs index b961a560..c65cb7b6 100644 --- a/OptimizelySDK.Tests/OptimizelyTest.cs +++ b/OptimizelySDK.Tests/OptimizelyTest.cs @@ -198,18 +198,18 @@ public void TestCreateUserContext() { "location", "San Francisco" } }; var optlyUserContext = Optimizely.CreateUserContext(TestUserId, attribute); - Assert.AreEqual(TestUserId, optlyUserContext.UserId); - Assert.AreEqual(Optimizely, optlyUserContext.Optimizely); - Assert.AreEqual(attribute, optlyUserContext.Attributes); + Assert.AreEqual(TestUserId, optlyUserContext.GetUserId()); + Assert.AreEqual(Optimizely, optlyUserContext.GetOptimizely()); + Assert.AreEqual(attribute, optlyUserContext.GetAttributes()); } [Test] public void TestCreateUserContextWithoutAttributes() { var optlyUserContext = Optimizely.CreateUserContext(TestUserId); - Assert.AreEqual(TestUserId, optlyUserContext.UserId); - Assert.AreEqual(Optimizely, optlyUserContext.Optimizely); - Assert.IsTrue(optlyUserContext.Attributes.Count == 0); + Assert.AreEqual(TestUserId, optlyUserContext.GetUserId()); + Assert.AreEqual(Optimizely, optlyUserContext.GetOptimizely()); + Assert.IsTrue(optlyUserContext.GetAttributes().Count == 0); } [Test] @@ -230,13 +230,13 @@ public void TestCreateUserContextMultipleAttribute() }; var optlyUserContext2 = Optimizely.CreateUserContext("userId2", attribute2); - Assert.AreEqual("userId1", optlyUserContext1.UserId); - Assert.AreEqual(Optimizely, optlyUserContext1.Optimizely); - Assert.AreEqual(attribute1, optlyUserContext1.Attributes); + Assert.AreEqual("userId1", optlyUserContext1.GetUserId()); + Assert.AreEqual(Optimizely, optlyUserContext1.GetOptimizely()); + Assert.AreEqual(attribute1, optlyUserContext1.GetAttributes()); - Assert.AreEqual("userId2", optlyUserContext2.UserId); - Assert.AreEqual(Optimizely, optlyUserContext2.Optimizely); - Assert.AreEqual(attribute2, optlyUserContext2.Attributes); + Assert.AreEqual("userId2", optlyUserContext2.GetUserId()); + Assert.AreEqual(Optimizely, optlyUserContext2.GetOptimizely()); + Assert.AreEqual(attribute2, optlyUserContext2.GetAttributes()); } [Test] @@ -249,9 +249,9 @@ public void TestChangeAttributeDoesNotEffectValues() { "location", "San Francisco" } }; var optlyUserContext = Optimizely.CreateUserContext(userId, attribute); - Assert.AreEqual(TestUserId, optlyUserContext.UserId); - Assert.AreEqual(Optimizely, optlyUserContext.Optimizely); - Assert.AreEqual(attribute, optlyUserContext.Attributes); + Assert.AreEqual(TestUserId, optlyUserContext.GetUserId()); + Assert.AreEqual(Optimizely, optlyUserContext.GetOptimizely()); + Assert.AreEqual(attribute, optlyUserContext.GetAttributes()); attribute = new UserAttributes { @@ -259,10 +259,9 @@ public void TestChangeAttributeDoesNotEffectValues() { "level", "low" }, { "location", "San Francisco" } }; - userId = "InvalidUser"; - Assert.AreEqual("testUserId", optlyUserContext.UserId); - Assert.AreEqual(Optimizely, optlyUserContext.Optimizely); - Assert.AreNotEqual(attribute, optlyUserContext.Attributes); + Assert.AreEqual("testUserId", optlyUserContext.GetUserId()); + Assert.AreEqual(Optimizely, optlyUserContext.GetOptimizely()); + Assert.AreNotEqual(attribute, optlyUserContext.GetAttributes()); } #endregion diff --git a/OptimizelySDK.Tests/OptimizelyUserContextTest.cs b/OptimizelySDK.Tests/OptimizelyUserContextTest.cs index 75c37ab8..3ee5c22d 100644 --- a/OptimizelySDK.Tests/OptimizelyUserContextTest.cs +++ b/OptimizelySDK.Tests/OptimizelyUserContextTest.cs @@ -65,9 +65,9 @@ public void OptimizelyUserContextWithAttributes() var attributes = new UserAttributes() { { "house", "GRYFFINDOR" } }; OptimizelyUserContext user = new OptimizelyUserContext(Optimizely, UserID, attributes, ErrorHandlerMock.Object, LoggerMock.Object); - Assert.AreEqual(user.Optimizely, Optimizely); - Assert.AreEqual(user.UserId, UserID); - Assert.AreEqual(user.Attributes, attributes); + Assert.AreEqual(user.GetOptimizely(), Optimizely); + Assert.AreEqual(user.GetUserId(), UserID); + Assert.AreEqual(user.GetAttributes(), attributes); } [Test] @@ -75,9 +75,9 @@ public void OptimizelyUserContextNoAttributes() { OptimizelyUserContext user = new OptimizelyUserContext(Optimizely, UserID, null, ErrorHandlerMock.Object, LoggerMock.Object); - Assert.AreEqual(user.Optimizely, Optimizely); - Assert.AreEqual(user.UserId, UserID); - Assert.True(user.Attributes.Count == 0); + Assert.AreEqual(user.GetOptimizely(), Optimizely); + Assert.AreEqual(user.GetUserId(), UserID); + Assert.True(user.GetAttributes().Count == 0); } [Test] @@ -91,9 +91,9 @@ public void SetAttribute() user.SetAttribute("k3", 100); user.SetAttribute("k4", 3.5); - Assert.AreEqual(user.Optimizely, Optimizely); - Assert.AreEqual(user.UserId, UserID); - var newAttributes = user.Attributes; + Assert.AreEqual(user.GetOptimizely(), Optimizely); + Assert.AreEqual(user.GetUserId(), UserID); + var newAttributes = user.GetAttributes(); Assert.AreEqual(newAttributes["house"], "GRYFFINDOR"); Assert.AreEqual(newAttributes["k1"], "v1"); Assert.AreEqual(newAttributes["k2"], true); @@ -109,9 +109,9 @@ public void SetAttributeNoAttribute() user.SetAttribute("k1", "v1"); user.SetAttribute("k2", true); - Assert.AreEqual(user.Optimizely, Optimizely); - Assert.AreEqual(user.UserId, UserID); - var newAttributes = user.Attributes; + Assert.AreEqual(user.GetOptimizely(), Optimizely); + Assert.AreEqual(user.GetUserId(), UserID); + var newAttributes = user.GetAttributes(); Assert.AreEqual(newAttributes["k1"], "v1"); Assert.AreEqual(newAttributes["k2"], true); } @@ -125,7 +125,7 @@ public void SetAttributeOverride() user.SetAttribute("k1", "v1"); user.SetAttribute("house", "v2"); - var newAttributes = user.Attributes; + var newAttributes = user.GetAttributes(); Assert.AreEqual(newAttributes["k1"], "v1"); Assert.AreEqual(newAttributes["house"], "v2"); } @@ -136,15 +136,15 @@ public void SetAttributeNullValue() var attributes = new UserAttributes() { { "k1", null } }; OptimizelyUserContext user = new OptimizelyUserContext(Optimizely, UserID, attributes, ErrorHandlerMock.Object, LoggerMock.Object); - var newAttributes = user.Attributes; + var newAttributes = user.GetAttributes(); Assert.AreEqual(newAttributes["k1"], null); user.SetAttribute("k1", true); - newAttributes = user.Attributes; + newAttributes = user.GetAttributes(); Assert.AreEqual(newAttributes["k1"], true); user.SetAttribute("k1", null); - newAttributes = user.Attributes; + newAttributes = user.GetAttributes(); Assert.AreEqual(newAttributes["k1"], null); } @@ -154,14 +154,14 @@ public void SetAttributeToOverrideAttribute() OptimizelyUserContext user = new OptimizelyUserContext(Optimizely, UserID, null, ErrorHandlerMock.Object, LoggerMock.Object); - Assert.AreEqual(user.Optimizely, Optimizely); - Assert.AreEqual(user.UserId, UserID); + Assert.AreEqual(user.GetOptimizely(), Optimizely); + Assert.AreEqual(user.GetUserId(), UserID); user.SetAttribute("k1", "v1"); - Assert.AreEqual(user.Attributes["k1"], "v1"); + Assert.AreEqual(user.GetAttributes()["k1"], "v1"); user.SetAttribute("k1", true); - Assert.AreEqual(user.Attributes["k1"], true); + Assert.AreEqual(user.GetAttributes()["k1"], true); } #region decide diff --git a/OptimizelySDK/Entity/UserAttributes.cs b/OptimizelySDK/Entity/UserAttributes.cs index f6df4cf0..c11e1009 100644 --- a/OptimizelySDK/Entity/UserAttributes.cs +++ b/OptimizelySDK/Entity/UserAttributes.cs @@ -1,5 +1,5 @@ /* - * Copyright 2017-2018, Optimizely + * Copyright 2017-2018,2020, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,12 +14,17 @@ * limitations under the License. */ using System.Collections.Generic; -using OptimizelySDK.Logger; namespace OptimizelySDK.Entity { public class UserAttributes : Dictionary { - + public UserAttributes() : base() + { + } + + public UserAttributes(IDictionary dictionary) : base(dictionary) + { + } } } diff --git a/OptimizelySDK/Optimizely.cs b/OptimizelySDK/Optimizely.cs index b78f90f3..85ab8187 100644 --- a/OptimizelySDK/Optimizely.cs +++ b/OptimizelySDK/Optimizely.cs @@ -741,7 +741,7 @@ internal OptimizelyDecision Decide(OptimizelyUserContext user, ErrorHandler, Logger); } - var userId = user?.UserId; + var userId = user?.GetUserId(); var flag = config.GetFeatureFlagFromKey(key); if (string.IsNullOrEmpty(flag.Key)) @@ -752,8 +752,7 @@ internal OptimizelyDecision Decide(OptimizelyUserContext user, ErrorHandler, Logger); } - var userAttributes = user.Attributes; - + var userAttributes = user.GetAttributes(); var decisionEventDispatched = false; var allOptions = GetAllOptions(options); var decisionReasons = DefaultDecisionReasons.NewInstance(allOptions); @@ -864,7 +863,6 @@ internal Dictionary DecideAll(OptimizelyUserContext return DecideForKeys(user, allFlagKeys, options); } - internal Dictionary DecideForKeys(OptimizelyUserContext user, string[] keys, OptimizelyDecideOption[] options) diff --git a/OptimizelySDK/OptimizelyUserContext.cs b/OptimizelySDK/OptimizelyUserContext.cs index 7aca6751..77471d1d 100644 --- a/OptimizelySDK/OptimizelyUserContext.cs +++ b/OptimizelySDK/OptimizelyUserContext.cs @@ -31,11 +31,11 @@ public class OptimizelyUserContext private IErrorHandler ErrorHandler; private object mutex = new object(); // userID for Optimizely user context - public string UserId { get; } + private string UserId; // user attributes for Optimizely user context. - public UserAttributes Attributes { get; } + private UserAttributes Attributes; // Optimizely object to be used. - public Optimizely Optimizely { get; } + private Optimizely Optimizely; public OptimizelyUserContext(Optimizely optimizely, string userId, UserAttributes userAttributes, IErrorHandler errorHandler, ILogger logger) { @@ -46,6 +46,38 @@ public OptimizelyUserContext(Optimizely optimizely, string userId, UserAttribute UserId = userId; } + /// + /// Returns Optimizely instance associated with the UserContext. + /// + /// Optimizely instance. + public Optimizely GetOptimizely() + { + return Optimizely; + } + + /// + /// Returns UserId associated with the UserContext + /// + /// UserId of this instance. + public string GetUserId() + { + return UserId; + } + + /// + /// Returns copy of UserAttributes associated with UserContext. + /// + /// copy of UserAttributes. + public UserAttributes GetAttributes() + { + UserAttributes copiedAttributes = null; + lock(mutex) { + copiedAttributes = new UserAttributes(Attributes); + } + + return copiedAttributes; + } + /// /// Set an attribute for a given key. ///