annotate libgo/misc/cgo/testplugin/plugin_test.go @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 // Copyright 2019 The Go Authors. All rights reserved.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 // Use of this source code is governed by a BSD-style
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // license that can be found in the LICENSE file.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 package plugin_test
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 import (
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 "bytes"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 "context"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 "flag"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 "fmt"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 "io/ioutil"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 "log"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 "os"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 "os/exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 "path/filepath"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 "strings"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 "testing"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 "time"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 var gcflags string = os.Getenv("GO_GCFLAGS")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 func TestMain(m *testing.M) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 flag.Parse()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 os.Exit(0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 log.SetFlags(log.Lshortfile)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 os.Exit(testMain(m))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 func testMain(m *testing.M) int {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 // Copy testdata into GOPATH/src/testarchive, along with a go.mod file
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 // declaring the same path.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 GOPATH, err := ioutil.TempDir("", "plugin_test")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 defer os.RemoveAll(GOPATH)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 modRoot := filepath.Join(GOPATH, "src", "testplugin")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 altRoot := filepath.Join(GOPATH, "alt", "src", "testplugin")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 for srcRoot, dstRoot := range map[string]string{
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 "testdata": modRoot,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 filepath.Join("altpath", "testdata"): altRoot,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 } {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 if err := overlayDir(dstRoot, srcRoot); err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 if err := ioutil.WriteFile(filepath.Join(dstRoot, "go.mod"), []byte("module testplugin\n"), 0666); err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 os.Setenv("GOPATH", filepath.Join(GOPATH, "alt"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 if err := os.Chdir(altRoot); err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 os.Setenv("PWD", altRoot)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 goCmd(nil, "build", "-buildmode=plugin", "-o", filepath.Join(modRoot, "plugin-mismatch.so"), "./plugin-mismatch")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 os.Setenv("GOPATH", GOPATH)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 if err := os.Chdir(modRoot); err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 os.Setenv("PWD", modRoot)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 os.Setenv("LD_LIBRARY_PATH", modRoot)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 goCmd(nil, "build", "-buildmode=plugin", "./plugin1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 goCmd(nil, "build", "-buildmode=plugin", "./plugin2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 so, err := ioutil.ReadFile("plugin2.so")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 if err := ioutil.WriteFile("plugin2-dup.so", so, 0444); err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 log.Panic(err)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 goCmd(nil, "build", "-buildmode=plugin", "-o=sub/plugin1.so", "./sub/plugin1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed1.so", "./unnamed1/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed2.so", "./unnamed2/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 goCmd(nil, "build", "-o", "host.exe", "./host")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 return m.Run()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 func goCmd(t *testing.T, op string, args ...string) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 if t != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 t.Helper()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 run(t, "go", append([]string{op, "-gcflags", gcflags}, args...)...)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 func run(t *testing.T, bin string, args ...string) string {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 cmd := exec.Command(bin, args...)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 cmd.Stderr = new(strings.Builder)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 out, err := cmd.Output()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 if t == nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 log.Panicf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 } else {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 t.Helper()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 return string(bytes.TrimSpace(out))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 func TestDWARFSections(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 // test that DWARF sections are emitted for plugins and programs importing "plugin"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 goCmd(t, "run", "./checkdwarf/main.go", "plugin2.so", "plugin2.UnexportedNameReuse")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 goCmd(t, "run", "./checkdwarf/main.go", "./host.exe", "main.main")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 func TestRunHost(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 run(t, "./host.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 func TestUniqueTypesAndItabs(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 goCmd(t, "build", "-buildmode=plugin", "./iface_a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 goCmd(t, "build", "-buildmode=plugin", "./iface_b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 goCmd(t, "build", "-o", "iface.exe", "./iface")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 run(t, "./iface.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 func TestIssue18676(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 // make sure we don't add the same itab twice.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 // The buggy code hangs forever, so use a timeout to check for that.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18676/plugin.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 goCmd(t, "build", "-o", "issue18676.exe", "./issue18676/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 defer cancel()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 cmd := exec.CommandContext(ctx, "./issue18676.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 out, err := cmd.CombinedOutput()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 if err != nil {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 func TestIssue19534(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 // Test that we can load a plugin built in a path with non-alpha characters.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 goCmd(t, "build", "-buildmode=plugin", "-ldflags='-pluginpath=issue.19534'", "-o", "plugin.so", "./issue19534/plugin.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 goCmd(t, "build", "-o", "issue19534.exe", "./issue19534/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 run(t, "./issue19534.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 func TestIssue18584(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18584/plugin.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 goCmd(t, "build", "-o", "issue18584.exe", "./issue18584/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 run(t, "./issue18584.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 func TestIssue19418(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 goCmd(t, "build", "-buildmode=plugin", "-ldflags=-X main.Val=linkstr", "-o", "plugin.so", "./issue19418/plugin.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 goCmd(t, "build", "-o", "issue19418.exe", "./issue19418/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 run(t, "./issue19418.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 func TestIssue19529(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue19529/plugin.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 func TestIssue22175(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin1.so", "./issue22175/plugin1.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin2.so", "./issue22175/plugin2.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 goCmd(t, "build", "-o", "issue22175.exe", "./issue22175/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 run(t, "./issue22175.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 func TestIssue22295(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 goCmd(t, "build", "-buildmode=plugin", "-o", "issue.22295.so", "./issue22295.pkg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 goCmd(t, "build", "-o", "issue22295.exe", "./issue22295.pkg/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 run(t, "./issue22295.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 func TestIssue24351(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 goCmd(t, "build", "-buildmode=plugin", "-o", "issue24351.so", "./issue24351/plugin.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 goCmd(t, "build", "-o", "issue24351.exe", "./issue24351/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 run(t, "./issue24351.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 func TestIssue25756(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 goCmd(t, "build", "-buildmode=plugin", "-o", "life.so", "./issue25756/plugin")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 goCmd(t, "build", "-o", "issue25756.exe", "./issue25756/main.go")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 // Fails intermittently, but 20 runs should cause the failure
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 for n := 20; n > 0; n-- {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 t.Run(fmt.Sprint(n), func(t *testing.T) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 t.Parallel()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 run(t, "./issue25756.exe")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 }