# 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
import tempfile

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, free_host_port=False):
    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, free_host_port=False):
    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
    output_file = tempfile.TemporaryFile()
    p = subprocess.Popen(command, stdout=output_file, stderr=output_file)

    wait_thread = threading.Thread(target=p.wait)
    wait_thread.start()
    wait_thread.join(timeout)

    did_time_out = False
    if p.poll() is None:
      did_time_out = True
      p.terminate()
      p.poll()
    output_file.seek(0)
    output = output_file.read()
    return p.returncode, output, did_time_out
