github.com/HACKERALERT/Picocrypt/src/external/sys@v0.0.0-20210609020157-e519952f829f/execabs/execabs_test.go (about)

     1  // Copyright 2020 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package execabs
     6  
     7  import (
     8  	"context"
     9  	"fmt"
    10  	"io/ioutil"
    11  	"os"
    12  	"os/exec"
    13  	"path/filepath"
    14  	"runtime"
    15  	"testing"
    16  )
    17  
    18  // hasExec reports whether the current system can start new processes
    19  // using os.StartProcess or (more commonly) exec.Command.
    20  // Copied from internal/testenv.HasExec
    21  func hasExec() bool {
    22  	switch runtime.GOOS {
    23  	case "js", "ios":
    24  		return false
    25  	}
    26  	return true
    27  }
    28  
    29  // mustHaveExec checks that the current system can start new processes
    30  // using os.StartProcess or (more commonly) exec.Command.
    31  // If not, mustHaveExec calls t.Skip with an explanation.
    32  // Copied from internal/testenv.MustHaveExec
    33  func mustHaveExec(t testing.TB) {
    34  	if !hasExec() {
    35  		t.Skipf("skipping test: cannot exec subprocess on %s/%s", runtime.GOOS, runtime.GOARCH)
    36  	}
    37  }
    38  
    39  func TestFixCmd(t *testing.T) {
    40  	cmd := &exec.Cmd{Path: "hello"}
    41  	fixCmd("hello", cmd)
    42  	if cmd.Path != "" {
    43  		t.Errorf("fixCmd didn't clear cmd.Path")
    44  	}
    45  	expectedErr := fmt.Sprintf("hello resolves to executable in current directory (.%chello)", filepath.Separator)
    46  	if err := cmd.Run(); err == nil {
    47  		t.Fatal("Command.Run didn't fail")
    48  	} else if err.Error() != expectedErr {
    49  		t.Fatalf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error())
    50  	}
    51  }
    52  
    53  func TestCommand(t *testing.T) {
    54  	mustHaveExec(t)
    55  
    56  	for _, cmd := range []func(string) *Cmd{
    57  		func(s string) *Cmd { return Command(s) },
    58  		func(s string) *Cmd { return CommandContext(context.Background(), s) },
    59  	} {
    60  		tmpDir, err := ioutil.TempDir("", "execabs-test")
    61  		if err != nil {
    62  			t.Fatalf("ioutil.TempDir failed: %s", err)
    63  		}
    64  		defer os.RemoveAll(tmpDir)
    65  		executable := "execabs-test"
    66  		if runtime.GOOS == "windows" {
    67  			executable += ".exe"
    68  		}
    69  		if err = ioutil.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil {
    70  			t.Fatalf("ioutil.WriteFile failed: %s", err)
    71  		}
    72  		cwd, err := os.Getwd()
    73  		if err != nil {
    74  			t.Fatalf("os.Getwd failed: %s", err)
    75  		}
    76  		defer os.Chdir(cwd)
    77  		if err = os.Chdir(tmpDir); err != nil {
    78  			t.Fatalf("os.Chdir failed: %s", err)
    79  		}
    80  		if runtime.GOOS != "windows" {
    81  			// add "." to PATH so that exec.LookPath looks in the current directory on
    82  			// non-windows platforms as well
    83  			origPath := os.Getenv("PATH")
    84  			defer os.Setenv("PATH", origPath)
    85  			os.Setenv("PATH", fmt.Sprintf(".:%s", origPath))
    86  		}
    87  		expectedErr := fmt.Sprintf("execabs-test resolves to executable in current directory (.%c%s)", filepath.Separator, executable)
    88  		if err = cmd("execabs-test").Run(); err == nil {
    89  			t.Fatalf("Command.Run didn't fail when exec.LookPath returned a relative path")
    90  		} else if err.Error() != expectedErr {
    91  			t.Errorf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error())
    92  		}
    93  	}
    94  }
    95  
    96  func TestLookPath(t *testing.T) {
    97  	mustHaveExec(t)
    98  
    99  	tmpDir, err := ioutil.TempDir("", "execabs-test")
   100  	if err != nil {
   101  		t.Fatalf("ioutil.TempDir failed: %s", err)
   102  	}
   103  	defer os.RemoveAll(tmpDir)
   104  	executable := "execabs-test"
   105  	if runtime.GOOS == "windows" {
   106  		executable += ".exe"
   107  	}
   108  	if err = ioutil.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil {
   109  		t.Fatalf("ioutil.WriteFile failed: %s", err)
   110  	}
   111  	cwd, err := os.Getwd()
   112  	if err != nil {
   113  		t.Fatalf("os.Getwd failed: %s", err)
   114  	}
   115  	defer os.Chdir(cwd)
   116  	if err = os.Chdir(tmpDir); err != nil {
   117  		t.Fatalf("os.Chdir failed: %s", err)
   118  	}
   119  	if runtime.GOOS != "windows" {
   120  		// add "." to PATH so that exec.LookPath looks in the current directory on
   121  		// non-windows platforms as well
   122  		origPath := os.Getenv("PATH")
   123  		defer os.Setenv("PATH", origPath)
   124  		os.Setenv("PATH", fmt.Sprintf(".:%s", origPath))
   125  	}
   126  	expectedErr := fmt.Sprintf("execabs-test resolves to executable in current directory (.%c%s)", filepath.Separator, executable)
   127  	if _, err := LookPath("execabs-test"); err == nil {
   128  		t.Fatalf("LookPath didn't fail when finding a non-relative path")
   129  	} else if err.Error() != expectedErr {
   130  		t.Errorf("LookPath returned unexpected error: want %q, got %q", expectedErr, err.Error())
   131  	}
   132  }