github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/goutils/exec/exec_test.go (about) 1 /* 2 * Copyright (c) 2023-present unTill Software Development Group B. V. and Contributors 3 * @author Maxim Geraskin 4 * 5 * This source code is licensed under the MIT license found in the 6 * LICENSE file in the root directory of this source tree. 7 */ 8 9 package exec_test 10 11 import ( 12 "fmt" 13 "os" 14 "path/filepath" 15 "strings" 16 "testing" 17 "time" 18 19 "github.com/stretchr/testify/assert" 20 "github.com/stretchr/testify/require" 21 "github.com/voedger/voedger/pkg/goutils/exec" 22 ) 23 24 func Test_PassEnvironmentVariable(t *testing.T) { 25 26 // set MYVAR=MYVALUE 27 os.Setenv("MYVAR", "MYVALUE") 28 29 stdout, stderr, err := new(exec.PipedExec). 30 Command("sh", "-c", "echo $MYVAR"). 31 Command("sh", "-c", "grep $MYVAR"). 32 RunToStrings() 33 require.NoError(t, err) 34 require.Equal(t, "MYVALUE", strings.TrimSpace(stdout)) 35 assert.Equal(t, "", strings.TrimSpace(stderr)) 36 } 37 38 func Test_Wd(t *testing.T) { 39 40 require := require.New(t) 41 42 tmpDir1 := t.TempDir() 43 tmpDir2 := t.TempDir() 44 45 require.NoError(os.WriteFile(filepath.Join(tmpDir1, "1.txt"), []byte("11.txt"), 0644)) 46 require.NoError(os.WriteFile(filepath.Join(tmpDir2, "2.txt"), []byte("21.txt"), 0644)) 47 48 // Run ls commands 49 50 var err error 51 52 err = new(exec.PipedExec). 53 Command("ls").WorkingDir(tmpDir1). 54 Run(os.Stdout, os.Stdout) 55 require.NoError(err) 56 57 err = new(exec.PipedExec). 58 Command("ls", "1.txt").WorkingDir(tmpDir1). 59 Run(os.Stdout, os.Stdout) 60 require.NoError(err) 61 62 err = new(exec.PipedExec). 63 Command("ls", "2.txt").WorkingDir(tmpDir2). 64 Run(os.Stdout, os.Stdout) 65 require.NoError(err) 66 67 err = new(exec.PipedExec). 68 Command("ls", "1.txt").WorkingDir(tmpDir2). 69 Run(os.Stdout, os.Stdout) 70 require.Error(err) 71 72 err = new(exec.PipedExec). 73 Command("ls", "2.txt").WorkingDir(tmpDir1). 74 Run(os.Stdout, os.Stdout) 75 require.Error(err) 76 77 } 78 79 func Test_PipeFall(t *testing.T) { 80 81 // echo hi | grep hi | echo good => OK 82 { 83 err := new(exec.PipedExec). 84 Command("echo", "hi"). 85 Command("grep", "hi"). 86 Command("echo", "good"). 87 Run(os.Stdout, os.Stdout) 88 require.NoError(t, err) 89 } 90 91 // echo hi | grep hello | echo good => FAIL 92 { 93 err := new(exec.PipedExec). 94 Command("echo", "hi"). 95 Command("grep", "hello"). 96 Command("echo", "good"). 97 Run(os.Stdout, os.Stdout) 98 require.Error(t, err) 99 } 100 } 101 102 func Test_WrongCommand(t *testing.T) { 103 err := new(exec.PipedExec). 104 Command("qqqqqqjkljlj", "hello"). 105 Run(os.Stdout, os.Stdout) 106 require.Error(t, err) 107 } 108 109 func Test_EmptyCommandList(t *testing.T) { 110 err := new(exec.PipedExec). 111 Run(os.Stdout, os.Stdout) 112 require.Error(t, err) 113 } 114 115 func Test_KillProcessUsingFirst(t *testing.T) { 116 require := require.New(t) 117 pe := new(exec.PipedExec) 118 pe.Command("sleep", "10") 119 cmd := pe.GetCmd(0) 120 121 c := make(chan struct{}) 122 123 go func() { 124 defer fmt.Println("Bye") 125 <-c 126 <-time.After(300 * time.Millisecond) 127 fmt.Println("Killing process...") 128 _ = cmd.Process.Kill() 129 }() 130 131 fmt.Println("Running...") 132 133 require.NoError(pe.Start(os.Stdout, os.Stderr)) 134 c <- struct{}{} 135 136 err := pe.Wait() 137 138 fmt.Println("err=", err) 139 require.Error(err) 140 } 141 142 func Test_RunToStrings(t *testing.T) { 143 require := require.New(t) 144 { 145 stdouts, stderrs, err := new(exec.PipedExec). 146 Command("sh", "-c", "echo 11"). 147 RunToStrings() 148 require.NoError(err) 149 require.Equal("11", strings.TrimSpace(stdouts)) 150 require.Equal("", stderrs) 151 } 152 153 // 1 > &2 154 { 155 stdouts, stderrs, err := new(exec.PipedExec). 156 Command("sh", "-c", "echo 11 1>&2"). 157 RunToStrings() 158 require.NoError(err) 159 require.Equal("11", strings.TrimSpace(stderrs)) 160 require.Equal("", stdouts) 161 } 162 163 //stdout and stderr 164 { 165 stdouts, stderrs, err := new(exec.PipedExec). 166 Command("sh", "-c", "echo err 1>&2; echo std"). 167 RunToStrings() 168 require.NoError(err) 169 assert.Equal(t, "std", strings.TrimSpace(stdouts)) 170 assert.Equal(t, "err", strings.TrimSpace(stderrs)) 171 } 172 173 //Wrong command 174 { 175 stdouts, stderrs, err := new(exec.PipedExec). 176 Command("itmustbeawrongcommandPipedExecRunToStrings"). 177 RunToStrings() 178 require.Error(err) 179 assert.Equal(t, "", stdouts) 180 assert.Equal(t, "", stderrs) 181 } 182 183 }