14f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen#!/usr/bin/env bash
24f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# Copyright 2015 The Go Authors. All rights reserved.
34f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# Use of this source code is governed by a BSD-style
44f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# license that can be found in the LICENSE file.
54f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
64f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# For testing Android, this script requires adb to push and run compiled
74f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# binaries on a target device.
84f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
94f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenset -e
104f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
114f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ ! -f src/libgo/libgo.go ]; then
124f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	cwd=$(pwd)
134f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo "misc/cgo/testcshared/test.bash is running in $cwd" 1>&2
144f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	exit 1
154f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
164f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
174f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsengoos=$(go env GOOS)
184f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsengoarch=$(go env GOARCH)
194f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsengoroot=$(go env GOROOT)
204f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ ! -d "$goroot" ]; then
214f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo 'misc/cgo/testcshared/test.bash cannot find GOROOT' 1>&2
224f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo '$GOROOT:' "$GOROOT" 1>&2
234f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo 'go env GOROOT:' "$goroot" 1>&2
244f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	exit 1
254f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
264f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
274f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# Directory where cgo headers and outputs will be installed.
284f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# The installation directory format varies depending on the platform.
294f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemseninstalldir=pkg/${goos}_${goarch}_testcshared_shared
304f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "${goos}" == "darwin" ]; then
314f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	installdir=pkg/${goos}_${goarch}_testcshared
324f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
334f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
344f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# Temporary directory on the android device.
354f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenandroidpath=/data/local/tmp/testcshared-$$
364f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
374f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfunction cleanup() {
384f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	rm -f libgo.$libext libgo2.$libext libgo4.$libext libgo5.$libext
394f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	rm -f libgo.h libgo4.h libgo5.h
404f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	rm -f testp testp2 testp3 testp4 testp5
414f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	rm -rf pkg "${goroot}/${installdir}"
424f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
434f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	if [ "$goos" == "android" ]; then
444f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		adb shell rm -rf "$androidpath"
454f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	fi
464f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen}
474f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsentrap cleanup EXIT
484f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
494f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$goos" == "android" ]; then
504f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	adb shell mkdir -p "$androidpath"
514f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
524f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
534f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfunction run() {
544f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	case "$goos" in
554f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	"android")
564f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		local args=$@
574f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		output=$(adb shell "cd ${androidpath}; $@")
584f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		output=$(echo $output|tr -d '\r')
594f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		case $output in
604f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen			*PASS) echo "PASS";; 
614f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen			*) echo "$output";;
624f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		esac
634f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		;;
644f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	*)
654f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		echo $(env $@)
664f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		;;
674f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	esac
684f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen}
694f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
704f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfunction binpush() {
714f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	bin=${1}
724f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	if [ "$goos" == "android" ]; then
734f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		adb push "$bin"  "${androidpath}/${bin}" 2>/dev/null
744f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	fi
754f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen}
764f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
774f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenrm -rf pkg
784f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
794f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsensuffix="-installsuffix testcshared"
804f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
814f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenlibext="so"
824f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$goos" == "darwin" ]; then
834f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	libext="dylib"
844f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
854f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
864f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# Create the header files.
874f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenGOPATH=$(pwd) go install -buildmode=c-shared $suffix libgo
884f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
894f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenGOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo.$libext src/libgo/libgo.go
904f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush libgo.$libext
914f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
924f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$goos" == "linux" ] || [ "$goos" == "android" ] ; then
934f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    if readelf -d libgo.$libext | grep TEXTREL >/dev/null; then
944f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen        echo "libgo.$libext has TEXTREL set"
954f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen        exit 1
964f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    fi
974f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
984f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
994f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenGOGCCFLAGS=$(go env GOGCCFLAGS)
1004f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$goos" == "android" ]; then
1014f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	GOGCCFLAGS="${GOGCCFLAGS} -pie"
1024f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1034f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1044f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenstatus=0
1054f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1064f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# test0: exported symbols in shared lib are accessible.
1074f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# TODO(iant): using _shared here shouldn't really be necessary.
1084f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen$(go env CC) ${GOGCCFLAGS} -I ${installdir} -o testp main0.c ./libgo.$libext
1094f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush testp
1104f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1114f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenoutput=$(run LD_LIBRARY_PATH=. ./testp)
1124f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$output" != "PASS" ]; then
1134f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo "FAIL test0 got ${output}"
1144f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	status=1
1154f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1164f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1174f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# test1: shared library can be dynamically loaded and exported symbols are accessible.
1184f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen$(go env CC) ${GOGCCFLAGS} -o testp main1.c -ldl
1194f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush testp
1204f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenoutput=$(run ./testp ./libgo.$libext)
1214f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$output" != "PASS" ]; then
1224f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo "FAIL test1 got ${output}"
1234f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	status=1
1244f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1254f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1264f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# test2: tests libgo2 which does not export any functions.
1274f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenGOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo2.$libext libgo2
1284f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush libgo2.$libext
1294f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenlinkflags="-Wl,--no-as-needed"
1304f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$goos" == "darwin" ]; then
1314f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	linkflags=""
1324f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1334f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen$(go env CC) ${GOGCCFLAGS} -o testp2 main2.c $linkflags libgo2.$libext
1344f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush testp2
1354f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenoutput=$(run LD_LIBRARY_PATH=. ./testp2)
1364f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$output" != "PASS" ]; then
1374f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo "FAIL test2 got ${output}"
1384f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	status=1
1394f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1404f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1414f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# test3: tests main.main is exported on android.
1424f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif [ "$goos" == "android" ]; then
1434f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	$(go env CC) ${GOGCCFLAGS} -o testp3 main3.c -ldl
1444f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	binpush testp3
1454f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	output=$(run ./testp ./libgo.so)
1464f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	if [ "$output" != "PASS" ]; then
1474f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		echo "FAIL test3 got ${output}"
1484f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen		status=1
1494f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	fi
1504f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1514f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1524f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# test4: tests signal handlers
1534f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenGOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo4.$libext libgo4
1544f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush libgo4.$libext
1554f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen$(go env CC) ${GOGCCFLAGS} -pthread -o testp4 main4.c -ldl
1564f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush testp4
1574f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenoutput=$(run ./testp4 ./libgo4.$libext 2>&1)
1584f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif test "$output" != "PASS"; then
1594f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    echo "FAIL test4 got ${output}"
1604f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    if test "$goos" != "android"; then
1614f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo "re-running test4 in verbose mode"
1624f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	./testp4 ./libgo4.$libext verbose
1634f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    fi
1644f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    status=1
1654f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1664f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1674f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen# test5: tests signal handlers with os/signal.Notify
1684f7f559a4b744258a796dd591b11bd88e4a6dc7Dan WillemsenGOPATH=$(pwd) go build -buildmode=c-shared $suffix -o libgo5.$libext libgo5
1694f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush libgo5.$libext
1704f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen$(go env CC) ${GOGCCFLAGS} -pthread -o testp5 main5.c -ldl
1714f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenbinpush testp5
1724f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenoutput=$(run ./testp5 ./libgo5.$libext 2>&1)
1734f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif test "$output" != "PASS"; then
1744f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    echo "FAIL test5 got ${output}"
1754f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    if test "$goos" != "android"; then
1764f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	echo "re-running test5 in verbose mode"
1774f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen	./testp5 ./libgo5.$libext verbose
1784f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    fi
1794f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    status=1
1804f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1814f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1824f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenif test $status = 0; then
1834f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen    echo "ok"
1844f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenfi
1854f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsen
1864f7f559a4b744258a796dd591b11bd88e4a6dc7Dan Willemsenexit $status
187