From 9fe4b33bfff54149e601fa55d11b5e3ae7d786d7 Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Thu, 24 Aug 2023 10:18:12 -0600 Subject: [PATCH] Fix flaky TestResizeTerminal This test starts a session and then immediately tries to join it. Sometimes we're too fast, and the session tracker doesn't yet exist so the join fails. Fix by waiting for the session tracker to show up before attempting the join. Closes #13607 --- lib/backend/buffer.go | 4 ++-- lib/web/apiserver_test.go | 24 +++++++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/backend/buffer.go b/lib/backend/buffer.go index 3e89990f92e70..bee29dc2bc0c3 100644 --- a/lib/backend/buffer.go +++ b/lib/backend/buffer.go @@ -277,10 +277,10 @@ func (c *CircularBuffer) removeWatcherWithLock(watcher *BufferWatcher) { c.Warningf("Internal logic error: %v.", trace.DebugReport(trace.BadParameter("empty watcher"))) return } - c.Debugf("Removing watcher %p via external close.", watcher) + c.Debugf("Removing watcher %v (%p) via external close.", watcher.Name, watcher) found := c.watchers.rm(watcher) if !found { - c.Debugf("Could not find watcher %v.", watcher) + c.Debugf("Could not find watcher %v.", watcher.Name) } } diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index 1f8be78446056..c3aeb438c2515 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -59,6 +59,7 @@ import ( lemma_secret "github.com/mailgun/lemma/secret" "github.com/mailgun/timetools" "github.com/pquerna/otp/totp" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" commonv1 "go.opentelemetry.io/proto/otlp/common/v1" resourcev1 "go.opentelemetry.io/proto/otlp/resource/v1" @@ -1407,7 +1408,13 @@ func TestResizeTerminal(t *testing.T) { require.NoError(t, err) t.Cleanup(func() { require.NoError(t, ws1.Close()) }) - // Create a new user "bar", open a terminal to the session created above + // Wait for session to have started + require.Eventually(t, func() bool { + _, err := s.server.Auth().GetSessionTracker(context.Background(), sess.ID.String()) + return err == nil + }, 3*time.Second, 200*time.Millisecond, "session not available") + + // Create a new user "bar" and join the session created above pack2 := s.authPack(t, "bar") ws2, sess2, err := s.makeTerminal(t, pack2, withSessionID(sess.ID), withParticipantMode(types.SessionPeerMode)) require.NoError(t, err) @@ -1453,7 +1460,7 @@ t1ready: select { case e := <-ws2Messages: if isResizeEventEnvelope(e) { - require.FailNow(t, "terminal 2 should not have received a resize event") + require.FailNow(t, "terminal 2 should not have received a resize event: %v", e) } case err := <-errs: require.NoError(t, err) @@ -1693,9 +1700,9 @@ func TestTerminalNameResolution(t *testing.T) { t.Cleanup(cancel) // Wait for the node to be registered as the registration is asynchronous. - require.Eventuallyf(t, func() bool { + require.Eventually(t, func() bool { nodes, err := s.proxyClient.GetNodes(ctx, "default") - require.NoError(t, err) + assert.NoError(t, err) return len(nodes) == 2 // one created by default and llama }, 5*time.Second, 200*time.Millisecond, "failed to register node") @@ -6385,7 +6392,14 @@ func (s *WebSuite) makeTerminal(t *testing.T, pack *authPack, opts ...terminalOp ws, resp, err := dialer.Dial(u.String(), header) if err != nil { - return nil, nil, trace.Wrap(err) + var sb strings.Builder + sb.WriteString("websocket dial") + if resp != nil { + fmt.Fprintf(&sb, "; status code %v;", resp.StatusCode) + fmt.Fprintf(&sb, "headers: %v; body: ", resp.Header) + io.Copy(&sb, resp.Body) + } + return nil, nil, trace.Wrap(err, sb.String()) } ty, raw, err := ws.ReadMessage()