...

Source file src/sigs.k8s.io/release-utils/command/command_test.go

Documentation: sigs.k8s.io/release-utils/command

     1  /*
     2  Copyright 2019 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package command
    18  
    19  import (
    20  	"bytes"
    21  	"os"
    22  	"testing"
    23  
    24  	"github.com/stretchr/testify/require"
    25  )
    26  
    27  func TestSuccess(t *testing.T) {
    28  	res, err := New("echo", "hi").Run()
    29  	require.Nil(t, err)
    30  	require.True(t, res.Success())
    31  	require.Zero(t, res.ExitCode())
    32  }
    33  
    34  func TestSuccessPipe(t *testing.T) {
    35  	res, err := New("echo", "-n", "hi").
    36  		Pipe("cat").
    37  		Pipe("cat").
    38  		Run()
    39  	require.Nil(t, err)
    40  	require.True(t, res.Success())
    41  	require.Zero(t, res.ExitCode())
    42  	require.Equal(t, "hi", res.Output())
    43  }
    44  
    45  func TestFailurePipeWrongCommand(t *testing.T) {
    46  	res, err := New("echo", "-n", "hi").
    47  		Pipe("wrong").
    48  		Run()
    49  	require.NotNil(t, err)
    50  	require.Nil(t, res)
    51  }
    52  
    53  func TestFailurePipeWrongArgument(t *testing.T) {
    54  	res, err := New("echo", "-n", "hi").
    55  		Pipe("cat", "--wrong").
    56  		Run()
    57  	require.Nil(t, err)
    58  	require.False(t, res.Success())
    59  	require.Empty(t, res.Output())
    60  	require.NotEmpty(t, res.Error())
    61  }
    62  
    63  func TestSuccessVerbose(t *testing.T) {
    64  	res, err := New("echo", "hi").Verbose().Run()
    65  	require.Nil(t, err)
    66  	require.True(t, res.Success())
    67  	require.Zero(t, res.ExitCode())
    68  }
    69  
    70  func TestSuccessWithWorkingDir(t *testing.T) {
    71  	res, err := NewWithWorkDir("/", "ls", "-1").Run()
    72  	require.Nil(t, err)
    73  	require.True(t, res.Success())
    74  	require.Zero(t, res.ExitCode())
    75  }
    76  
    77  func TestFailureWithWrongWorkingDir(t *testing.T) {
    78  	res, err := NewWithWorkDir("/should/not/exist", "ls", "-1").Run()
    79  	require.NotNil(t, err)
    80  	require.Nil(t, res)
    81  }
    82  
    83  func TestSuccessSilent(t *testing.T) {
    84  	res, err := New("echo", "hi").RunSilent()
    85  	require.Nil(t, err)
    86  	require.True(t, res.Success())
    87  }
    88  
    89  func TestSuccessSeparated(t *testing.T) {
    90  	res, err := New("echo", "hi").RunSilent()
    91  	require.Nil(t, err)
    92  	require.True(t, res.Success())
    93  }
    94  
    95  func TestSuccessSingleArgument(t *testing.T) {
    96  	res, err := New("echo").Run()
    97  	require.Nil(t, err)
    98  	require.True(t, res.Success())
    99  }
   100  
   101  func TestSuccessNoArgument(t *testing.T) {
   102  	res, err := New("").Run()
   103  	require.NotNil(t, err)
   104  	require.Nil(t, res)
   105  }
   106  
   107  func TestSuccessOutput(t *testing.T) {
   108  	res, err := New("echo", "-n", "hello world").Run()
   109  	require.Nil(t, err)
   110  	require.Equal(t, "hello world", res.Output())
   111  }
   112  
   113  func TestSuccessOutputTrimNL(t *testing.T) {
   114  	res, err := New("echo", "-n", "hello world\n").Run()
   115  	require.Nil(t, err)
   116  	require.Equal(t, "hello world", res.OutputTrimNL())
   117  }
   118  
   119  func TestSuccessError(t *testing.T) {
   120  	res, err := New("cat", "/not/valid").Run()
   121  	require.Nil(t, err)
   122  	require.Empty(t, res.Output())
   123  	require.Contains(t, res.Error(), "No such file")
   124  }
   125  
   126  func TestSuccessOutputSeparated(t *testing.T) {
   127  	res, err := New("echo", "-n", "hello").Run()
   128  	require.Nil(t, err)
   129  	require.Equal(t, "hello", res.Output())
   130  }
   131  
   132  func TestFailureStdErr(t *testing.T) {
   133  	res, err := New("cat", "/not/valid").Run()
   134  	require.Nil(t, err)
   135  	require.False(t, res.Success())
   136  	require.Equal(t, res.ExitCode(), 1)
   137  }
   138  
   139  func TestFailureNotExisting(t *testing.T) {
   140  	res, err := New("/not/valid").Run()
   141  	require.NotNil(t, err)
   142  	require.Nil(t, res)
   143  }
   144  
   145  func TestSuccessExecute(t *testing.T) {
   146  	err := Execute("echo", "-n", "hi", "ho")
   147  	require.Nil(t, err)
   148  }
   149  
   150  func TestFailureExecute(t *testing.T) {
   151  	err := Execute("cat", "/not/invalid")
   152  	require.NotNil(t, err)
   153  }
   154  
   155  func TestAvailableSuccessValidCommand(t *testing.T) {
   156  	res := Available("echo")
   157  	require.True(t, res)
   158  }
   159  
   160  func TestAvailableSuccessEmptyCommands(t *testing.T) {
   161  	res := Available()
   162  	require.True(t, res)
   163  }
   164  
   165  func TestAvailableFailure(t *testing.T) {
   166  	res := Available("echo", "this-command-should-not-exist")
   167  	require.False(t, res)
   168  }
   169  
   170  func TestSuccessRunSuccess(t *testing.T) {
   171  	require.Nil(t, New("echo", "hi").RunSuccess())
   172  }
   173  
   174  func TestFailureRunSuccess(t *testing.T) {
   175  	require.NotNil(t, New("cat", "/not/available").RunSuccess())
   176  }
   177  
   178  func TestSuccessRunSilentSuccess(t *testing.T) {
   179  	require.Nil(t, New("echo", "hi").RunSilentSuccess())
   180  }
   181  
   182  func TestFailureRunSuccessSilent(t *testing.T) {
   183  	require.NotNil(t, New("cat", "/not/available").RunSilentSuccess())
   184  }
   185  
   186  func TestSuccessRunSuccessOutput(t *testing.T) {
   187  	res, err := New("echo", "-n", "hi").RunSuccessOutput()
   188  	require.Nil(t, err)
   189  	require.Equal(t, "hi", res.Output())
   190  }
   191  
   192  func TestFailureRunSuccessOutput(t *testing.T) {
   193  	res, err := New("cat", "/not/available").RunSuccessOutput()
   194  	require.NotNil(t, err)
   195  	require.Nil(t, res)
   196  }
   197  
   198  func TestSuccessRunSilentSuccessOutput(t *testing.T) {
   199  	res, err := New("echo", "-n", "hi").RunSilentSuccessOutput()
   200  	require.Nil(t, err)
   201  	require.Equal(t, "hi", res.Output())
   202  }
   203  
   204  func TestFailureRunSilentSuccessOutput(t *testing.T) {
   205  	res, err := New("cat", "/not/available").RunSilentSuccessOutput()
   206  	require.NotNil(t, err)
   207  	require.Nil(t, res)
   208  }
   209  
   210  func TestSuccessLogWriter(t *testing.T) {
   211  	f, err := os.CreateTemp("", "log")
   212  	require.Nil(t, err)
   213  	defer func() { require.Nil(t, os.Remove(f.Name())) }()
   214  
   215  	res, err := New("echo", "Hello World").AddWriter(f).RunSuccessOutput()
   216  	require.Nil(t, err)
   217  
   218  	content, err := os.ReadFile(f.Name())
   219  	require.Nil(t, err)
   220  	require.Equal(t, res.Output(), string(content))
   221  }
   222  
   223  func TestSuccessLogWriterMultiple(t *testing.T) {
   224  	f, err := os.CreateTemp("", "log")
   225  	require.Nil(t, err)
   226  	defer func() { require.Nil(t, os.Remove(f.Name())) }()
   227  	b := &bytes.Buffer{}
   228  
   229  	res, err := New("echo", "Hello World").
   230  		AddWriter(f).
   231  		AddWriter(b).
   232  		RunSuccessOutput()
   233  	require.Nil(t, err)
   234  
   235  	content, err := os.ReadFile(f.Name())
   236  	require.Nil(t, err)
   237  	require.Equal(t, res.Output(), string(content))
   238  	require.Equal(t, res.Output(), b.String())
   239  }
   240  
   241  func TestSuccessLogWriterSilent(t *testing.T) {
   242  	f, err := os.CreateTemp("", "log")
   243  	require.Nil(t, err)
   244  	defer func() { require.Nil(t, os.Remove(f.Name())) }()
   245  
   246  	err = New("echo", "Hello World").AddWriter(f).RunSilentSuccess()
   247  	require.Nil(t, err)
   248  
   249  	content, err := os.ReadFile(f.Name())
   250  	require.Nil(t, err)
   251  	require.Empty(t, content)
   252  }
   253  
   254  func TestSuccessLogWriterStdErr(t *testing.T) {
   255  	f, err := os.CreateTemp("", "log")
   256  	require.Nil(t, err)
   257  	defer func() { require.Nil(t, os.Remove(f.Name())) }()
   258  
   259  	res, err := New("bash", "-c", ">&2 echo error").
   260  		AddWriter(f).RunSuccessOutput()
   261  	require.Nil(t, err)
   262  
   263  	content, err := os.ReadFile(f.Name())
   264  	require.Nil(t, err)
   265  	require.Equal(t, res.Error(), string(content))
   266  }
   267  
   268  func TestSuccessLogWriterStdErrAndStdOut(t *testing.T) {
   269  	f, err := os.CreateTemp("", "log")
   270  	require.Nil(t, err)
   271  	defer func() { require.Nil(t, os.Remove(f.Name())) }()
   272  
   273  	res, err := New("bash", "-c", ">&2 echo stderr; echo stdout").
   274  		AddWriter(f).RunSuccessOutput()
   275  	require.Nil(t, err)
   276  
   277  	content, err := os.ReadFile(f.Name())
   278  	require.Nil(t, err)
   279  	require.Contains(t, string(content), res.Output())
   280  	require.Contains(t, string(content), res.Error())
   281  }
   282  
   283  func TestSuccessLogWriterStdErrAndStdOutOnlyStdErr(t *testing.T) {
   284  	f, err := os.CreateTemp("", "log")
   285  	require.Nil(t, err)
   286  	defer func() { require.Nil(t, os.Remove(f.Name())) }()
   287  
   288  	res, err := New("bash", "-c", ">&2 echo stderr; echo stdout").
   289  		AddErrorWriter(f).RunSuccessOutput()
   290  	require.Nil(t, err)
   291  
   292  	content, err := os.ReadFile(f.Name())
   293  	require.Nil(t, err)
   294  	require.Equal(t, res.Error(), string(content))
   295  }
   296  
   297  func TestSuccessLogWriterStdErrAndStdOutOnlyStdOut(t *testing.T) {
   298  	f, err := os.CreateTemp("", "log")
   299  	require.Nil(t, err)
   300  	defer func() { require.Nil(t, os.Remove(f.Name())) }()
   301  
   302  	res, err := New("bash", "-c", ">&2 echo stderr; echo stdout").
   303  		AddOutputWriter(f).RunSuccessOutput()
   304  	require.Nil(t, err)
   305  
   306  	content, err := os.ReadFile(f.Name())
   307  	require.Nil(t, err)
   308  	require.Equal(t, res.Output(), string(content))
   309  }
   310  
   311  func TestCommandsSuccess(t *testing.T) {
   312  	res, err := New("echo", "1").Verbose().
   313  		Add("echo", "2").Add("echo", "3").Run()
   314  	require.Nil(t, err)
   315  	require.True(t, res.Success())
   316  	require.Zero(t, res.ExitCode())
   317  	require.Contains(t, res.Output(), "1")
   318  	require.Contains(t, res.Output(), "2")
   319  	require.Contains(t, res.Output(), "3")
   320  }
   321  
   322  func TestCommandsFailure(t *testing.T) {
   323  	res, err := New("echo", "1").Add("wrong").Add("echo", "3").Run()
   324  	require.NotNil(t, err)
   325  	require.Nil(t, res)
   326  }
   327  
   328  func TestEnv(t *testing.T) {
   329  	require.Nil(t, os.Setenv("ABC", "test")) // preserved
   330  	require.Nil(t, os.Setenv("FOO", "test")) // overwritten
   331  	res, err := New("sh", "-c", "echo $TEST; echo $FOO; echo $ABC").
   332  		Env("TEST=123").
   333  		Env("FOO=bar").
   334  		RunSuccessOutput()
   335  	require.Nil(t, err)
   336  	require.Equal(t, "123\nbar\ntest", res.OutputTrimNL())
   337  }
   338  
   339  func TestFilterStdout(t *testing.T) {
   340  	cmd, err := New("echo", "-n", "1 2 2 3").Filter("[25]", "0")
   341  	require.Nil(t, err)
   342  
   343  	res, err := cmd.Add("echo", "-n", "4 5 6 2 2").Run()
   344  	require.Nil(t, err)
   345  	require.True(t, res.Success())
   346  	require.Zero(t, res.ExitCode())
   347  	require.Equal(t, "\n1 0 0 3\n4 0 6 0 0", res.Output())
   348  }
   349  
   350  func TestFilterStderr(t *testing.T) {
   351  	res, err := New("bash", "-c", ">&2 echo -n my secret").Filter("secret", "***")
   352  	require.Nil(t, err)
   353  	out, err := res.RunSilentSuccessOutput()
   354  	require.Nil(t, err)
   355  	require.Equal(t, "my ***", out.Error())
   356  	require.Empty(t, out.Output())
   357  }
   358  

View as plain text