| package gexec |
| |
| import ( |
| "fmt" |
| |
| "github.com/onsi/gomega/format" |
| ) |
| |
| /* |
| The Exit matcher operates on a session: |
| |
| Ω(session).Should(Exit(<optional status code>)) |
| |
| Exit passes if the session has already exited. |
| |
| If no status code is provided, then Exit will succeed if the session has exited regardless of exit code. |
| Otherwise, Exit will only succeed if the process has exited with the provided status code. |
| |
| Note that the process must have already exited. To wait for a process to exit, use Eventually: |
| |
| Eventually(session, 3).Should(Exit(0)) |
| */ |
| func Exit(optionalExitCode ...int) *exitMatcher { |
| exitCode := -1 |
| if len(optionalExitCode) > 0 { |
| exitCode = optionalExitCode[0] |
| } |
| |
| return &exitMatcher{ |
| exitCode: exitCode, |
| } |
| } |
| |
| type exitMatcher struct { |
| exitCode int |
| didExit bool |
| actualExitCode int |
| } |
| |
| type Exiter interface { |
| ExitCode() int |
| } |
| |
| func (m *exitMatcher) Match(actual interface{}) (success bool, err error) { |
| exiter, ok := actual.(Exiter) |
| if !ok { |
| return false, fmt.Errorf("Exit must be passed a gexec.Exiter (Missing method ExitCode() int) Got:\n%s", format.Object(actual, 1)) |
| } |
| |
| m.actualExitCode = exiter.ExitCode() |
| |
| if m.actualExitCode == -1 { |
| return false, nil |
| } |
| |
| if m.exitCode == -1 { |
| return true, nil |
| } |
| return m.exitCode == m.actualExitCode, nil |
| } |
| |
| func (m *exitMatcher) FailureMessage(actual interface{}) (message string) { |
| if m.actualExitCode == -1 { |
| return "Expected process to exit. It did not." |
| } else { |
| return format.Message(m.actualExitCode, "to match exit code:", m.exitCode) |
| } |
| } |
| |
| func (m *exitMatcher) NegatedFailureMessage(actual interface{}) (message string) { |
| if m.actualExitCode == -1 { |
| return "you really shouldn't be able to see this!" |
| } else { |
| if m.exitCode == -1 { |
| return "Expected process not to exit. It did." |
| } else { |
| return format.Message(m.actualExitCode, "not to match exit code:", m.exitCode) |
| } |
| } |
| } |
| |
| func (m *exitMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { |
| session, ok := actual.(*Session) |
| if ok { |
| return session.ExitCode() == -1 |
| } |
| return true |
| } |