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;
}