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
        }
        public async Task SendEventWithDispatcherPeriod()
        {
            var delay             = 4;
            var ts                = TimeSpan.FromSeconds(delay);
            HitSentEventArgs args = null;
            var hit               = HitBuilder.CreateCustomEvent("category", "action", "label", 2);
            var serviceManager    = new AnalyticsManager(MockConfig.Current.PlatformInfoProvider);

            serviceManager.HitSent       += (s, e) => { args = e; };
            serviceManager.DispatchPeriod = ts;
            var tracker = new Tracker(MockConfig.Current.PropertyId,
                                      MockConfig.Current.PlatformInfoProvider, serviceManager)
            {
                AppName    = MockConfig.Current.AppName,
                ClientId   = MockConfig.Current.ClientId,
                ScreenName = MockConfig.Current.ScreenName
            };

            tracker.Send(hit.Build());
            serviceManager.IsDebug = true;

            //Wait half our dispatch time, so should have no response yet
            await Task.Delay(TimeSpan.FromSeconds(delay / 2));

            Assert.IsTrue(args == null);

            //Wait for Dispatch
            await Task.Delay(TimeSpan.FromSeconds(delay));

            Assert.IsTrue(args != null);

            System.Diagnostics.Debug.WriteLine(args.Hit.Parse());

            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));
                    var queueTimeParam = debugResponse.HitParsingResult[0].Hit.FindParamInQueryString(ParameterNames.QueueTime);
                    Assert.IsTrue(queueTimeParam != null);
                }
            }
        }
 private void AnalyticsManager_HitSent(object sender, HitSentEventArgs e)
 {
     Log(e.Hit, e.Response);
 }