1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
package integration_test
import (
"fmt"
"os"
"path/filepath"
"regexp"
"strconv"
"syscall"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/onsi/gomega/gbytes"
"github.com/onsi/gomega/gexec"
)
var _ = Describe("Emitting progress", func() {
Describe("progress reports", func() {
BeforeEach(func() {
fm.MountFixture("progress_report")
})
It("emits progress when a singal is sent and when tests take too long", func() {
session := startGinkgo(fm.PathTo("progress_report"), "--poll-progress-after=1500ms", "--poll-progress-interval=200ms", "--no-color")
Eventually(session).Should(gbytes.Say(`READY `))
buf := make([]byte, 128)
_, err := session.Out.Read(buf)
Ω(err).ShouldNot(HaveOccurred())
pid, err := strconv.Atoi(regexp.MustCompile(`\d*`).FindString(string(buf)))
Ω(err).ShouldNot(HaveOccurred())
syscall.Kill(pid, syscall.SIGUSR1)
Eventually(session).Should(gbytes.Say(`can track on demand \(Spec Runtime:`))
Eventually(session).Should(gbytes.Say(`In \[It\] \(Node Runtime:`))
Eventually(session).Should(gbytes.Say(`\[By Step\] Step B \(Step Runtime:`))
Eventually(session).Should(gbytes.Say(`Begin Captured GinkgoWriter Output`))
Eventually(session).Should(gbytes.Say(`\.\.\.`))
for i := 3; i <= 12; i++ {
Eventually(session).Should(gbytes.Say(fmt.Sprintf("ginkgo-writer-output-%d", i)))
}
Eventually(session).Should(gbytes.Say(`|\s*fmt\.Println\("READY"\)`))
Eventually(session).Should(gbytes.Say(`>\s*time\.Sleep\(time\.Second\)`))
//first poll
Eventually(session).Should(gbytes.Say(`--poll-progress-after tracks things that take too long \(Spec Runtime: 1\.5\d*s\)`))
Eventually(session).Should(gbytes.Say(`>\s*time.Sleep\(2 \* time\.Second\)`))
Eventually(session).Should(gbytes.Say(`Begin Additional Progress Reports >>`))
Eventually(session).Should(gbytes.Say(`Some global information: 1`))
Eventually(session).Should(gbytes.Say(`<< End Additional Progress Reports`))
//second poll
Eventually(session).Should(gbytes.Say(`--poll-progress-after tracks things that take too long \(Spec Runtime: 1\.7\d*s\)`))
Eventually(session).Should(gbytes.Say(`>\s*time.Sleep\(2 \* time\.Second\)`))
//decorator poll
Eventually(session).Should(gbytes.Say(`decorator tracks things that take too long \(Spec Runtime: 5[\.\d]*ms\)`))
Eventually(session).Should(gbytes.Say(`>\s*time\.Sleep\(1 \* time\.Second\)`))
Eventually(session).Should(gexec.Exit(0))
})
It("allows the user to specify a source-root to find source code files", func() {
// first we build the test with -gcflags=all=-trimpath=<PATH TO SPEC> to ensure
// that stack traces do not contain absolute paths
path, err := filepath.Abs(fm.PathTo("progress_report"))
Ω(err).ShouldNot(HaveOccurred())
session := startGinkgo(fm.PathTo("progress_report"), "build", `-gcflags=-trimpath=`+path+``)
Eventually(session).Should(gexec.Exit(0))
// now we move the compiled test binary to a separate directory
fm.MkEmpty("progress_report/suite")
os.Rename(fm.PathTo("progress_report", "progress_report.test"), fm.PathTo("progress_report", "suite", "progress_report.test"))
//and we run and confirm that we don't see the expected source code
session = startGinkgo(fm.PathTo("progress_report", "suite"), "--poll-progress-after=1500ms", "--poll-progress-interval=200ms", "--no-color", "-label-filter=one-second", "./progress_report.test")
Eventually(session).Should(gexec.Exit(0))
Ω(session).ShouldNot(gbytes.Say(`>\s*time.Sleep\(1 \* time\.Second\)`))
// now we run, but configured with source-root and see that we have the file
// note that multipel source-roots can be passed in
session = startGinkgo(fm.PathTo("progress_report", "suite"), "--poll-progress-after=1500ms", "--poll-progress-interval=200ms", "--no-color", "-label-filter=one-second", "--source-root=/tmp", "--source-root="+path, "./progress_report.test")
Eventually(session).Should(gbytes.Say(`>\s*time\.Sleep\(1 \* time\.Second\)`))
Eventually(session).Should(gexec.Exit(0))
})
It("emits progress immediately and includes process information when running in parallel", func() {
session := startGinkgo(fm.PathTo("progress_report"), "--poll-progress-after=1500ms", "--poll-progress-interval=200ms", "--no-color", "-procs=2", "-label-filter=parallel")
Eventually(session).Should(gexec.Exit(0))
Eventually(session.Out.Contents()).Should(ContainSubstring(`Progress Report for Ginkgo Process #1`))
Eventually(session.Out.Contents()).Should(ContainSubstring(`Progress Report for Ginkgo Process #2`))
Eventually(session.Out.Contents()).Should(ContainSubstring(`Some global information: 1`))
Eventually(session.Out.Contents()).Should(ContainSubstring(`Some global information: 2`))
})
})
})
|