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