/// <summary> /// Allocate Campaign based on userStorageMap, trafficAllocation by computing userHash for userId and provided CampaignTKey. /// </summary> /// <param name="settings"></param> /// <param name="userStorageMap"></param> /// <param name="campaignKey"></param> /// <param name="userId"></param> /// <param name="apiName">Api name which called this implementation, Activate/GetVariation/Track. This is for logging purpose.</param> /// <returns></returns> public BucketedCampaign Allocate(AccountSettings settings, UserStorageMap userStorageMap, string campaignKey, string userId, string apiName = null) { BucketedCampaign allocatedCampaign = null; BucketedCampaign requestedCampaign = settings.Campaigns.Find((campaign) => campaign.Key.Equals(campaignKey)); if (requestedCampaign != null) { allocatedCampaign = AllocateCampaign(userId, campaignKey, userStorageMap, requestedCampaign); if (allocatedCampaign != null) { if (allocatedCampaign.Status.Equals(Constants.Campaign.STATUS_RUNNING, System.StringComparison.InvariantCultureIgnoreCase)) { LogInfoMessage.UserEligibilityForCampaign(file, userId, true); return(allocatedCampaign); } } } LogErrorMessage.CampaignNotRunning(file, campaignKey, apiName); LogInfoMessage.UserEligibilityForCampaign(file, userId, false); LogDebugMessage.UserNotPartOfCampaign(file, userId, campaignKey, nameof(Allocate)); return(null); }
public void Set(UserStorageMap userStorageMap) { if (_userStorageMap.TryGetValue(userStorageMap.CampaignKey, out ConcurrentDictionary <string, string> userMap) == false) { userMap = new ConcurrentDictionary <string, string>(); _userStorageMap[userStorageMap.CampaignKey] = userMap; } userMap[userStorageMap.UserId] = userStorageMap.VariationName; SaveAsync(); }
private bool Verify(UserStorageMap val) { if (val != null) { if (val.CampaignKey.Equals(MockCampaignKey) && val.UserId.Equals(MockUserId) && val.VariationName.Equals(MockVariationName)) { return(true); } } return(false); }
public void Allocate_Should_Return_Null_When_InValid_CampaignKey_Is_Provided() { var mockUserHasher = MockUserHasher.Get(); var campaignResolver = GetCampaignResolver(mockUserHasher); UserStorageMap userStorageMap = null; var selectedCampaign = campaignResolver.Allocate(GetAccountSettings(status: "RUNNING"), userStorageMap, MockCampaignKey + MockCampaignKey, MockUserId); Assert.Null(selectedCampaign); mockUserHasher.Verify(mock => mock.ComputeBucketValue(It.IsAny <string>(), It.IsAny <double>(), It.IsAny <double>()), Times.Never); }
public void Allocate_Should_Return_Null_When_Valid_UserStorageMap_With_Valid_Campaign_Is_Given_And_Campaign_Is_Not_Running() { var mockUserHasher = MockUserHasher.Get(); var campaignResolver = GetCampaignResolver(mockUserHasher); UserStorageMap userStorageMap = new UserStorageMap(MockUserId, MockCampaignKey, MockVariationName); var selectedCampaign = campaignResolver.Allocate(GetAccountSettings(status: "NOT_RUNNING"), userStorageMap, MockCampaignKey, MockUserId); Assert.Null(selectedCampaign); mockUserHasher.Verify(mock => mock.ComputeBucketValue(It.IsAny <string>(), It.IsAny <double>(), It.IsAny <double>()), Times.Never); }
public void Allocate_Should_Return_Null_When_Valid_UserStorageMap_With_InValid_Variation_Is_Given() { var mockUserHasher = MockUserHasher.Get(); VariationAllocator variationResolver = GetVariationResolver(mockUserHasher); UserStorageMap userStorageMap = new UserStorageMap(MockUserId, MockCampaignKey, MockVariationName + MockVariationName); var selectedVariation = variationResolver.Allocate(userStorageMap, GetCampaign(MockCampaignKey), MockUserId); Assert.Null(selectedVariation); mockUserHasher.Verify(mock => mock.ComputeBucketValue(It.IsAny <string>(), It.IsAny <double>(), It.IsAny <double>()), Times.Never); }
public void Allocate_Should_Return_Null_Audience_Condition_Not_Met() { var mockUserHasher = Mock.GetUserHasher(); Mock.SetupCompute(mockUserHasher, returnVal: 80); CampaignAllocator campaignResolver = GetCampaignResolver(mockUserHasher); UserStorageMap userStorageMap = null; var selectedCampaign = campaignResolver.Allocate(GetAccountSettings(), userStorageMap, MockCampaignKey, MockUserId); Assert.Null(selectedCampaign); mockUserHasher.Verify(mock => mock.ComputeBucketValue(It.IsAny <string>(), It.IsAny <double>(), It.IsAny <double>()), Times.Once); mockUserHasher.Verify(mock => mock.ComputeBucketValue(It.Is <string>((val) => MockUserId.Equals(val)), It.Is <double>((val) => 100 == val), It.Is <double>(val => 1 == val)), Times.Once); }
/// <summary> /// Allocate Campaign based on userStorageMap, of if userStorageMap is not present based on trafficAllocation. /// </summary> /// <param name="userId"></param> /// <param name="campaignKey"></param> /// <param name="userStorageMap"></param> /// <param name="requestedCampaign"></param> /// <returns></returns> private BucketedCampaign AllocateCampaign(string userId, string campaignKey, UserStorageMap userStorageMap, BucketedCampaign requestedCampaign) { BucketedCampaign allocatedCampaign = null; LogDebugMessage.CheckUserEligibilityForCampaign(file, campaignKey, requestedCampaign.PercentTraffic, userId); if (userStorageMap == null) { allocatedCampaign = AllocateByTrafficAllocation(userId, requestedCampaign); } else if (userStorageMap.CampaignKey.Equals(requestedCampaign.Key)) { allocatedCampaign = requestedCampaign; } return(allocatedCampaign); }
public void Allocate_Should_Compute_Hash_When_UserStorageMap_Is_Null() { var mockUserHasher = Mock.GetUserHasher(); Mock.SetupComputeBucketValue(mockUserHasher, returnVal: 10, outHashValue: 1234567); VariationAllocator variationResolver = GetVariationResolver(mockUserHasher); UserStorageMap userStorageMap = null; var selectedVariation = variationResolver.Allocate(userStorageMap, GetCampaign(MockCampaignKey), MockUserId); Assert.NotNull(selectedVariation); Assert.Equal(MockVariationName, selectedVariation.Name); mockUserHasher.Verify(mock => mock.ComputeBucketValue(It.IsAny <string>(), It.IsAny <double>(), It.IsAny <double>()), Times.Once); mockUserHasher.Verify(mock => mock.ComputeBucketValue(It.Is <string>((val) => MockUserId.Equals(val)), It.Is <double>((val) => 10000 == val), It.Is <double>(val => 1 == val)), Times.Once); }
public void Set(UserStorageMap userStorageMap) { if (_userStorageMap.TryGetValue(userStorageMap.CampaignKey, out ConcurrentDictionary <string, Dictionary <string, string> > userMap) == false) { userMap = new ConcurrentDictionary <string, Dictionary <string, string> >(); _userStorageMap[userStorageMap.CampaignKey] = userMap; } if (userMap.ContainsKey(userStorageMap.UserId) && userMap[userStorageMap.UserId] != null && userStorageMap.GoalIdentifier != null) { userMap[userStorageMap.UserId]["GoalIdentifier"] = userStorageMap.GoalIdentifier; } else { userMap[userStorageMap.UserId] = new Dictionary <string, string>() { { "VariationName", userStorageMap.VariationName }, { "GoalIdentifier", userStorageMap.GoalIdentifier } }; } SaveAsync(); }
internal static void SetupGet(Mock <IUserStorageService> mockUserStorageService, UserStorageMap returnValue) { MockUserStorageService.SetupGet(mockUserStorageService, returnValue); }
internal static void SetupGet(Mock <IUserStorageService> mockUserStorageService, UserStorageMap returnValue) { mockUserStorageService.Setup(mock => mock.Get(It.IsAny <string>(), It.IsAny <string>())) .Returns((string userId, string campaignKey) => { returnValue.CampaignKey = campaignKey; return(returnValue); }); }