1#!/usr/bin/env bash
2# Copyright 2016 The Go Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style
4# license that can be found in the LICENSE file.
5
6set -e
7
8if [ ! -f src/host/host.go ]; then
9	cwd=$(pwd)
10	echo "misc/cgo/testplugin/test.bash is running in $cwd" 1>&2
11	exit 1
12fi
13
14goos=$(go env GOOS)
15goarch=$(go env GOARCH)
16
17function cleanup() {
18	rm -f plugin*.so unnamed*.so iface*.so issue*
19	rm -rf host pkg sub iface
20}
21trap cleanup EXIT
22
23rm -rf pkg sub
24mkdir sub
25
26GOPATH=$(pwd) go build -i -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin1
27GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin2
28cp plugin2.so plugin2-dup.so
29GOPATH=$(pwd)/altpath go build -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin-mismatch
30GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=sub/plugin1.so sub/plugin1
31GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=unnamed1.so unnamed1/main.go
32GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=unnamed2.so unnamed2/main.go
33GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" host
34
35LD_LIBRARY_PATH=$(pwd) ./host
36
37# Test that types and itabs get properly uniqified.
38GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin iface_a
39GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin iface_b
40GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" iface
41LD_LIBRARY_PATH=$(pwd) ./iface
42
43function _timeout() (
44	set -e
45	$2 &
46	p=$!
47	(sleep $1; kill $p 2>/dev/null) &
48	p2=$!
49	wait $p 2>/dev/null
50	kill -0 $p2 2>/dev/null
51)
52
53# Test for issue 18676 - make sure we don't add the same itab twice.
54# The buggy code hangs forever, so use a timeout to check for that.
55GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue18676/plugin.go
56GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue18676 src/issue18676/main.go
57_timeout 10s ./issue18676
58
59# Test for issue 19534 - that we can load a plugin built in a path with non-alpha
60# characters
61GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -ldflags='-pluginpath=issue.19534' -o plugin.so src/issue19534/plugin.go
62GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue19534 src/issue19534/main.go
63./issue19534
64
65# Test for issue 18584
66GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue18584/plugin.go
67GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue18584 src/issue18584/main.go
68./issue18584
69
70# Test for issue 19418
71GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin "-ldflags=-X main.Val=linkstr" -o plugin.so src/issue19418/plugin.go
72GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue19418 src/issue19418/main.go
73./issue19418
74
75# Test for issue 19529
76GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue19529/plugin.go
77
78# Test for issue 22175
79GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue22175_plugin1.so src/issue22175/plugin1.go
80GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue22175_plugin2.so src/issue22175/plugin2.go
81GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue22175 src/issue22175/main.go
82./issue22175
83
84# Test for issue 22295
85GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue.22295.so issue22295.pkg
86GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue22295 src/issue22295.pkg/main.go
87./issue22295
88
89# Test for issue 24351
90GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue24351.so src/issue24351/plugin.go
91GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue24351 src/issue24351/main.go
92./issue24351
93