| # Copyright 2024 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from __future__ import annotations |
| |
| import argparse |
| import datetime as dt |
| import unittest |
| |
| from crossbench.benchmarks.loading.playback_controller import ( |
| ForeverPlaybackController, PlaybackController, RepeatPlaybackController, |
| TimeoutPlaybackController) |
| from tests import test_helper |
| |
| |
| class PlaybackControllerTestCase(unittest.TestCase): |
| |
| def test_parse_invalid(self): |
| for invalid in [ |
| "11", "something", "1.5x", "4.3.h", "4.5.x", "-1x", "-1.4x", "-2h", |
| "-2.1h", "1h30", "infx", "infh", "nanh", "nanx", "0s", "0" |
| ]: |
| with self.subTest(pattern=invalid): |
| with self.assertRaises((argparse.ArgumentTypeError, ValueError)): |
| PlaybackController.parse(invalid) |
| |
| def test_invalid_repeat(self): |
| with self.assertRaises(argparse.ArgumentTypeError): |
| PlaybackController.repeat(-1) |
| |
| def test_parse_repeat(self): |
| playback = PlaybackController.parse("once") |
| self.assertIsInstance(playback, RepeatPlaybackController) |
| assert isinstance(playback, RepeatPlaybackController) |
| self.assertEqual(playback.count, 1) |
| self.assertEqual(len(list(playback)), 1) |
| |
| playback = PlaybackController.parse("1x") |
| self.assertIsInstance(playback, RepeatPlaybackController) |
| assert isinstance(playback, RepeatPlaybackController) |
| self.assertEqual(playback.count, 1) |
| self.assertEqual(len(list(playback)), 1) |
| |
| playback = PlaybackController.parse("11x") |
| self.assertIsInstance(playback, RepeatPlaybackController) |
| assert isinstance(playback, RepeatPlaybackController) |
| self.assertEqual(playback.count, 11) |
| self.assertEqual(len(list(playback)), 11) |
| |
| def test_parse_forever(self): |
| playback = PlaybackController.parse("forever") |
| self.assertIsInstance(playback, ForeverPlaybackController) |
| playback = PlaybackController.parse("inf") |
| self.assertIsInstance(playback, ForeverPlaybackController) |
| playback = PlaybackController.parse("infinity") |
| self.assertIsInstance(playback, ForeverPlaybackController) |
| |
| def test_parse_duration(self): |
| playback = PlaybackController.parse("5s") |
| self.assertIsInstance(playback, TimeoutPlaybackController) |
| assert isinstance(playback, TimeoutPlaybackController) |
| self.assertEqual(playback.duration, dt.timedelta(seconds=5)) |
| |
| playback = PlaybackController.parse("5m") |
| self.assertIsInstance(playback, TimeoutPlaybackController) |
| assert isinstance(playback, TimeoutPlaybackController) |
| self.assertEqual(playback.duration, dt.timedelta(minutes=5)) |
| |
| playback = PlaybackController.parse("5.5m") |
| self.assertIsInstance(playback, TimeoutPlaybackController) |
| assert isinstance(playback, TimeoutPlaybackController) |
| self.assertEqual(playback.duration, dt.timedelta(minutes=5.5)) |
| |
| playback = PlaybackController.parse("5.5m") |
| self.assertIsInstance(playback, TimeoutPlaybackController) |
| assert isinstance(playback, TimeoutPlaybackController) |
| self.assertEqual(playback.duration, dt.timedelta(minutes=5.5)) |
| |
| def test_once(self): |
| iterations = sum(1 for _ in PlaybackController.once()) |
| self.assertEqual(iterations, 1) |
| iterations = sum(1 for _ in PlaybackController.default()) |
| self.assertEqual(iterations, 1) |
| |
| def test_repeat(self): |
| iterations = sum(1 for _ in PlaybackController.repeat(1)) |
| self.assertEqual(iterations, 1) |
| iterations = sum(1 for _ in PlaybackController.repeat(11)) |
| self.assertEqual(iterations, 11) |
| |
| def test_timeout(self): |
| # Even 0-duration playback should run once |
| iterations = sum(1 for _ in PlaybackController.timeout(dt.timedelta())) |
| self.assertEqual(iterations, 1) |
| iterations = sum( |
| 1 for _ in PlaybackController.timeout(dt.timedelta(milliseconds=0.1))) |
| self.assertGreaterEqual(iterations, 1) |
| |
| def test_forever(self): |
| count = 0 |
| for _ in PlaybackController.forever(): |
| # Just run for some large-ish amount of iterations to get code coverage. |
| count += 1 |
| if count > 100: |
| break |
| |
| |
| if __name__ == "__main__": |
| test_helper.run_pytest(__file__) |