blob: 2e3caf3c7fe818bccc577527f77de3a97dcafa8a [file] [log] [blame]
Daniel Erat3e3f7f42010-03-29 17:19:14 -07001# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import time
6from autotest_lib.client.common_lib import error
7
8
rgindaf25f73f2010-04-07 14:55:25 -07009class TimeoutError(error.TestError):
10 """Error raised when we time out when waiting on a condition."""
11
12
Daniel Erat3e3f7f42010-03-29 17:19:14 -070013def poll_for_condition(
rgindaf25f73f2010-04-07 14:55:25 -070014 condition, exception=None, timeout=10, sleep_interval=0.1, desc=None):
Daniel Erat3e3f7f42010-03-29 17:19:14 -070015 """Poll until a condition becomes true.
16
17 condition: function taking no args and returning bool
18 exception: exception to throw if condition doesn't become true
19 timeout: maximum number of seconds to wait
20 sleep_interval: time to sleep between polls
rgindaf25f73f2010-04-07 14:55:25 -070021 desc: description of default TimeoutError used if 'exception' is None
Daniel Erat3e3f7f42010-03-29 17:19:14 -070022
23 Raises:
rgindaf25f73f2010-04-07 14:55:25 -070024 'exception' arg if supplied; site_utils.TimeoutError otherwise
Daniel Erat3e3f7f42010-03-29 17:19:14 -070025 """
26 start_time = time.time()
27 while True:
28 if condition():
29 return
30 if time.time() + sleep_interval - start_time > timeout:
rgindaf25f73f2010-04-07 14:55:25 -070031 if exception:
32 raise exception
33
34 if desc:
35 desc = 'Timed out waiting for condition: %s' % desc
36 else:
37 desc = 'Timed out waiting for unnamed condition'
38 raise error.TestError(desc)
39
Daniel Erat3e3f7f42010-03-29 17:19:14 -070040 time.sleep(sleep_interval)