diff --git a/cmd/gogio/e2e_test.go b/cmd/gogio/e2e_test.go index d16d90fe..63a8f59b 100644 --- a/cmd/gogio/e2e_test.go +++ b/cmd/gogio/e2e_test.go @@ -7,6 +7,7 @@ import ( "image" "image/color" "testing" + "time" ) var raceEnabled = false @@ -148,3 +149,20 @@ func wantColor(t *testing.T, img image.Image, x, y int, want color.Color) { r_, g_, b_, x, y, r, g, b) } } + +func waitForFrame(t *testing.T, frameNotifs <-chan bool) { + // Unfortunately, there isn't a way to select on a test failing, since + // testing.T doesn't have anything like a context or a "done" channel. + // + // We can't let selects block forever, since the default -test.timeout + // is ten minutes - far too long for tests that take seconds. + // + // For now, a static short timeout is better than nothing. 2s is plenty + // for our simple test app to render on any device. + + select { + case <-frameNotifs: + case <-time.After(2 * time.Second): + t.Fatalf("timed out waiting for a frame to be ready") + } +} diff --git a/cmd/gogio/js_test.go b/cmd/gogio/js_test.go index 0929aa03..3b7df634 100644 --- a/cmd/gogio/js_test.go +++ b/cmd/gogio/js_test.go @@ -129,7 +129,7 @@ func (d *JSTestDriver) Start(t_ *testing.T, path string, width, height int) { } // Wait for the gio app to render. - <-d.frameNotifs + waitForFrame(d.t, d.frameNotifs) } func (d *JSTestDriver) Screenshot() image.Image { @@ -154,5 +154,5 @@ func (d *JSTestDriver) Click(x, y int) { } // Wait for the gio app to render after this click. - <-d.frameNotifs + waitForFrame(d.t, d.frameNotifs) } diff --git a/cmd/gogio/wayland_test.go b/cmd/gogio/wayland_test.go index c3f06723..a57f8a88 100644 --- a/cmd/gogio/wayland_test.go +++ b/cmd/gogio/wayland_test.go @@ -185,7 +185,7 @@ func (d *WaylandTestDriver) Start(t_ *testing.T, path string, width, height int) } // Wait for the gio app to render. - <-d.frameNotifs + waitForFrame(d.t, d.frameNotifs) } func (d *WaylandTestDriver) Screenshot() image.Image { @@ -204,9 +204,7 @@ func (d *WaylandTestDriver) Screenshot() image.Image { } func (d *WaylandTestDriver) swaymsg(args ...interface{}) { - strs := []string{ - "--socket", d.socket, - } + strs := []string{"--socket", d.socket} for _, arg := range args { strs = append(strs, fmt.Sprint(arg)) } @@ -218,11 +216,10 @@ func (d *WaylandTestDriver) swaymsg(args ...interface{}) { } func (d *WaylandTestDriver) Click(x, y int) { - d.swaymsg("-t", "get_seats") d.swaymsg("seat", "-", "cursor", "set", x, y) d.swaymsg("seat", "-", "cursor", "press", "button1") d.swaymsg("seat", "-", "cursor", "release", "button1") // Wait for the gio app to render after this click. - <-d.frameNotifs + waitForFrame(d.t, d.frameNotifs) } diff --git a/cmd/gogio/x11_test.go b/cmd/gogio/x11_test.go index f642b295..e23e6557 100644 --- a/cmd/gogio/x11_test.go +++ b/cmd/gogio/x11_test.go @@ -164,7 +164,7 @@ func (d *X11TestDriver) Start(t_ *testing.T, path string, width, height int) { } // Wait for the gio app to render. - <-d.frameNotifs + waitForFrame(d.t, d.frameNotifs) } func (d *X11TestDriver) Screenshot() image.Image { @@ -200,5 +200,5 @@ func (d *X11TestDriver) Click(x, y int) { d.xdotool("click", "1") // Wait for the gio app to render after this click. - <-d.frameNotifs + waitForFrame(d.t, d.frameNotifs) }