// Copyright 2020 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.

package fuzz

import (
	"os"
	"os/exec"

	"github.com/golang/glog"
)

// ExecCommand is the function used by CreateProcess to create Cmd objects. Test code can replace
// the default to mock process creation.
var ExecCommand = exec.Command

// NewCommand returns a Cmd that can be used to start a new os.Process by calling Run or Start.
// It is provided to allow the test code to mock process creation.
func NewCommand(name string, args ...string) *exec.Cmd {
	cmd := ExecCommand(name, args...)
	glog.Infof("Running local command: %q", cmd)
	return cmd
}

// CreateProcessForeground is like CreateProcess but passes through any command output
func CreateProcessForeground(name string, args ...string) error {
	cmd := NewCommand(name, args...)
	cmd.Stderr, cmd.Stdout = os.Stderr, os.Stdout
	return cmd.Run()
}

// Run a command to completion
func CreateProcess(name string, args ...string) error {
	cmd := NewCommand(name, args...)
	return cmd.Run()
}
