|  | package gexec_test | 
|  |  | 
|  | import ( | 
|  | . "github.com/onsi/gomega/gexec" | 
|  | "os/exec" | 
|  | "time" | 
|  |  | 
|  | . "github.com/onsi/ginkgo" | 
|  | . "github.com/onsi/gomega" | 
|  | ) | 
|  |  | 
|  | type NeverExits struct{} | 
|  |  | 
|  | func (e NeverExits) ExitCode() int { | 
|  | return -1 | 
|  | } | 
|  |  | 
|  | var _ = Describe("ExitMatcher", func() { | 
|  | var command *exec.Cmd | 
|  | var session *Session | 
|  |  | 
|  | BeforeEach(func() { | 
|  | var err error | 
|  | command = exec.Command(fireflyPath, "0") | 
|  | session, err = Start(command, nil, nil) | 
|  | Ω(err).ShouldNot(HaveOccurred()) | 
|  | }) | 
|  |  | 
|  | Describe("when passed something that is an Exiter", func() { | 
|  | It("should act normally", func() { | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Ω(NeverExits{}).Should(Exit()) | 
|  | }) | 
|  |  | 
|  | Ω(failures[0]).Should(ContainSubstring("Expected process to exit.  It did not.")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Describe("when passed something that is not an Exiter", func() { | 
|  | It("should error", func() { | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Ω("aardvark").Should(Exit()) | 
|  | }) | 
|  |  | 
|  | Ω(failures[0]).Should(ContainSubstring("Exit must be passed a gexec.Exiter")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("with no exit code", func() { | 
|  | It("should say the right things when it fails", func() { | 
|  | Ω(session).ShouldNot(Exit()) | 
|  |  | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Ω(session).Should(Exit()) | 
|  | }) | 
|  |  | 
|  | Ω(failures[0]).Should(ContainSubstring("Expected process to exit.  It did not.")) | 
|  |  | 
|  | Eventually(session).Should(Exit()) | 
|  |  | 
|  | Ω(session).Should(Exit()) | 
|  |  | 
|  | failures = InterceptGomegaFailures(func() { | 
|  | Ω(session).ShouldNot(Exit()) | 
|  | }) | 
|  |  | 
|  | Ω(failures[0]).Should(ContainSubstring("Expected process not to exit.  It did.")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("with an exit code", func() { | 
|  | It("should say the right things when it fails", func() { | 
|  | Ω(session).ShouldNot(Exit(0)) | 
|  | Ω(session).ShouldNot(Exit(1)) | 
|  |  | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Ω(session).Should(Exit(0)) | 
|  | }) | 
|  |  | 
|  | Ω(failures[0]).Should(ContainSubstring("Expected process to exit.  It did not.")) | 
|  |  | 
|  | Eventually(session).Should(Exit(0)) | 
|  |  | 
|  | Ω(session).Should(Exit(0)) | 
|  |  | 
|  | failures = InterceptGomegaFailures(func() { | 
|  | Ω(session).Should(Exit(1)) | 
|  | }) | 
|  |  | 
|  | Ω(failures[0]).Should(ContainSubstring("to match exit code:")) | 
|  |  | 
|  | Ω(session).ShouldNot(Exit(1)) | 
|  |  | 
|  | failures = InterceptGomegaFailures(func() { | 
|  | Ω(session).ShouldNot(Exit(0)) | 
|  | }) | 
|  |  | 
|  | Ω(failures[0]).Should(ContainSubstring("not to match exit code:")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Describe("bailing out early", func() { | 
|  | It("should bail out early once the process exits", func() { | 
|  | t := time.Now() | 
|  |  | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Eventually(session).Should(Exit(1)) | 
|  | }) | 
|  | Ω(time.Since(t)).Should(BeNumerically("<=", 500*time.Millisecond)) | 
|  | Ω(failures).Should(HaveLen(1)) | 
|  | }) | 
|  | }) | 
|  | }) |