public override RuleResult Run()

in Source/Rules/PollingDetectionRule.cs [207:272]


        public override RuleResult Run(IEnumerable<ServiceCallItem> items, ServiceCallStats stats)
        {
            RuleResult result = InitializeResult(DisplayName, Description);
            if (items.Count() == 0) { 
                return result; 
            }

            //check invalid log versions
            if (items.Count(item => item.m_logVersion == Constants.Version1509) > 0)
            {
                result.AddViolation(ViolationLevel.Warning, "Data version does not support this rule. You need an updated Xbox Live SDK to support this rule");
                return result;
            }

            List<ServiceCallItem> allRepeats = new List<ServiceCallItem>();
            var nonShoulderTapItems = items.Where(item => item.m_isShoulderTap == false);

            List<Sequence> sequences = new List<Sequence>();
            foreach (ServiceCallItem thisItem in nonShoulderTapItems)
            {
                if (thisItem.m_reqHeader.Contains("SocialManager"))
                {
                    continue;
                }
                
                // Used to skip over already analyzed repeated calls.
                if (allRepeats.Contains(thisItem)) { 
                    continue; 
                }

                // Discover all repeats to thisItem
                var myRepeats = from item in nonShoulderTapItems
                                where ((item != thisItem) && (item.m_reqBodyHash == thisItem.m_reqBodyHash) && (item.m_uri == thisItem.m_uri))
                                select item;

                if (myRepeats.Count() > 1 )
                {
                    var deltas = BuildDeltas(myRepeats.ToList());
                    sequences.AddRange(GenerateSequences(deltas, m_sameDeltaThresholdPercentage));
                    
                    allRepeats.AddRange(myRepeats); 
                }
            }

            if (sequences == null)
            {
                return result;
            }

            //Process Violations
            StringBuilder description = new StringBuilder();
            foreach (var sequence in sequences.OrderByDescending(s => s.Length))
            {
                description.Clear();

                description.AppendFormat("Polling detected in a sequence of {0} calls at a rate of approximately {1} min:sec",
                                         sequence.Length, TimeSpan.FromTicks((long)sequence.m_averageDelta).ToString(@"mm\:ss\.fff"));

                result.AddViolation(ViolationLevel.Warning, description.ToString(), sequence.m_seqCalls);
            }

             
            result.Results.Add("Polling Sequences Found", result.ViolationCount);

            return result;
        }