github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/tools/go/gccgoimporter/importer_test.go (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package gccgoimporter 6 7 import ( 8 "io/ioutil" 9 "os" 10 "os/exec" 11 "path/filepath" 12 "runtime" 13 "testing" 14 15 "golang.org/x/tools/go/types" 16 ) 17 18 type importerTest struct { 19 pkgpath, name, want, wantval string 20 wantinits []string 21 } 22 23 func runImporterTest(t *testing.T, imp types.Importer, initmap map[*types.Package]InitData, test *importerTest) { 24 pkg, err := imp(make(map[string]*types.Package), test.pkgpath) 25 if err != nil { 26 t.Error(err) 27 return 28 } 29 30 if test.name != "" { 31 obj := pkg.Scope().Lookup(test.name) 32 if obj == nil { 33 t.Errorf("%s: object not found", test.name) 34 return 35 } 36 37 got := types.ObjectString(obj, types.RelativeTo(pkg)) 38 if got != test.want { 39 t.Errorf("%s: got %q; want %q", test.name, got, test.want) 40 } 41 42 if test.wantval != "" { 43 gotval := obj.(*types.Const).Val().String() 44 if gotval != test.wantval { 45 t.Errorf("%s: got val %q; want val %q", test.name, gotval, test.wantval) 46 } 47 } 48 } 49 50 if len(test.wantinits) > 0 { 51 initdata := initmap[pkg] 52 found := false 53 // Check that the package's own init function has the package's priority 54 for _, pkginit := range initdata.Inits { 55 if pkginit.InitFunc == test.wantinits[0] { 56 if initdata.Priority != pkginit.Priority { 57 t.Errorf("%s: got self priority %d; want %d", test.pkgpath, pkginit.Priority, initdata.Priority) 58 } 59 found = true 60 break 61 } 62 } 63 64 if !found { 65 t.Errorf("%s: could not find expected function %q", test.pkgpath, test.wantinits[0]) 66 } 67 68 // Each init function in the list other than the first one is a 69 // dependency of the function immediately before it. Check that 70 // the init functions appear in descending priority order. 71 priority := initdata.Priority 72 for _, wantdepinit := range test.wantinits[1:] { 73 found = false 74 for _, pkginit := range initdata.Inits { 75 if pkginit.InitFunc == wantdepinit { 76 if priority <= pkginit.Priority { 77 t.Errorf("%s: got dep priority %d; want less than %d", test.pkgpath, pkginit.Priority, priority) 78 } 79 found = true 80 priority = pkginit.Priority 81 break 82 } 83 } 84 85 if !found { 86 t.Errorf("%s: could not find expected function %q", test.pkgpath, wantdepinit) 87 } 88 } 89 } 90 } 91 92 var importerTests = [...]importerTest{ 93 {pkgpath: "pointer", name: "Int8Ptr", want: "type Int8Ptr *int8"}, 94 {pkgpath: "complexnums", name: "NN", want: "const NN untyped complex", wantval: "(-1/1 + -1/1i)"}, 95 {pkgpath: "complexnums", name: "NP", want: "const NP untyped complex", wantval: "(-1/1 + 1/1i)"}, 96 {pkgpath: "complexnums", name: "PN", want: "const PN untyped complex", wantval: "(1/1 + -1/1i)"}, 97 {pkgpath: "complexnums", name: "PP", want: "const PP untyped complex", wantval: "(1/1 + 1/1i)"}, 98 // TODO: enable this entry once bug has been tracked down 99 //{pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import", "math..import"}}, 100 } 101 102 func TestGoxImporter(t *testing.T) { 103 if runtime.GOOS == "android" { 104 t.Skipf("no testdata directory on %s", runtime.GOOS) 105 } 106 initmap := make(map[*types.Package]InitData) 107 imp := GetImporter([]string{"testdata"}, initmap) 108 109 for _, test := range importerTests { 110 runImporterTest(t, imp, initmap, &test) 111 } 112 } 113 114 func TestObjImporter(t *testing.T) { 115 // This test relies on gccgo being around, which it most likely will be if we 116 // were compiled with gccgo. 117 if runtime.Compiler != "gccgo" { 118 t.Skip("This test needs gccgo") 119 return 120 } 121 122 tmpdir, err := ioutil.TempDir("", "") 123 if err != nil { 124 t.Fatal(err) 125 } 126 initmap := make(map[*types.Package]InitData) 127 imp := GetImporter([]string{tmpdir}, initmap) 128 129 artmpdir, err := ioutil.TempDir("", "") 130 if err != nil { 131 t.Fatal(err) 132 } 133 arinitmap := make(map[*types.Package]InitData) 134 arimp := GetImporter([]string{artmpdir}, arinitmap) 135 136 for _, test := range importerTests { 137 gofile := filepath.Join("testdata", test.pkgpath+".go") 138 ofile := filepath.Join(tmpdir, test.pkgpath+".o") 139 afile := filepath.Join(artmpdir, "lib"+test.pkgpath+".a") 140 141 cmd := exec.Command("gccgo", "-fgo-pkgpath="+test.pkgpath, "-c", "-o", ofile, gofile) 142 out, err := cmd.CombinedOutput() 143 if err != nil { 144 t.Logf("%s", out) 145 t.Fatalf("gccgo %s failed: %s", gofile, err) 146 } 147 148 runImporterTest(t, imp, initmap, &test) 149 150 cmd = exec.Command("ar", "cr", afile, ofile) 151 out, err = cmd.CombinedOutput() 152 if err != nil { 153 t.Logf("%s", out) 154 t.Fatalf("ar cr %s %s failed: %s", afile, ofile, err) 155 } 156 157 runImporterTest(t, arimp, arinitmap, &test) 158 159 if err = os.Remove(ofile); err != nil { 160 t.Fatal(err) 161 } 162 if err = os.Remove(afile); err != nil { 163 t.Fatal(err) 164 } 165 } 166 167 if err = os.Remove(tmpdir); err != nil { 168 t.Fatal(err) 169 } 170 }