github.com/cilium/cilium@v1.16.2/pkg/command/exec/exec_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package exec 5 6 import ( 7 "context" 8 "strings" 9 "testing" 10 "time" 11 12 "github.com/sirupsen/logrus" 13 "github.com/stretchr/testify/require" 14 15 "github.com/cilium/cilium/pkg/logging" 16 ) 17 18 const ( 19 timeout = 250 * time.Millisecond 20 ) 21 22 var ( 23 fooLog = logging.DefaultLogger.WithField("foo", "bar") 24 ) 25 26 func TestWithTimeout(t *testing.T) { 27 cmd := WithTimeout(timeout, "sleep", "inf") 28 err := cmd.Start() 29 require.NoError(t, err) 30 err = cmd.Wait() 31 require.Error(t, err) 32 require.Contains(t, err.Error(), "signal: killed") 33 } 34 35 func TestWithCancel(t *testing.T) { 36 cmd, cancel := WithCancel(context.Background(), "sleep", "inf") 37 require.NotNil(t, cancel) 38 err := cmd.Start() 39 require.NoError(t, err) 40 cancel() 41 } 42 43 func TestCanceled(t *testing.T) { 44 cmd, cancel := WithCancel(context.Background(), "sleep", "inf") 45 require.NotNil(t, cancel) 46 cancel() 47 _, err := cmd.CombinedOutput(fooLog, true) 48 require.Error(t, err) 49 require.Contains(t, err.Error(), "context canceled") 50 } 51 52 func TestCombinedOutput(t *testing.T) { 53 cmd := CommandContext(context.Background(), "echo", "foo") 54 out, err := cmd.CombinedOutput(fooLog, true) 55 require.NoError(t, err) 56 require.Equal(t, "foo\n", string(out)) 57 } 58 59 func TestCombinedOutputFailedTimeout(t *testing.T) { 60 cmd := WithTimeout(timeout, "sleep", "inf") 61 time.Sleep(timeout) 62 _, err := cmd.CombinedOutput(fooLog, true) 63 require.Error(t, err) 64 require.True(t, strings.Contains(err.Error(), "context deadline exceeded")) 65 } 66 67 // LoggingHook is a simple hook which saves Warn messages to a slice of strings. 68 type LoggingHook struct { 69 Lines []string 70 } 71 72 func (h *LoggingHook) Levels() []logrus.Level { 73 // CombinedOutput logs stdout and stderr on WarnLevel. 74 return []logrus.Level{ 75 logrus.WarnLevel, 76 } 77 } 78 79 func (h *LoggingHook) Fire(entry *logrus.Entry) error { 80 serializedEntry, err := entry.String() 81 if err != nil { 82 return err 83 } 84 h.Lines = append(h.Lines, serializedEntry) 85 return nil 86 }