blob: fddab1c3c5eb5e6f09c4085e736413cd38d0e4e1 [file] [log] [blame]
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import inspect
import os
import socket
import sys
import time
class TimeoutException(Exception):
pass
def GetBaseDir():
main_module = sys.modules['__main__']
if hasattr(main_module, '__file__'):
return os.path.dirname(os.path.abspath(main_module.__file__))
else:
return os.getcwd()
def GetTelemetryDir():
return os.path.normpath(os.path.join(
__file__, os.pardir, os.pardir, os.pardir))
def GetUnittestDataDir():
return os.path.join(GetTelemetryDir(), 'unittest_data')
def GetChromiumSrcDir():
return os.path.normpath(os.path.join(GetTelemetryDir(), os.pardir, os.pardir))
def WaitFor(condition,
timeout, poll_interval=0.1,
pass_time_left_to_func=False):
assert isinstance(condition, type(lambda: None)) # is function
start_time = time.time()
while True:
if pass_time_left_to_func:
res = condition(max((start_time + timeout) - time.time(), 0.0))
else:
res = condition()
if res:
break
if time.time() - start_time > timeout:
if condition.__name__ == '<lambda>':
try:
condition_string = inspect.getsource(condition).strip()
except IOError:
condition_string = condition.__name__
else:
condition_string = condition.__name__
raise TimeoutException('Timed out while waiting %ds for %s.' %
(timeout, condition_string))
time.sleep(poll_interval)
def FindElementAndPerformAction(tab, text, callback_code):
"""JavaScript snippet for finding an element with a given text on a page."""
code = """
(function() {
var callback_function = """ + callback_code + """;
function _findElement(element, text) {
if (element.innerHTML == text) {
callback_function
return element;
}
for (var i in element.childNodes) {
var found = _findElement(element.childNodes[i], text);
if (found)
return found;
}
return null;
}
var _element = _findElement(document, \"""" + text + """\");
return callback_function(_element);
})();"""
return tab.EvaluateJavaScript(code)
class PortPair(object):
def __init__(self, local_port, remote_port):
self.local_port = local_port
self.remote_port = remote_port
def GetAvailableLocalPort():
tmp = socket.socket()
tmp.bind(('', 0))
port = tmp.getsockname()[1]
tmp.close()
return port
def CloseConnections(tab):
"""Closes all TCP sockets held open by the browser."""
try:
tab.ExecuteJavaScript("""window.chrome && chrome.benchmarking &&
chrome.benchmarking.closeConnections()""")
except Exception:
pass
def GetBuildDirectories():
"""Yields all combination of Chromium build output directories."""
build_dirs = ['build',
'out',
'sconsbuild',
'xcodebuild']
build_types = ['Debug', 'Debug_x64', 'Release', 'Release_x64']
for build_dir in build_dirs:
for build_type in build_types:
yield build_dir, build_type