github.com/release-engineering/exodus-rsync@v1.11.2/internal/cmd/mixed_rsync_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"context"
     5  	"os/exec"
     6  	"testing"
     7  
     8  	"github.com/release-engineering/exodus-rsync/internal/args"
     9  	"github.com/release-engineering/exodus-rsync/internal/log"
    10  )
    11  
    12  func TestRsyncPipeFail(t *testing.T) {
    13  	cmd := exec.Command("echo", "hello")
    14  
    15  	// Get a stdout pipe, this will break doRsyncCommand because it can
    16  	// only be done once.
    17  	cmd.StdoutPipe()
    18  
    19  	code := doRsyncCommand(testContext(), cmd)
    20  	if code != 39 {
    21  		t.Errorf("got unexpected exit code %v", code)
    22  	}
    23  }
    24  
    25  func TestRsyncStartFail(t *testing.T) {
    26  	cmd := exec.Command("/non/existent/binary")
    27  
    28  	code := doRsyncCommand(testContext(), cmd)
    29  	if code != 25 {
    30  		t.Errorf("got unexpected exit code %v", code)
    31  	}
    32  }
    33  
    34  func TestRsyncFails(t *testing.T) {
    35  	cmd := exec.Command("false")
    36  
    37  	code := doRsyncCommand(testContext(), cmd)
    38  	if code != 130 {
    39  		t.Errorf("got unexpected exit code %v", code)
    40  	}
    41  }
    42  
    43  func TestRsyncPipes(t *testing.T) {
    44  	cmd := exec.Command("/bin/sh", "-c", "echo out1; echo err1 1>&2; echo out2; echo err2 1>&2")
    45  
    46  	logs := CaptureLogger(t)
    47  	ctx := log.NewContext(context.Background(), ext.log.NewLogger(args.Config{}))
    48  
    49  	code := doRsyncCommand(ctx, cmd)
    50  
    51  	// It should succeed
    52  	if code != 0 {
    53  		t.Errorf("got unexpected exit code %v", code)
    54  	}
    55  
    56  	// Stdout and stderr should have gone to loggers
    57  	if len(logs.Entries) == 0 {
    58  		t.Fatal("Did not get any log messages")
    59  	}
    60  
    61  	infoText := ""
    62  	warnText := ""
    63  
    64  	for _, entry := range logs.Entries {
    65  		if entry.Level == log.InfoLevel {
    66  			infoText = infoText + entry.Message + "\n"
    67  		}
    68  		if entry.Level == log.WarnLevel {
    69  			warnText = warnText + entry.Message + "\n"
    70  		}
    71  	}
    72  
    73  	if infoText != "out1\nout2\n" {
    74  		t.Errorf("Did not get expected stdout logs, got: %v", infoText)
    75  	}
    76  	if warnText != "err1\nerr2\n" {
    77  		t.Errorf("Did not get expected stderr logs, got: %v", warnText)
    78  	}
    79  
    80  }