Exemplo n.º 1
0
        /// <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();
 }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        /// <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);
        }
Exemplo n.º 9
0
        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();
 }
Exemplo n.º 11
0
 internal static void SetupGet(Mock <IUserStorageService> mockUserStorageService, UserStorageMap returnValue)
 {
     MockUserStorageService.SetupGet(mockUserStorageService, returnValue);
 }
Exemplo n.º 12
0
 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);
     });
 }