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  }