• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2024 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import datetime as dt
6import unittest
7
8from crossbench.runner.timing import SAFE_MAX_TIMEOUT_TIMEDELTA, Timing
9from tests import test_helper
10
11
12class TimingTestCase(unittest.TestCase):
13
14  def test_default_instance(self):
15    t = Timing()
16    self.assertEqual(t.unit, dt.timedelta(seconds=1))
17    self.assertEqual(t.timeout_unit, dt.timedelta())
18    self.assertEqual(t.timedelta(10), dt.timedelta(seconds=10))
19    self.assertEqual(t.units(1), 1)
20    self.assertEqual(t.units(dt.timedelta(seconds=1)), 1)
21
22  def test_to_json(self):
23    t = Timing()
24    self.assertDictEqual(t.to_json(), {
25        "coolDownTime": 1.0,
26        "runTimeout": 0.0,
27        "timeoutUnit": 0.0,
28        "unit": 1.0
29    })
30    t = Timing(
31        unit=dt.timedelta(seconds=10), timeout_unit=dt.timedelta(seconds=11))
32    self.assertDictEqual(t.to_json(), {
33        "coolDownTime": 1.0,
34        "runTimeout": 0.0,
35        "timeoutUnit": 11.0,
36        "unit": 10.0
37    })
38
39  def test_default_instance_slowdown(self):
40    t = Timing(
41        unit=dt.timedelta(seconds=10), timeout_unit=dt.timedelta(seconds=11))
42    self.assertEqual(t.unit, dt.timedelta(seconds=10))
43    self.assertEqual(t.timeout_unit, dt.timedelta(seconds=11))
44    self.assertEqual(t.timedelta(10), dt.timedelta(seconds=100))
45    self.assertEqual(t.units(100), 10)
46    self.assertEqual(t.units(dt.timedelta(seconds=100)), 10)
47    self.assertEqual(t.timeout_timedelta(10), dt.timedelta(seconds=110))
48
49  def test_default_instance_speedup(self):
50    t = Timing(unit=dt.timedelta(seconds=0.1))
51    self.assertEqual(t.unit, dt.timedelta(seconds=0.1))
52    self.assertEqual(t.timedelta(10), dt.timedelta(seconds=1))
53    self.assertEqual(t.units(1), 10)
54    self.assertEqual(t.units(dt.timedelta(seconds=1)), 10)
55
56  def test_invalid_params(self):
57    with self.assertRaises(ValueError) as cm:
58      _ = Timing(cool_down_time=dt.timedelta(seconds=-1))
59    self.assertIn("Timing.cool_down_time", str(cm.exception))
60
61    with self.assertRaises(ValueError) as cm:
62      _ = Timing(unit=dt.timedelta(seconds=-1))
63    self.assertIn("Timing.unit", str(cm.exception))
64    with self.assertRaises(ValueError) as cm:
65      _ = Timing(unit=dt.timedelta())
66    self.assertIn("Timing.unit", str(cm.exception))
67
68    with self.assertRaises(ValueError) as cm:
69      _ = Timing(run_timeout=dt.timedelta(seconds=-1))
70    self.assertIn("Timing.run_timeout", str(cm.exception))
71
72  def test_to_units(self):
73    t = Timing()
74    self.assertEqual(t.units(100), 100)
75    self.assertEqual(t.units(dt.timedelta(minutes=1.5)), 90)
76    with self.assertRaises(ValueError):
77      _ = t.timedelta(-1)
78
79    t = Timing(unit=dt.timedelta(seconds=10))
80    self.assertEqual(t.units(100), 10)
81    self.assertEqual(t.units(dt.timedelta(minutes=1.5)), 9)
82    with self.assertRaises(ValueError):
83      _ = t.timedelta(-1)
84
85    t = Timing(unit=dt.timedelta(seconds=0.1))
86    self.assertEqual(t.units(100), 1000)
87    self.assertEqual(t.units(dt.timedelta(minutes=1.5)), 900)
88    with self.assertRaises(ValueError):
89      _ = t.timedelta(-1)
90
91  def test_to_timedelta(self):
92    t = Timing()
93    self.assertEqual(t.timedelta(12).total_seconds(), 12)
94    self.assertEqual(t.timedelta(dt.timedelta(minutes=1.5)).total_seconds(), 90)
95    with self.assertRaises(ValueError):
96      _ = t.timedelta(-1)
97
98    t = Timing(unit=dt.timedelta(seconds=10))
99    self.assertEqual(t.timedelta(12).total_seconds(), 120)
100    self.assertEqual(
101        t.timedelta(dt.timedelta(minutes=1.5)).total_seconds(), 900)
102    with self.assertRaises(ValueError):
103      _ = t.timedelta(-1)
104
105    t = Timing(unit=dt.timedelta(seconds=0.5))
106    self.assertEqual(t.timedelta(12).total_seconds(), 6)
107    self.assertEqual(t.timedelta(dt.timedelta(minutes=1.5)).total_seconds(), 45)
108    with self.assertRaises(ValueError):
109      _ = t.timedelta(-1)
110
111  def test_timeout_timing(self):
112    t = Timing(
113        unit=dt.timedelta(seconds=1), timeout_unit=dt.timedelta(seconds=10))
114    self.assertEqual(t.timedelta(12).total_seconds(), 12)
115    self.assertEqual(t.timeout_timedelta(12).total_seconds(), 120)
116
117  def test_timeout_timing_invalid(self):
118    with self.assertRaises(ValueError):
119      _ = Timing(
120          unit=dt.timedelta(seconds=1), timeout_unit=dt.timedelta(seconds=0.1))
121    with self.assertRaises(ValueError):
122      _ = Timing(
123          unit=dt.timedelta(seconds=1), timeout_unit=dt.timedelta(seconds=-1))
124
125  def test_no_timeout(self):
126    self.assertFalse(Timing().has_no_timeout)
127    t = Timing(timeout_unit=dt.timedelta.max)
128    self.assertTrue(t.has_no_timeout)
129    self.assertEqual(t.timedelta(12).total_seconds(), 12)
130    self.assertEqual(t.timeout_timedelta(0.000001), SAFE_MAX_TIMEOUT_TIMEDELTA)
131    self.assertEqual(t.timeout_timedelta(12), SAFE_MAX_TIMEOUT_TIMEDELTA)
132
133  def test_timeout_overflow(self):
134    t = Timing(timeout_unit=dt.timedelta(days=1000))
135    self.assertEqual(t.timeout_timedelta(12), SAFE_MAX_TIMEOUT_TIMEDELTA)
136    self.assertEqual(t.timeout_timedelta(1500), SAFE_MAX_TIMEOUT_TIMEDELTA)
137
138
139if __name__ == "__main__":
140  test_helper.run_pytest(__file__)
141