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  }