func (t *testRunner) runParallelGinkgoSuite(suite *testsuite.TestSuite) bool { completions := make(chan bool) for cpu := 0; cpu < t.numCPU; cpu++ { config.GinkgoConfig.ParallelNode = cpu + 1 config.GinkgoConfig.ParallelTotal = t.numCPU ginkgoArgs := config.BuildFlagArgs("ginkgo", config.GinkgoConfig, config.DefaultReporterConfig) buffer := new(bytes.Buffer) t.reports = append(t.reports, buffer) go t.runCompiledSuite(suite, ginkgoArgs, nil, buffer, completions) } passed := true for cpu := 0; cpu < t.numCPU; cpu++ { passed = <-completions && passed } for _, report := range t.reports { fmt.Print(report.String()) } os.Stdout.Sync() return passed }
func (t *testRunner) runSerialGinkgoSuite(suite *testsuite.TestSuite) bool { ginkgoArgs := config.BuildFlagArgs("ginkgo", config.GinkgoConfig, config.DefaultReporterConfig) return t.runCompiledSuite(suite, ginkgoArgs, nil, os.Stdout, nil) }
func (t *testRunner) runAndStreamParallelGinkgoSuite(suite *testsuite.TestSuite) bool { result := make(chan bool, 0) stenographer := stenographer.New(!config.DefaultReporterConfig.NoColor) aggregator := aggregator.NewAggregator(t.numCPU, result, config.DefaultReporterConfig, stenographer) server, err := remote.NewServer() if err != nil { panic("Failed to start parallel spec server") } server.RegisterReporters(aggregator) server.Start() defer server.Stop() serverAddress := server.Address() completions := make(chan bool) for cpu := 0; cpu < t.numCPU; cpu++ { config.GinkgoConfig.ParallelNode = cpu + 1 config.GinkgoConfig.ParallelTotal = t.numCPU ginkgoArgs := config.BuildFlagArgs("ginkgo", config.GinkgoConfig, config.DefaultReporterConfig) env := os.Environ() env = append(env, fmt.Sprintf("GINKGO_REMOTE_REPORTING_SERVER=%s", serverAddress)) buffer := new(bytes.Buffer) t.reports = append(t.reports, buffer) go t.runCompiledSuite(suite, ginkgoArgs, env, buffer, completions) } for cpu := 0; cpu < t.numCPU; cpu++ { <-completions } //all test processes are done, at this point //we should be able to wait for the aggregator to tell us that it's done var passed = false select { case passed = <-result: fmt.Println("") //the aggregator is done and can tell us whether or not the suite passed case <-time.After(time.Second): //the aggregator never got back to us! something must have gone wrong fmt.Println("") fmt.Println("") fmt.Println(" ----------------------------------------------------------- ") fmt.Println(" | |") fmt.Println(" | Ginkgo timed out waiting for all parallel nodes to end! |") fmt.Println(" | Here is some salvaged output: |") fmt.Println(" | |") fmt.Println(" ----------------------------------------------------------- ") fmt.Println("") fmt.Println("") os.Stdout.Sync() time.Sleep(time.Second) for _, report := range t.reports { fmt.Print(report.String()) } os.Stdout.Sync() } return passed }