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 }