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