#!/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)