public override T GetFlagValue <T>(string key, T defaultValue, FlagDTO flag, bool userExposed = true) { const string functionName = "getFlag.value"; if (flag == null) { Log.LogInfo(Config, string.Format(Constants.GET_FLAG_MISSING_ERROR, key), functionName); return(defaultValue); } if (flag.Value == null && defaultValue != null) { if (userExposed) { _ = UserExposed(key, defaultValue, flag); } Log.LogInfo(Config, string.Format(Constants.GET_FLAG_CAST_ERROR, key), functionName); return(defaultValue); } if (!Utils.Utils.HasSameType(flag.Value, defaultValue)) { Log.LogInfo(Config, string.Format(Constants.GET_FLAG_CAST_ERROR, key), functionName); return(defaultValue); } if (userExposed) { _ = UserExposed(key, defaultValue, flag); } return((T)flag.Value); }
public override Task UserExposed <T>(string key, T defaultValue, FlagDTO flag) { return(Task.Factory.StartNew(() => { Log("UserExposed"); })); }
protected override async Task SendActivate(FlagDTO flag) { try { await TrackingManager.SendActive(Visitor, flag); } catch (Exception ex) { Log.LogError(Config, ex.Message, "UserExposed"); Visitor.GetStrategy().CacheHit(flag); } }
public void CacheHitActivateTest() { var hitCache = new Mock <IHitCacheImplementation>(); var visitorId = visitorDelegate.VisitorId; visitorDelegate.Config.HitCacheImplementation = hitCache.Object; var defaultStrategy = new DefaultStrategy(visitorDelegate); var flag = new FlagDTO { CampaignId = "campaignId", CampaignType = "ab", IsReference = true, Key = "key", Value = "value", VariationGroupId = "varGrID", VariationId = "varID" }; var hitData = new HitCacheDTOV1 { Version = 1, Data = new HitCacheData { VisitorId = visitorDelegate.VisitorId, AnonymousId = visitorDelegate.AnonymousId, Type = HitCacheType.ACTIVATE, Content = flag, Time = DateTime.Now } }; var hitDataJson = JObject.FromObject(hitData); defaultStrategy.CacheHit(flag); hitCache.Verify(x => x.CacheHit(visitorId, It.Is <JObject>(y => y["Data"]["Type"].Value <int>() == ((int)HitCacheType.ACTIVATE) && y["Data"]["Content"].Value <JObject>().ToString() == JObject.FromObject(flag).ToString() )), Times.Once()); var error = new Exception("CacheHit error"); hitCache.Setup(x => x.CacheHit(visitorId, It.IsAny <JObject>())).Throws(error); defaultStrategy.CacheHit(flag); fsLogManagerMock.Verify(x => x.Error(error.Message, "CacheHit"), Times.Once()); }
public override async Task UserExposed <T>(string key, T defaultValue, FlagDTO flag) { const string functionName = "UserExposed"; if (flag == null) { Log.LogError(Config, string.Format(Constants.GET_FLAG_ERROR, key), functionName); return; } if (flag.Value != null && !Utils.Utils.HasSameType(flag.Value, defaultValue)) { Log.LogError(Config, string.Format(Constants.USER_EXPOSED_CAST_ERROR, key), functionName); return; } await SendActivate(flag); }
public virtual async void CacheHit(FlagDTO flagDTO) { try { var hitCacheInstance = Config?.HitCacheImplementation; if (hitCacheInstance == null || Config.DisableCache) { return; } var hitDataString = BuildHitCacheData(flagDTO, HitCacheType.ACTIVATE); await hitCacheInstance.CacheHit(Visitor.VisitorId, hitDataString); } catch (Exception ex) { Logger.Log.LogError(Config, ex.Message, "CacheHit"); } }
public async Task SendActive(VisitorDelegateAbstract visitor, FlagDTO flag) { var url = $"{Constants.BASE_API_URL}activate"; var requestMessage = new HttpRequestMessage(HttpMethod.Post, url); requestMessage.Headers.Add(Constants.HEADER_X_API_KEY, Config.ApiKey); requestMessage.Headers.Add(Constants.HEADER_X_SDK_CLIENT, Constants.SDK_LANGUAGE); requestMessage.Headers.Add(Constants.HEADER_X_SDK_VERSION, Constants.SDK_VERSION); requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(Constants.HEADER_APPLICATION_JSON)); var postData = new Dictionary <string, object> { [Constants.VISITOR_ID_API_ITEM] = visitor.VisitorId, [Constants.VARIATION_ID_API_ITEM] = flag.VariationId, [Constants.VARIATION_GROUP_ID_API_ITEM] = flag.VariationGroupId, [Constants.CUSTOMER_ENV_ID_API_ITEM] = Config.EnvId }; if (!string.IsNullOrWhiteSpace(visitor.AnonymousId) && !string.IsNullOrWhiteSpace(visitor.VisitorId)) { postData[Constants.VISITOR_ID_API_ITEM] = visitor.VisitorId; postData[Constants.ANONYMOUS_ID] = visitor.AnonymousId; } else { postData[Constants.VISITOR_ID_API_ITEM] = visitor.AnonymousId ?? visitor.VisitorId; postData[Constants.ANONYMOUS_ID] = null; } var postDatajson = JsonConvert.SerializeObject(postData); var stringContent = new StringContent(postDatajson, Encoding.UTF8, Constants.HEADER_APPLICATION_JSON); requestMessage.Content = stringContent; await HttpClient.SendAsync(requestMessage); }
public override void CacheHit(FlagDTO flagDTO) { // }
abstract public T GetFlagValue <T>(string key, T defaultValue, FlagDTO flag, bool userExposed);
abstract public Task UserExposed <T>(string key, T defaultValue, FlagDTO flag);
abstract protected Task SendActivate(FlagDTO flag);
public override T GetFlagValue <T>(string key, T defaultValue, FlagDTO flag, bool userExposed = true) { Log("Flag.value"); return(defaultValue); }
public void LookupHitsTest() { var hitCache = new Mock <IHitCacheImplementation>(); var visitorId = visitorDelegate.VisitorId; visitorDelegate.Config.HitCacheImplementation = hitCache.Object; var defaultStrategy = new DefaultStrategy(visitorDelegate); var screenHit = new Screen(string.Concat(Enumerable.Repeat("Home", 1000000))); var hitData = new HitCacheDTOV1 { Version = 1, Data = new HitCacheData { VisitorId = visitorDelegate.VisitorId, AnonymousId = visitorDelegate.AnonymousId, Type = HitCacheType.SCREENVIEW, Content = screenHit, Time = DateTime.Now } }; var pageHit = new Page(string.Concat(Enumerable.Repeat("Home", 1000000))); var hitData2 = new HitCacheDTOV1 { Version = 1, Data = new HitCacheData { VisitorId = visitorDelegate.VisitorId, AnonymousId = visitorDelegate.AnonymousId, Type = HitCacheType.PAGEVIEW, Content = pageHit, Time = DateTime.Now } }; var batchHit = new Batch() { Hits = new Collection <HitAbstract>() { pageHit, screenHit }, }; var hitData3 = new HitCacheDTOV1 { Version = 1, Data = new HitCacheData { VisitorId = visitorDelegate.VisitorId, AnonymousId = visitorDelegate.AnonymousId, Type = HitCacheType.BATCH, Content = batchHit, Time = DateTime.Now } }; var transactionHit = new Transaction("transactionID", "aff"); var hitData4 = new HitCacheDTOV1 { Version = 1, Data = new HitCacheData { VisitorId = visitorDelegate.VisitorId, AnonymousId = visitorDelegate.AnonymousId, Type = HitCacheType.TRANSACTION, Content = transactionHit, Time = DateTime.Now } }; var eventHit = new Event(EventCategory.USER_ENGAGEMENT, "aff"); var hitData5 = new HitCacheDTOV1 { Version = 1, Data = new HitCacheData { VisitorId = visitorDelegate.VisitorId, AnonymousId = visitorDelegate.AnonymousId, Type = HitCacheType.EVENT, Content = eventHit, Time = DateTime.Now } }; var itemHit = new Item("transID", "name", "code"); var hitData6 = new HitCacheDTOV1 { Version = 1, Data = new HitCacheData { VisitorId = visitorDelegate.VisitorId, AnonymousId = visitorDelegate.AnonymousId, Type = HitCacheType.ITEM, Content = itemHit, Time = DateTime.Now } }; var flag = new FlagDTO { CampaignId = "campaignCacheHitId", CampaignType = "ab", IsReference = true, Key = "key", Value = "value", VariationGroupId = "varGrID", VariationId = "varID" }; var hitData7 = new HitCacheDTOV1 { Version = 1, Data = new HitCacheData { VisitorId = visitorDelegate.VisitorId, AnonymousId = visitorDelegate.AnonymousId, Type = HitCacheType.ACTIVATE, Content = flag, Time = DateTime.Now } }; var array = new JArray() { JObject.FromObject(hitData), JObject.FromObject(hitData2), JObject.FromObject(hitData3), JObject.FromObject(hitData4), JObject.FromObject(hitData5), JObject.FromObject(hitData6), JObject.FromObject(hitData7), }; hitCache.Setup(x => x.LookupHits(visitorId)).Returns(Task.FromResult(array)); defaultStrategy.LookupHits(); trackingManagerMock.Verify(x => x.SendActive(visitorDelegate, It.Is <FlagDTO>( y => y.CampaignId == flag.CampaignId && y.CampaignType == flag.CampaignType && y.IsReference == flag.IsReference && y.Key == flag.Key && y.Value == flag.Value && y.VariationGroupId == flag.VariationGroupId && y.VariationId == flag.VariationId)), Times.Once()); Func <HitAbstract, bool> checkHit = (HitAbstract hitAbstract) => { switch (hitAbstract.Type) { case HitType.PAGEVIEW: var page = (Page)hitAbstract; return(page.DocumentLocation == pageHit.DocumentLocation); case HitType.SCREENVIEW: var screen = (Screen)hitAbstract; return(screen.DocumentLocation == screenHit.DocumentLocation); case HitType.TRANSACTION: var transaction = (Transaction)hitAbstract; return(transaction.TransactionId == transactionHit.TransactionId && transaction.Affiliation == transactionHit.Affiliation); case HitType.ITEM: var item = (Item)hitAbstract; return(item.TransactionId == itemHit.TransactionId && item.Code == itemHit.Code && item.Name == itemHit.Name); case HitType.EVENT: var eventObject = (Event)hitAbstract; return(eventObject.Category == eventHit.Category && eventObject.Action == eventHit.Action); case HitType.BATCH: var batch = (Batch)hitAbstract; return(batch.Hits.Count == 2); default: break; } return(false); }; trackingManagerMock.Verify(x => x.SendHit(It.Is <Batch>(y => y.Hits.Any(checkHit))), Times.Exactly(4)); }