...
Source file
src/go/importer/importer_test.go
1
2
3
4
5 package importer
6
7 import (
8 "go/token"
9 "internal/testenv"
10 "io"
11 "os"
12 "os/exec"
13 "runtime"
14 "strings"
15 "testing"
16 )
17
18 func TestForCompiler(t *testing.T) {
19 testenv.MustHaveGoBuild(t)
20
21 const thePackage = "math/big"
22 out, err := exec.Command(testenv.GoToolPath(t), "list", "-f={{context.Compiler}}:{{.Target}}", thePackage).CombinedOutput()
23 if err != nil {
24 t.Fatalf("go list %s: %v\n%s", thePackage, err, out)
25 }
26 target := strings.TrimSpace(string(out))
27 i := strings.Index(target, ":")
28 compiler, target := target[:i], target[i+1:]
29 if !strings.HasSuffix(target, ".a") {
30 t.Fatalf("unexpected package %s target %q (not *.a)", thePackage, target)
31 }
32
33 if compiler == "gccgo" {
34 t.Skip("golang.org/issue/22500")
35 }
36
37 fset := token.NewFileSet()
38
39 t.Run("LookupDefault", func(t *testing.T) {
40 imp := ForCompiler(fset, compiler, nil)
41 pkg, err := imp.Import(thePackage)
42 if err != nil {
43 t.Fatal(err)
44 }
45 if pkg.Path() != thePackage {
46 t.Fatalf("Path() = %q, want %q", pkg.Path(), thePackage)
47 }
48
49
50
51 mathBigInt := pkg.Scope().Lookup("Int")
52 posn := fset.Position(mathBigInt.Pos())
53 filename := strings.Replace(posn.Filename, "$GOROOT", runtime.GOROOT(), 1)
54 data, err := os.ReadFile(filename)
55 if err != nil {
56 t.Fatalf("can't read file containing declaration of math/big.Int: %v", err)
57 }
58 lines := strings.Split(string(data), "\n")
59 if posn.Line > len(lines) || !strings.HasPrefix(lines[posn.Line-1], "type Int") {
60 t.Fatalf("Object %v position %s does not contain its declaration",
61 mathBigInt, posn)
62 }
63 })
64
65 t.Run("LookupCustom", func(t *testing.T) {
66 lookup := func(path string) (io.ReadCloser, error) {
67 if path != "math/bigger" {
68 t.Fatalf("lookup called with unexpected path %q", path)
69 }
70 f, err := os.Open(target)
71 if err != nil {
72 t.Fatal(err)
73 }
74 return f, nil
75 }
76 imp := ForCompiler(fset, compiler, lookup)
77 pkg, err := imp.Import("math/bigger")
78 if err != nil {
79 t.Fatal(err)
80 }
81
82
83 if pkg.Path() != "math/bigger" {
84 t.Fatalf("Path() = %q, want %q", pkg.Path(), "math/bigger")
85 }
86 })
87 }
88
View as plain text