| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #!/usr/bin/env python
- # Copyright 2012 Google Inc. All Rights Reserved.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- """Miscellaneous utility functions."""
- import inspect
- import logging
- import time
- try:
- # pkg_resources (part of setuptools) is needed when WPR is
- # distributed as a package. (Resources may need to be extracted from
- # the package.)
- import pkg_resources
- def resource_exists(resource_name):
- return pkg_resources.resource_exists(__name__, resource_name)
- def resource_string(resource_name):
- return pkg_resources.resource_string(__name__, resource_name)
- except ImportError:
- # Import of pkg_resources failed, so fall back to getting resources
- # from the file system.
- import os
- def _resource_path(resource_name):
- _replay_dir = os.path.dirname(os.path.abspath(__file__))
- return os.path.join(_replay_dir, resource_name)
- def resource_exists(resource_name):
- return os.path.exists(_resource_path(resource_name))
- def resource_string(resource_name):
- return open(_resource_path(resource_name)).read()
- class TimeoutException(Exception):
- pass
- def WaitFor(condition, timeout):
- """Waits for up to |timeout| secs for the function |condition| to return True.
- Polling frequency is (elapsed_time / 10), with a min of .1s and max of 5s.
- Returns:
- Result of |condition| function (if present).
- """
- min_poll_interval = 0.1
- max_poll_interval = 5
- output_interval = 300
- def GetConditionString():
- if condition.__name__ == '<lambda>':
- try:
- return inspect.getsource(condition).strip()
- except IOError:
- pass
- return condition.__name__
- start_time = time.time()
- last_output_time = start_time
- while True:
- res = condition()
- if res:
- return res
- now = time.time()
- elapsed_time = now - start_time
- last_output_elapsed_time = now - last_output_time
- if elapsed_time > timeout:
- raise TimeoutException('Timed out while waiting %ds for %s.' %
- (timeout, GetConditionString()))
- if last_output_elapsed_time > output_interval:
- logging.info('Continuing to wait %ds for %s. Elapsed: %ds.',
- timeout, GetConditionString(), elapsed_time)
- last_output_time = time.time()
- poll_interval = min(max(elapsed_time / 10., min_poll_interval),
- max_poll_interval)
- time.sleep(poll_interval)
|