mirror of
https://github.com/golang/go
synced 2024-11-05 11:56:12 -07:00
d02228d185
For golang/go#11811. Change-Id: I4cec398a0a6d43f3297c205f73193522928a5b31 Reviewed-on: https://go-review.googlesource.com/13280 Reviewed-by: Rob Pike <r@golang.org> Reviewed-by: David Crawshaw <crawshaw@golang.org>
82 lines
1.9 KiB
Go
82 lines
1.9 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
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"go/build"
|
|
"reflect"
|
|
"sort"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestCallgraph(t *testing.T) {
|
|
ctxt := build.Default // copy
|
|
ctxt.GOPATH = "testdata"
|
|
|
|
const format = "{{.Caller}} --> {{.Callee}}"
|
|
|
|
for _, test := range []struct {
|
|
algo, format string
|
|
tests bool
|
|
want []string
|
|
}{
|
|
{"rta", format, 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", format, 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: main is not called.
|
|
{"rta", format, true, []string{
|
|
`pkg.Example --> (pkg.C).f`,
|
|
`test$main.init --> pkg.init`,
|
|
}},
|
|
{"pta", format, true, []string{
|
|
`<root> --> pkg.Example`,
|
|
`<root> --> test$main.init`,
|
|
`pkg.Example --> (pkg.C).f`,
|
|
`test$main.init --> pkg.init`,
|
|
}},
|
|
} {
|
|
stdout = new(bytes.Buffer)
|
|
if err := doCallgraph(&ctxt, test.algo, test.format, test.tests, []string{"pkg"}); err != nil {
|
|
t.Error(err)
|
|
continue
|
|
}
|
|
|
|
got := sortedLines(fmt.Sprint(stdout))
|
|
if !reflect.DeepEqual(got, test.want) {
|
|
t.Errorf("callgraph(%q, %q, %t):\ngot:\n%s\nwant:\n%s",
|
|
test.algo, test.format, test.tests,
|
|
strings.Join(got, "\n"),
|
|
strings.Join(test.want, "\n"))
|
|
}
|
|
}
|
|
}
|
|
|
|
func sortedLines(s string) []string {
|
|
s = strings.TrimSpace(s)
|
|
lines := strings.Split(s, "\n")
|
|
sort.Strings(lines)
|
|
return lines
|
|
}
|