blob: dedee5b3f5ccc487dce915ac940543a8e4c3b78a [file] [log] [blame]
# Copyright 2015 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 subprocess
import threading
from devtoolslib import http_server
from devtoolslib.shell import Shell
from devtoolslib.utils import overrides
class LinuxShell(Shell):
"""Wrapper around Mojo shell running on Linux.
Args:
executable_path: path to the shell binary
command_prefix: optional list of arguments to prepend to the shell command,
allowing e.g. to run the shell under debugger.
"""
def __init__(self, executable_path, command_prefix=None):
self.executable_path = executable_path
self.command_prefix = command_prefix if command_prefix else []
@overrides(Shell)
def serve_local_directory(self, local_dir_path, port=0):
mappings = [('', [local_dir_path])]
return 'http://%s:%d/' % http_server.start_http_server(mappings, port)
@overrides(Shell)
def serve_local_directories(self, mappings, port=0):
return 'http://%s:%d/' % http_server.start_http_server(mappings, port)
@overrides(Shell)
def forward_host_port_to_shell(self, host_port):
pass
@overrides(Shell)
def run(self, arguments):
command = self.command_prefix + [self.executable_path] + arguments
return subprocess.call(command, stderr=subprocess.STDOUT)
@overrides(Shell)
def run_and_get_output(self, arguments, timeout=None):
command = self.command_prefix + [self.executable_path] + arguments
p = subprocess.Popen(command, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
class Results:
"""Workaround for Python scoping rules that prevent assigning to variables
from the outer scope.
"""
output = None
def do_run():
(Results.output, _) = p.communicate()
run_thread = threading.Thread(target=do_run)
run_thread.start()
run_thread.join(timeout)
if run_thread.is_alive():
p.terminate()
return p.returncode, Results.output, True
return p.returncode, Results.output, False