Index: tools/telemetry/telemetry/web_perf/metrics/timeline_based_metric.py |
diff --git a/tools/telemetry/telemetry/web_perf/metrics/timeline_based_metric.py b/tools/telemetry/telemetry/web_perf/metrics/timeline_based_metric.py |
index 0a4f56e7c152035ef981154f682986952c287687..3d38007b863cedd0332676b4ed8d4803d8c5fc85 100644 |
--- a/tools/telemetry/telemetry/web_perf/metrics/timeline_based_metric.py |
+++ b/tools/telemetry/telemetry/web_perf/metrics/timeline_based_metric.py |
@@ -3,6 +3,29 @@ |
# found in the LICENSE file. |
+class TimelineBasedMetricException(Exception): |
+ """Exception that can be thrown from metrics that implements |
+ TimelineBasedMetric to indicate a problem arised when computing the metric. |
+ """ |
+ |
+ |
+def _TimeRangesHasOverlap(iterable_time_ranges): |
+ """ Returns True if there is are overlapped ranges in time ranges. |
+ iterable_time_ranges: an iterable of time ranges. Each time range is a |
+ tuple (start time, end time). |
+ """ |
+ # Sort the ranges by the start time |
+ sorted_time_ranges = sorted(iterable_time_ranges) |
+ last_range = sorted_time_ranges[0] |
+ for current_range in sorted_time_ranges[1:]: |
+ start_current_range = current_range[0] |
+ end_last_range = last_range[1] |
+ if start_current_range < end_last_range: |
+ return True |
+ last_range = current_range |
+ return False |
+ |
+ |
class TimelineBasedMetric(object): |
def __init__(self): |
"""Computes metrics from a telemetry.core.timeline Model and a range |
@@ -22,3 +45,14 @@ class TimelineBasedMetric(object): |
""" |
raise NotImplementedError() |
+ |
+ def VerifyNonOverlappedRecords(self, interaction_records): |
+ if _TimeRangesHasOverlap(((r.start, r.end) for r in interaction_records)): |
+ raise TimelineBasedMetricException( |
+ 'This metric does not support interaction records with overlapped time ' |
+ 'range.') |
+ if _TimeRangesHasOverlap(((r.thread_start, r.thread_end) |
+ for r in interaction_records)): |
+ raise TimelineBasedMetricException( |
+ 'This metric does not support interaction records with overlapped ' |
+ 'thread time range.') |