1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)"""Unittests for timeout_and_retry.py."""
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import unittest
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from pylib.utils import reraiser_thread
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from pylib.utils import timeout_retry
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestException(Exception):
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pass
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def _NeverEnding(tries):
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  tries[0] += 1
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  while True:
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    pass
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def _CountTries(tries):
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  tries[0] += 1
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  raise TestException
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TestRun(unittest.TestCase):
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  """Tests for timeout_retry.Run."""
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testRun(self):
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertTrue(timeout_retry.Run(
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        lambda x: x, 30, 3, [True], {}))
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testTimeout(self):
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    tries = [0]
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertRaises(reraiser_thread.TimeoutError,
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        timeout_retry.Run, lambda: _NeverEnding(tries), 0, 3)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEqual(tries[0], 4)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testRetries(self):
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    tries = [0]
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertRaises(TestException,
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        timeout_retry.Run, lambda: _CountTries(tries), 30, 3)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertEqual(tries[0], 4)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def testReturnValue(self):
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self.assertTrue(timeout_retry.Run(lambda: True, 30, 3))
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)if __name__ == '__main__':
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  unittest.main()
53