blob: 9e785785905ded9822e88bf1d08c1b8cb77ff502 [file] [log] [blame] [edit]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package web_test
import (
"encoding/json"
"runtime"
"testing"
"golang.org/x/tools/gopls/internal/debug"
"golang.org/x/tools/gopls/internal/protocol"
"golang.org/x/tools/gopls/internal/protocol/command"
. "golang.org/x/tools/gopls/internal/test/integration"
)
// TestFlightRecorder checks that the flight recorder is minimally functional.
func TestFlightRecorder(t *testing.T) {
// The usual UNIX mechanisms cause timely termination of the
// cmd/trace process, but this doesn't happen on Windows,
// leading to CI failures because of process->file locking.
// Rather than invent a complex mechanism, skip the test:
// this feature is only for gopls developers anyway.
// Better long term solutions are CL 677262 and issue #66843.
if runtime.GOOS == "windows" {
t.Skip("not reliable on windows")
}
// This is a global hammer; it won't play nicely with
// multiple concurrent tests of Flight Recorder.
t.Cleanup(debug.KillTraceViewers)
const files = `
-- go.mod --
module example.com
-- a/a.go --
package a
const A = 1
`
Run(t, files, func(t *testing.T, env *Env) {
env.OpenFile("a/a.go")
// Start the debug server.
var result command.DebuggingResult
env.ExecuteCommand(&protocol.ExecuteCommandParams{
Command: command.StartDebugging.String(),
Arguments: []json.RawMessage{json.RawMessage("{}")}, // no args -> pick port
}, &result)
uri := result.URLs[0]
t.Logf("StartDebugging: URLs[0] = %s", uri)
// Check the debug server page is sensible.
doc1 := get(t, uri)
checkMatch(t, true, doc1, "Gopls server information")
checkMatch(t, true, doc1, `<a href="/flightrecorder">Flight recorder</a>`)
// "Click" the Flight Recorder link.
// It should redirect to the web server
// of a "go tool trace" process.
// The resulting web page is entirely programmatic,
// so we check for an arbitrary expected symbol.
doc2 := get(t, uri+"/flightrecorder")
checkMatch(t, true, doc2, `onTraceViewerImportFail`)
})
}