blob: 8eb52f49894a8827eea2c3db23e99ae23eacaa8b [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
Thieu Le1904d002010-11-30 17:10:24 -08005import logging, os, platform, time
Daniel Erat3e3f7f42010-03-29 17:19:14 -07006from 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'
Mitsuru Oshima5d3e4542010-08-18 13:46:06 -070038 raise TimeoutError, desc
rgindaf25f73f2010-04-07 14:55:25 -070039
Daniel Erat3e3f7f42010-03-29 17:19:14 -070040 time.sleep(sleep_interval)
Thieu Le1904d002010-11-30 17:10:24 -080041
42
43def save_vm_state(checkpoint):
44 """Saves the current state of the virtual machine.
45
46 This function is a NOOP if the test is not running under a virtual machine
47 with the USB serial port redirected.
48
49 Arguments:
50 checkpoint - Name used to identify this state
51
52 Returns:
53 None
54 """
55 # The QEMU monitor has been redirected to the guest serial port located at
56 # /dev/ttyUSB0. To save the state of the VM, we just send the 'savevm'
57 # command to the serial port.
58 proc = platform.processor()
59 if 'QEMU' in proc and os.path.exists('/dev/ttyUSB0'):
60 logging.info('Saving VM state "%s"' % checkpoint)
61 serial = open('/dev/ttyUSB0', 'w')
62 serial.write("savevm %s\r\n" % checkpoint)
63 logging.info('Done saving VM state "%s"' % checkpoint)