private async Task SendHitAsync(HitBuilder hit)
        {
#if RUN_SYNCHRONOUS
            lock (syncObject)
            {
#endif
            HitSentEventArgs args = null;

            var serviceManager = new AnalyticsManager(MockConfig.Current.PlatformInfoProvider)
            {
                IsDebug = true
            };
            serviceManager.HitSent      += (s, e) => { args = e;    Assert.IsFalse(args == null); };
            serviceManager.HitMalformed += (s, e) => { Assert.Fail("Malformed: " + e.Hit.Parse()); };
            serviceManager.HitFailed    += (s, e) => { Assert.Fail("Failed:" + e.Error); };

#if !NATIVESDK_TEST
            var tracker =
                new SimpleTracker(MockConfig.Current.PropertyId, serviceManager)
            {
                AppName    = MockConfig.Current.AppName,
                ClientId   = MockConfig.Current.ClientId,
                ScreenName = MockConfig.Current.ScreenName
            };
#else
            var tracker = new Tracker(MockConfig.Current.PropertyId,
                                      MockConfig.Current.PlatformInfoProvider, serviceManager);
            serviceManager.IsDebug = true;
#endif
            tracker.Send(hit.Build());


#if RUN_SYNCHRONOUS
            serviceManager.DispatchAsync().AsTask().Wait();
#else
            await serviceManager.DispatchAsync();

            await Task.Delay(200);         //HitSent processing is async.. since we need args, let it replicate
#endif


            Assert.IsTrue(args != null, "args != null (" + hit.BuildToString() + ")");
            using (var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(args.Response)))
            {
                if (serviceManager.IsDebug)
                {
                    var serializer    = new DataContractJsonSerializer(typeof(DebugResponse));
                    var debugResponse = (DebugResponse)serializer.ReadObject(stream);
                    Assert.IsTrue(debugResponse.HitParsingResult.All(r => r.Valid), "Invalid Request: (" + args.Response + ")");
                }
            }
#if RUN_SYNCHRONOUS
        }       // lock
#endif
        }
Ejemplo n.º 2
0
        public static string BuildToString(this HitBuilder hitBuilder)
        {
            var builder = new StringBuilder();
            var all     = hitBuilder.Build();

            foreach (var key in all.Keys)
            {
                builder.Append($"{key}:{all[key]}&");
            }
            return(builder.ToString());
        }
        public async Task SentMalformedEventWithUiThreadCallback()
        {
#if NATIVESDK_TEST
            bool fireInUIThread = false;

            /* at most one of these three should be true*/
            bool fireHitSent      = true;
            bool fireHitMalformed = false;
            bool fireHitFailed    = false;

            int      delay = 3;
            TimeSpan ts    = TimeSpan.FromSeconds(delay);


            var serviceManager       = new AnalyticsManager(MockConfig.Current.PlatformInfoProvider);
            var initializeWindowTask = Windows.ApplicationModel.Core.CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                                                                                                                  () =>
            {
                serviceManager.FireEventsOnUIThread = fireInUIThread;
            }).AsTask();

            initializeWindowTask.Wait();

            serviceManager.DispatchPeriod = ts;
            serviceManager.IsDebug        = true;

            bool isHitSent = false, isMalformed = false, isFailed = false;
            bool isUIThread = false;


            serviceManager.HitSent += (s, e) => {
                isHitSent  = true;
                isUIThread = IsCallingInUIThread();
            };

            serviceManager.HitMalformed += (s, e) =>
            {
                isMalformed = true;
                isUIThread  = IsCallingInUIThread();
            };

            serviceManager.HitFailed += (s, e) =>
            {
                isFailed   = true;
                isUIThread = IsCallingInUIThread();
            };

            var tracker = new Tracker(MockConfig.Current.PropertyId, MockConfig.Current.PlatformInfoProvider, serviceManager);
            tracker.AppName    = MockConfig.Current.AppName;
            tracker.ClientId   = MockConfig.Current.ClientId;
            tracker.ScreenName = MockConfig.Current.ScreenName;


            HitBuilder hit = null;

            // fireHitSent
            hit = HitBuilder.CreateCustomEvent("category", "action", "label", 2);
            var data = hit.Build();

            if (fireHitMalformed)
            {
                //malform
            }
            else if (fireHitFailed)
            {
            }

            tracker.Send(data);

            await Task.Delay(TimeSpan.FromSeconds(delay * 3));

            //Ensure event completed
            Assert.IsTrue(fireHitMalformed == isMalformed);
            Assert.IsTrue(fireHitSent == isHitSent);
            Assert.IsTrue(fireHitFailed == isFailed);

            //Ensure it was in proper thread
            Assert.IsTrue(isUIThread == fireInUIThread);
#endif
            await Task.CompletedTask;
        }