https://bugs.webkit.org/show_bug.cgi?id=144038
[WebKit-https.git] / Tools / Scripts / webkitpy / benchmark_runner / utils.py
1 #!/usr/bin/env python
2
3 import json
4 import logging
5 import os
6 import signal
7
8
9 _log = logging.getLogger(__name__)
10
11
12 class ModuleNotFoundError(Exception):
13     pass
14
15
16 def loadModule(moduleDesc):
17     try:
18         ret = getattr(__import__(moduleDesc['filePath'], globals(), locals(), moduleDesc['moduleName'], -1), moduleDesc['moduleName'])
19         return ret
20     except Exception as e:
21         raise ModuleNotFoundError('Module (%s) with path(%s) is not found' % (moduleDesc['moduleName'], moduleDesc['filePath']))
22
23
24 def getPathFromProjectRoot(relativePathToProjectRoot):
25     # Choose the directory containning current file as start point,
26     # compute relative path base on the parameter,
27     # and return an absolute path
28     return os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), relativePathToProjectRoot))
29
30
31 def loadJSONFromFile(filePath):
32     try:
33         jsonObject = json.load(open(filePath, 'r'))
34         assert(jsonObject)
35         return jsonObject
36     except:
37         raise Exception("Invalid json format or empty json was found in %s" % (filePath))
38
39
40 # Borrow this code from
41 # 'http://stackoverflow.com/questions/2281850/timeout-function-if-it-takes-too-long-to-finish'
42 class TimeoutError(Exception):
43     pass
44
45
46 class timeout:
47
48     def __init__(self, seconds=1, error_message='Timeout'):
49         self.seconds = seconds
50         self.error_message = error_message
51
52     def handle_timeout(self, signum, frame):
53         raise TimeoutError(self.error_message)
54
55     def __enter__(self):
56         signal.signal(signal.SIGALRM, self.handle_timeout)
57         signal.alarm(self.seconds)
58
59     def __exit__(self, type, value, traceback):
60         signal.alarm(0)