func (r *Runner) Run(sigChan <-chan os.Signal, ready chan<- struct{}) error { defer ginkgo.GinkgoRecover() allOutput := gbytes.NewBuffer() debugWriter := gexec.NewPrefixedWriter( fmt.Sprintf("\x1b[32m[d]\x1b[%s[%s]\x1b[0m ", r.AnsiColorCode, r.Name), ginkgo.GinkgoWriter, ) session, err := gexec.Start( r.Command, gexec.NewPrefixedWriter( fmt.Sprintf("\x1b[32m[o]\x1b[%s[%s]\x1b[0m ", r.AnsiColorCode, r.Name), io.MultiWriter(allOutput, ginkgo.GinkgoWriter), ), gexec.NewPrefixedWriter( fmt.Sprintf("\x1b[91m[e]\x1b[%s[%s]\x1b[0m ", r.AnsiColorCode, r.Name), io.MultiWriter(allOutput, ginkgo.GinkgoWriter), ), ) Ω(err).ShouldNot(HaveOccurred()) fmt.Fprintf(debugWriter, "spawned %s (pid: %d)\n", r.Command.Path, r.Command.Process.Pid) r.session = session if r.sessionReady != nil { close(r.sessionReady) } startCheckDuration := r.StartCheckTimeout if startCheckDuration == 0 { startCheckDuration = 5 * time.Second } var startCheckTimeout <-chan time.Time if r.StartCheck != "" { startCheckTimeout = time.After(startCheckDuration) } detectStartCheck := allOutput.Detect(r.StartCheck) for { select { case <-detectStartCheck: // works even with empty string allOutput.CancelDetects() startCheckTimeout = nil detectStartCheck = nil close(ready) case <-startCheckTimeout: // clean up hanging process session.Kill().Wait() // fail to start return fmt.Errorf( "did not see %s in command's output within %s. full output:\n\n%s", r.StartCheck, startCheckDuration, string(allOutput.Contents()), ) case signal := <-sigChan: session.Signal(signal) case <-session.Exited: if r.Cleanup != nil { r.Cleanup() } if session.ExitCode() == 0 { return nil } return fmt.Errorf("exit status %d", session.ExitCode()) } } }
err = os.MkdirAll(pathB, 0700) Ω(err).ShouldNot(HaveOccurred()) err = os.MkdirAll(pathC, 0700) Ω(err).ShouldNot(HaveOccurred()) copyIn(filepath.Join("watch_fixtures", "A"), pathA) copyIn(filepath.Join("watch_fixtures", "B"), pathB) copyIn(filepath.Join("watch_fixtures", "C"), pathC) }) startGinkgoWithGopath := func(args ...string) *gexec.Session { cmd := ginkgoCommand(rootPath, args...) cmd.Env = append([]string{"GOPATH=" + rootPath + ":" + os.Getenv("GOPATH")}, os.Environ()...) session, err := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) Ω(err).ShouldNot(HaveOccurred()) return session } modifyFile := func(path string) { time.Sleep(time.Second) content, err := ioutil.ReadFile(path) Ω(err).ShouldNot(HaveOccurred()) content = append(content, []byte("//")...) err = ioutil.WriteFile(path, content, 0666) Ω(err).ShouldNot(HaveOccurred()) } modifyCode := func(pkgToModify string) { modifyFile(filepath.Join(rootPath, "src", "github.com", "onsi", pkgToModify, pkgToModify+".go"))
func startGinkgo(dir string, args ...string) *gexec.Session { cmd := ginkgoCommand(dir, args...) session, err := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) Ω(err).ShouldNot(HaveOccurred()) return session }
insecureDockerRegistries string dockerDaemonExecutablePath string cacheDockerImage bool dockerLoginServer string dockerUser string dockerPassword string dockerEmail string outputMetadataDir string outputMetadataJSONFilename string fakeDockerRegistry *ghttp.Server ) setupBuilder := func() *gexec.Session { session, err := gexec.Start( builderCmd, GinkgoWriter, GinkgoWriter, ) Expect(err).NotTo(HaveOccurred()) return session } setupFakeDockerRegistry := func() { fakeDockerRegistry.AppendHandlers( ghttp.VerifyRequest("GET", "/v1/_ping"), ghttp.CombineHandlers( ghttp.VerifyRequest("GET", "/v1/repositories/some-repo/images"), http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { w.Header().Set("X-Docker-Token", "token-1,token-2") w.Write([]byte(`[
os.Environ(), "PORT=8080", "INSTANCE_GUID=some-instance-guid", "INSTANCE_INDEX=123", `VCAP_APPLICATION={"foo":1}`, ), } }) AfterEach(func() { os.RemoveAll(appDir) }) JustBeforeEach(func() { var err error session, err = gexec.Start(launcherCmd, GinkgoWriter, GinkgoWriter) Expect(err).NotTo(HaveOccurred()) }) var ItExecutesTheCommandWithTheRightEnvironment = func() { It("executes the start command", func() { Eventually(session).Should(gbytes.Say("running app")) }) It("executes the start command with $HOME as the given dir", func() { Eventually(session).Should(gbytes.Say("HOME=" + appDir)) }) It("executes the start command with $TMPDIR as the given dir + /tmp", func() { Eventually(session).Should(gbytes.Say("TMPDIR=" + appDir + "/tmp")) })