You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

173 lines
3.1 KiB

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