gopls/internal/cmd: set timeout for mcp server start

Change-Id: Ic1852d20f8fa58fbac2d957c1022f2bbfd9ef9de
Reviewed-on: https://go-review.googlesource.com/c/tools/+/802760
Reviewed-by: Madeline Kalil <mkalil@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
diff --git a/gopls/internal/cmd/mcp_test.go b/gopls/internal/cmd/mcp_test.go
index 2b1c63c..bfb9c86 100644
--- a/gopls/internal/cmd/mcp_test.go
+++ b/gopls/internal/cmd/mcp_test.go
@@ -235,8 +235,9 @@
 	// Wait for the MCP server to start listening. The referenced log occurs
 	// after the connection is opened via net.Listen and the HTTP handlers are
 	// set up.
-	ready := make(chan bool)
+	ready := make(chan bool, 1)
 	go func() {
+		defer close(ready)
 		// Copy from the pipe to stderr, keeping an eye out for the "mcp http
 		// server listening" string.
 		scan := bufio.NewScanner(stderr)
@@ -252,7 +253,15 @@
 		}
 	}()
 
-	<-ready
+	select {
+	case ok := <-ready:
+		if !ok {
+			t.Fatalf("gopls mcp server exited without starting")
+		}
+	case <-time.After(60 * time.Second):
+		t.Fatalf("timed out waiting for gopls mcp server to start")
+	}
+
 	client := mcp.NewClient(&mcp.Implementation{Name: "client", Version: "v0.0.1"}, nil)
 	ctx := t.Context()
 	mcpSession, err := client.Connect(ctx, &mcp.SSEClientTransport{Endpoint: "http://" + addr}, nil)