1package cli 2 3import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "testing" 8) 9 10func TestHandleExitCoder_nil(t *testing.T) { 11 exitCode := 0 12 called := false 13 14 OsExiter = func(rc int) { 15 if !called { 16 exitCode = rc 17 called = true 18 } 19 } 20 21 defer func() { OsExiter = fakeOsExiter }() 22 23 HandleExitCoder(nil) 24 25 expect(t, exitCode, 0) 26 expect(t, called, false) 27} 28 29func TestHandleExitCoder_ExitCoder(t *testing.T) { 30 exitCode := 0 31 called := false 32 33 OsExiter = func(rc int) { 34 if !called { 35 exitCode = rc 36 called = true 37 } 38 } 39 40 defer func() { OsExiter = fakeOsExiter }() 41 42 HandleExitCoder(NewExitError("galactic perimeter breach", 9)) 43 44 expect(t, exitCode, 9) 45 expect(t, called, true) 46} 47 48func TestHandleExitCoder_MultiErrorWithExitCoder(t *testing.T) { 49 exitCode := 0 50 called := false 51 52 OsExiter = func(rc int) { 53 if !called { 54 exitCode = rc 55 called = true 56 } 57 } 58 59 defer func() { OsExiter = fakeOsExiter }() 60 61 exitErr := NewExitError("galactic perimeter breach", 9) 62 exitErr2 := NewExitError("last ExitCoder", 11) 63 err := NewMultiError(errors.New("wowsa"), errors.New("egad"), exitErr, exitErr2) 64 HandleExitCoder(err) 65 66 expect(t, exitCode, 11) 67 expect(t, called, true) 68} 69 70// make a stub to not import pkg/errors 71type ErrorWithFormat struct { 72 error 73} 74 75func NewErrorWithFormat(m string) *ErrorWithFormat { 76 return &ErrorWithFormat{error: errors.New(m)} 77} 78 79func (f *ErrorWithFormat) Format(s fmt.State, verb rune) { 80 fmt.Fprintf(s, "This the format: %v", f.error) 81} 82 83func TestHandleExitCoder_ErrorWithFormat(t *testing.T) { 84 called := false 85 86 OsExiter = func(rc int) { 87 if !called { 88 called = true 89 } 90 } 91 ErrWriter = &bytes.Buffer{} 92 93 defer func() { 94 OsExiter = fakeOsExiter 95 ErrWriter = fakeErrWriter 96 }() 97 98 err := NewExitError(NewErrorWithFormat("I am formatted"), 1) 99 HandleExitCoder(err) 100 101 expect(t, called, true) 102 expect(t, ErrWriter.(*bytes.Buffer).String(), "This the format: I am formatted\n") 103} 104 105func TestHandleExitCoder_MultiErrorWithFormat(t *testing.T) { 106 called := false 107 108 OsExiter = func(rc int) { 109 if !called { 110 called = true 111 } 112 } 113 ErrWriter = &bytes.Buffer{} 114 115 defer func() { OsExiter = fakeOsExiter }() 116 117 err := NewMultiError(NewErrorWithFormat("err1"), NewErrorWithFormat("err2")) 118 HandleExitCoder(err) 119 120 expect(t, called, true) 121 expect(t, ErrWriter.(*bytes.Buffer).String(), "This the format: err1\nThis the format: err2\n") 122} 123