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

package execution

import (
	"bytes"
	"context"
	"os/exec"
	"testing"
)

func TestExecAll(t *testing.T) {
	echo, err := exec.LookPath("echo")
	if err != nil {
		t.Fatal(err)
	}
	type command struct {
		cmd             []string
		expectedSuccess bool
		expectedOutput  string
	}
	helloCmd := command{cmd: []string{echo, "hello"}, expectedSuccess: true, expectedOutput: "hello"}
	byeCmd := command{cmd: []string{echo, "bye"}, expectedSuccess: true, expectedOutput: "bye"}
	unknownCmd := command{cmd: []string{"unknownCmd"}, expectedSuccess: false, expectedOutput: "failed to exec cmd"}
	tests := []struct {
		name string
		cmds []command
	}{
		{"All pass", []command{helloCmd, byeCmd}},
		{"Middle command fails", []command{helloCmd, unknownCmd, byeCmd}},
		{"Last command fails", []command{helloCmd, byeCmd, unknownCmd}},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			ctx := context.Background()
			var stdout, stderr bytes.Buffer
			executor := NewExecutor(&stdout, &stderr, "")
			var cmds [][]string
			var expectedErr bool
			for _, cmd := range test.cmds {
				cmds = append(cmds, cmd.cmd)
				if !cmd.expectedSuccess {
					expectedErr = true
				}
			}
			err := executor.ExecAll(ctx, cmds)
			if expectedErr && err == nil {
				t.Fatal("expected an error but didn't get one.")
			}
			if !expectedErr && err != nil {
				t.Fatalf("failed with error: %v", err)
			}
		})
	}
}
