#!/usr/bin/env python
# Copyright 2019 The Fuchsia 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


class Process(object):
    """Represents a child process.

       This class is intentionally similar to subprocess, except that it allows
       various fields to be set before executing the process. Additionally, it
       allows tests to overload process creation and execution in one place;
       see FakeProcess.
    """

    def __init__(self, args, **kwargs):
        self.args = args
        self._stdin = kwargs.get('stdin', None)
        self._stdout = kwargs.get('stdout', None)
        self._stderr = kwargs.get('stderr', None)

    @property
    def stdin(self):
        return self._stdin

    @stdin.setter
    def stdin(self, stdin):
        self._stdin = stdin

    @property
    def stdout(self):
        return self._stdout

    @stdout.setter
    def stdout(self, stdout):
        self._stdout = stdout

    @property
    def stderr(self):
        return self._stderr

    @stderr.setter
    def stderr(self, stderr):
        self._stderr = stderr

    def popen(self):
        """Analogous to subprocess.Popen."""
        p = subprocess.Popen(
            self.args,
            stdin=self._stdin,
            stdout=self._stdout,
            stderr=self._stderr)
        return p

    def call(self):
        """Analogous to subprocess.call."""
        p = self.popen()
        try:
            return p.wait()
        except:
            p.kill()
            raise

    def check_call(self):
        """Analogous to subprocess.check_call."""
        rc = self.call()
        if rc != 0:
            cmd = ' '.join(self.args)
            raise subprocess.CalledProcessError(rc, cmd)
        return rc

    def check_output(self):
        """Analogous to subprocess.check_output."""
        self._stdout = subprocess.PIPE
        p = self.popen()
        out, _ = p.communicate()
        rc = p.returncode
        if rc != 0:
            cmd = ' '.join(self.args)
            raise subprocess.CalledProcessError(rc, cmd, output=out)
        return out
