11 from http_server_driver import HTTPServerDriver
14 _log = logging.getLogger(__name__)
17 class SimpleHTTPServerDriver(HTTPServerDriver):
19 """This class depends on unix environment, need to be modified to achieve crossplatform compability
22 platforms = ['osx', 'gtk']
25 self._server_process = None
27 self._ip = '127.0.0.1'
29 def serve(self, web_root):
30 _log.info('Launching an http server')
31 http_server_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "http_server/twisted_http_server.py")
32 self._server_process = subprocess.Popen(["/usr/bin/python", http_server_path, web_root], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
36 _log.info('Start to fetching the port number of the http server')
39 for attempt in xrange(max_attempt):
40 connections = psutil.Process(self._server_process.pid).connections()
41 if connections and connections[0].laddr and connections[0].laddr[1] and connections[0].status == 'LISTEN':
42 self._server_port = connections[0].laddr[1]
43 _log.info('HTTP Server is serving at port: %d', self._server_port)
45 _log.info('Server port is not found this time, retry after %f seconds' % interval)
49 raise Exception("Server is not listening on port, max tries exceeded. HTTP server may be installing dependent modules.")
51 for attempt in xrange(max_attempt):
53 output = subprocess.check_output(['/usr/sbin/lsof', '-a', '-iTCP', '-sTCP:LISTEN', '-p', str(self._server_process.pid)])
54 self._server_port = int(re.search('TCP \*:(\d+) \(LISTEN\)', output).group(1))
56 _log.info('HTTP Server is serving at port: %d', self._server_port)
58 except Exception as error:
59 _log.info('Error: %s' % error)
60 _log.info('Server port is not found this time, retry after %f seconds' % interval)
64 raise Exception("Cannot listen to server, max tries exceeded")
66 # Wait for server to be up completely before exiting
67 for attempt in xrange(max_attempt):
69 subprocess.check_call(["curl", "--silent", "--head", "--fail", "--output", "/dev/null", self.base_url()])
71 except Exception as error:
72 _log.info('Server not running yet: %s' % error)
74 raise Exception('Server not running, max tries exceeded: %s' % error)
77 return "http://%s:%d" % (self._ip, self._server_port)
79 def fetch_result(self):
80 (stdout, stderr) = self._server_process.communicate()
84 def kill_server(self):
86 if self._server_process.poll() is None:
87 self._server_process.terminate()
88 except OSError as error:
89 _log.info('Error terminating server process: %s' % (error))
91 def get_return_code(self):
92 return self._server_process.returncode
94 def set_device_id(self, device_id):