mirror of
https://github.com/golang/go
synced 2024-11-05 21:36:12 -07:00
c17b040389
Fixes golang/go#33950 Change-Id: Iefcb757e773bc052793611c099c25a457fd7e243 Reviewed-on: https://go-review.googlesource.com/c/tools/+/192400 Run-TryBot: Bryan C. Mills <bcmills@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Cottrell <iancottrell@google.com>
104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
// Copyright 2014 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.
|
|
|
|
// No testdata on Android.
|
|
|
|
// +build !android
|
|
// +build go1.11
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"golang.org/x/tools/internal/testenv"
|
|
)
|
|
|
|
func init() {
|
|
// This test currently requires GOPATH mode.
|
|
// Explicitly disabling module mode should suffix, but
|
|
// we'll also turn off GOPROXY just for good measure.
|
|
if err := os.Setenv("GO111MODULE", "off"); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
if err := os.Setenv("GOPROXY", "off"); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestCallgraph(t *testing.T) {
|
|
testenv.NeedsTool(t, "go")
|
|
|
|
gopath, err := filepath.Abs("testdata")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
for _, test := range []struct {
|
|
algo string
|
|
tests bool
|
|
want []string
|
|
}{
|
|
{"rta", false, []string{
|
|
// rta imprecisely shows cross product of {main,main2} x {C,D}
|
|
`pkg.main --> (pkg.C).f`,
|
|
`pkg.main --> (pkg.D).f`,
|
|
`pkg.main --> pkg.main2`,
|
|
`pkg.main2 --> (pkg.C).f`,
|
|
`pkg.main2 --> (pkg.D).f`,
|
|
}},
|
|
{"pta", false, []string{
|
|
// pta distinguishes main->C, main2->D. Also has a root node.
|
|
`<root> --> pkg.init`,
|
|
`<root> --> pkg.main`,
|
|
`pkg.main --> (pkg.C).f`,
|
|
`pkg.main --> pkg.main2`,
|
|
`pkg.main2 --> (pkg.D).f`,
|
|
}},
|
|
// tests: both the package's main and the test's main are called.
|
|
// The callgraph includes all the guts of the "testing" package.
|
|
{"rta", true, []string{
|
|
`pkg.test.main --> testing.MainStart`,
|
|
`testing.runExample --> pkg.Example`,
|
|
`pkg.Example --> (pkg.C).f`,
|
|
`pkg.main --> (pkg.C).f`,
|
|
}},
|
|
{"pta", true, []string{
|
|
`<root> --> pkg.test.main`,
|
|
`<root> --> pkg.main`,
|
|
`pkg.test.main --> testing.MainStart`,
|
|
`testing.runExample --> pkg.Example`,
|
|
`pkg.Example --> (pkg.C).f`,
|
|
`pkg.main --> (pkg.C).f`,
|
|
}},
|
|
} {
|
|
const format = "{{.Caller}} --> {{.Callee}}"
|
|
stdout = new(bytes.Buffer)
|
|
if err := doCallgraph("testdata/src", gopath, test.algo, format, test.tests, []string{"pkg"}); err != nil {
|
|
t.Error(err)
|
|
continue
|
|
}
|
|
|
|
edges := make(map[string]bool)
|
|
for _, line := range strings.Split(fmt.Sprint(stdout), "\n") {
|
|
edges[line] = true
|
|
}
|
|
for _, edge := range test.want {
|
|
if !edges[edge] {
|
|
t.Errorf("callgraph(%q, %t): missing edge: %s",
|
|
test.algo, test.tests, edge)
|
|
}
|
|
}
|
|
if t.Failed() {
|
|
t.Log("got:\n", stdout)
|
|
}
|
|
}
|
|
}
|