| # Copyright 2013 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # These tests access private methods in the speedindex module. |
| # pylint: disable=protected-access |
| |
| import unittest |
| |
| from telemetry.util import color_histogram |
| from telemetry.util import rgba_color |
| |
| from metrics import speedindex |
| |
| |
| class FakeImageUtil(object): |
| |
| # pylint: disable=unused-argument |
| def GetColorHistogram(self, image, ignore_color=None, tolerance=None): |
| return image.ColorHistogram() |
| |
| |
| class FakeVideo(object): |
| |
| def __init__(self, frames): |
| self._frames = frames |
| |
| def GetVideoFrameIter(self): |
| for frame in self._frames: |
| yield frame |
| |
| |
| class FakeBitmap(object): |
| |
| def __init__(self, r, g, b): |
| self._histogram = color_histogram.ColorHistogram(r, g, b, rgba_color.WHITE) |
| |
| # pylint: disable=unused-argument |
| def ColorHistogram(self, ignore_color=None, tolerance=None): |
| return self._histogram |
| |
| |
| class FakeTab(object): |
| |
| def __init__(self, video_capture_result=None): |
| self._javascript_result = None |
| self._video_capture_result = FakeVideo(video_capture_result) |
| |
| @property |
| def video_capture_supported(self): |
| return self._video_capture_result is not None |
| |
| def SetEvaluateJavaScriptResult(self, result): |
| self._javascript_result = result |
| |
| def EvaluateJavaScript(self, _): |
| return self._javascript_result |
| |
| def StartVideoCapture(self, min_bitrate_mbps=1): |
| assert self.video_capture_supported |
| assert min_bitrate_mbps > 0 |
| |
| def StopVideoCapture(self): |
| assert self.video_capture_supported |
| return self._video_capture_result |
| |
| def Highlight(self, _): |
| pass |
| |
| |
| class SpeedIndexImplTest(unittest.TestCase): |
| |
| def testVideoCompleteness(self): |
| frames = [ |
| (0.0, FakeBitmap([0, 0, 0, 10], [0, 0, 0, 10], [0, 0, 0, 10])), |
| (0.1, FakeBitmap([10, 0, 0, 0], [10, 0, 0, 0], [10, 0, 0, 0])), |
| (0.2, FakeBitmap([0, 0, 2, 8], [0, 0, 4, 6], [0, 0, 1, 9])), |
| (0.3, FakeBitmap([0, 3, 2, 5], [2, 1, 0, 7], [0, 3, 0, 7])), |
| (0.4, FakeBitmap([0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0])), |
| (0.5, FakeBitmap([0, 4, 6, 0], [0, 4, 6, 0], [0, 4, 6, 0])), |
| ] |
| max_distance = 42. |
| |
| tab = FakeTab(frames) |
| impl = speedindex.VideoSpeedIndexImpl(FakeImageUtil()) |
| impl.Start(tab) |
| impl.Stop(tab) |
| time_completeness = impl.GetTimeCompletenessList(tab) |
| self.assertEqual(len(time_completeness), 6) |
| self.assertEqual(time_completeness[0], (0.0, 0)) |
| self.assertTimeCompleteness( |
| time_completeness[1], 0.1, 1 - (16 + 16 + 16) / max_distance) |
| self.assertTimeCompleteness( |
| time_completeness[2], 0.2, 1 - (12 + 10 + 13) / max_distance) |
| self.assertTimeCompleteness( |
| time_completeness[3], 0.3, 1 - (6 + 10 + 8) / max_distance) |
| self.assertTimeCompleteness( |
| time_completeness[4], 0.4, 1 - (4 + 4 + 4) / max_distance) |
| self.assertEqual(time_completeness[5], (0.5, 1)) |
| |
| def testBlankPage(self): |
| frames = [ |
| (0.0, FakeBitmap([0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1])), |
| (0.1, FakeBitmap([0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1])), |
| (0.2, FakeBitmap([1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1])), |
| (0.3, FakeBitmap([0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1])), |
| ] |
| tab = FakeTab(frames) |
| impl = speedindex.VideoSpeedIndexImpl(FakeImageUtil()) |
| impl.Start(tab) |
| impl.Stop(tab) |
| time_completeness = impl.GetTimeCompletenessList(tab) |
| self.assertEqual(len(time_completeness), 4) |
| self.assertEqual(time_completeness[0], (0.0, 1.0)) |
| self.assertEqual(time_completeness[1], (0.1, 1.0)) |
| self.assertEqual(time_completeness[2], (0.2, 0.0)) |
| self.assertEqual(time_completeness[3], (0.3, 1.0)) |
| |
| def assertTimeCompleteness(self, time_completeness, time, completeness): |
| self.assertEqual(time_completeness[0], time) |
| self.assertAlmostEqual(time_completeness[1], completeness) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |