From 49d818b07734fb3230f2d00bc5d4453348348d24 Mon Sep 17 00:00:00 2001 From: Rhys Hiltner Date: Fri, 15 Feb 2019 10:30:09 -0800 Subject: [PATCH] [release-branch.go1.12] cmd/godoc: fix -url flag, add tests This change adds a small number of integration tests for the godoc command's -url flag, confirming that the behavior matches the local http server tests in those cases. It fixes three bugs which prevent the -url flag from working currently. Fixes golang/go#30314 Change-Id: I0ca1fe81f9f186d0ca02b31674cc8654af434e92 Reviewed-on: https://go-review.googlesource.com/c/162907 Reviewed-by: Dmitri Shuralyov (cherry picked from commit bb2d4193192d16d7b4f740befc0ddd495bf6f86b) Reviewed-on: https://go-review.googlesource.com/c/162985 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick --- cmd/godoc/godoc_test.go | 42 ++++++++++++++++++++++++++++++++++++++++- cmd/godoc/main.go | 8 ++++---- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/cmd/godoc/godoc_test.go b/cmd/godoc/godoc_test.go index 54fe540d..28e1bae8 100644 --- a/cmd/godoc/godoc_test.go +++ b/cmd/godoc/godoc_test.go @@ -134,6 +134,46 @@ func killAndWait(cmd *exec.Cmd) { cmd.Wait() } +func TestURL(t *testing.T) { + if runtime.GOOS == "plan9" { + t.Skip("skipping on plan9; fails to start up quickly enough") + } + bin, cleanup := buildGodoc(t) + defer cleanup() + + testcase := func(url string, contents string) func(t *testing.T) { + return func(t *testing.T) { + stdout, stderr := new(bytes.Buffer), new(bytes.Buffer) + + args := []string{fmt.Sprintf("-url=%s", url)} + cmd := exec.Command(bin, args...) + cmd.Stdout = stdout + cmd.Stderr = stderr + cmd.Args[0] = "godoc" + + // Set GOPATH variable to non-existing path + // and GOPROXY=off to disable module fetches. + // We cannot just unset GOPATH variable because godoc would default it to ~/go. + // (We don't want the indexer looking at the local workspace during tests.) + cmd.Env = append(os.Environ(), + "GOPATH=does_not_exist", + "GOPROXY=off", + "GO111MODULE=off") + + if err := cmd.Run(); err != nil { + t.Fatalf("failed to run godoc -url=%q: %s\nstderr:\n%s", url, err, stderr) + } + + if !strings.Contains(stdout.String(), contents) { + t.Errorf("did not find substring %q in output of godoc -url=%q:\n%s", contents, url, stdout) + } + } + } + + t.Run("index", testcase("/", "Go is an open source programming language")) + t.Run("fmt", testcase("/pkg/fmt", "Package fmt implements formatted I/O")) +} + // Basic integration test for godoc HTTP interface. func TestWeb(t *testing.T) { testWeb(t, false) @@ -150,7 +190,7 @@ func TestWebIndex(t *testing.T) { // Basic integration test for godoc HTTP interface. func testWeb(t *testing.T, withIndex bool) { if runtime.GOOS == "plan9" { - t.Skip("skipping on plan9; files to start up quickly enough") + t.Skip("skipping on plan9; fails to start up quickly enough") } bin, cleanup := buildGodoc(t) defer cleanup() diff --git a/cmd/godoc/main.go b/cmd/godoc/main.go index c27ede76..ac4509ad 100644 --- a/cmd/godoc/main.go +++ b/cmd/godoc/main.go @@ -94,7 +94,7 @@ type httpResponseRecorder struct { } func (w *httpResponseRecorder) Header() http.Header { return w.header } -func (w *httpResponseRecorder) Write(b []byte) (int, error) { return len(b), nil } +func (w *httpResponseRecorder) Write(b []byte) (int, error) { return w.body.Write(b) } func (w *httpResponseRecorder) WriteHeader(code int) { w.code = code } func usage() { @@ -168,8 +168,8 @@ func main() { fmt.Fprintln(os.Stderr, `Unexpected arguments. Use "go doc" for command-line help output instead. For example, "go doc fmt.Printf".`) usage() } - if *httpAddr != "" && *urlFlag != "" && !*writeIndex { - fmt.Fprintln(os.Stderr, "Missing args.") + if *httpAddr == "" && *urlFlag == "" && !*writeIndex { + fmt.Fprintln(os.Stderr, "At least one of -http, -url, or -write_index must be set to a non-zero value.") usage() } @@ -228,7 +228,7 @@ func main() { corpus.IndexDirectory = indexDirectoryDefault corpus.IndexThrottle = *indexThrottle corpus.IndexInterval = *indexInterval - if *writeIndex { + if *writeIndex || *urlFlag != "" { corpus.IndexThrottle = 1.0 corpus.IndexEnabled = true initCorpus(corpus)