1#!/usr/bin/env bash
2# Copyright 2014 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
6# For testing Android.
7# The compiler runs locally, then a copy of the GOROOT is pushed to a
8# target device using adb, and the tests are run there.
9
10set -e
11ulimit -c 0 # no core files
12
13if [ ! -f make.bash ]; then
14	echo 'androidtest.bash must be run from $GOROOT/src' 1>&2
15	exit 1
16fi
17
18if [ -z $GOOS ]; then
19	export GOOS=android
20fi
21if [ "$GOOS" != "android" ]; then
22	echo "androidtest.bash requires GOOS=android, got GOOS=$GOOS" 1>&2
23	exit 1
24fi
25
26if [ -z $GOARM ]; then
27	export GOARM=7
28fi
29if [ "$GOARM" != "7" ]; then
30	echo "android only supports GOARM=7, got GOARM=$GOARM" 1>&2
31	exit 1
32fi
33if [ "$GOARCH" = "" ]; then
34	echo "GOARCH must be set" 1>&2
35	exit 1
36fi
37
38export CGO_ENABLED=1
39unset GOBIN
40
41# Do the build first, so we can build go_android_exec and cleaner.
42# Also lets us fail early before the (slow) adb push if the build is broken.
43. ./make.bash --no-banner
44export GOROOT=$(dirname $(pwd))
45export PATH=$GOROOT/bin:$PATH
46GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH go build \
47	-o ../bin/go_android_${GOARCH}_exec \
48	../misc/android/go_android_exec.go
49
50export pkgdir=$(dirname $(go list -f '{{.Target}}' runtime))
51if [ "$pkgdir" = "" ]; then
52	echo "could not find android pkg dir" 1>&2
53	exit 1
54fi
55
56export ANDROID_TEST_DIR=/tmp/androidtest-$$
57
58function cleanup() {
59	rm -rf ${ANDROID_TEST_DIR}
60}
61trap cleanup EXIT
62
63# Push GOROOT to target device.
64#
65# The adb sync command will sync either the /system or /data
66# directories of an android device from a similar directory
67# on the host. We copy the files required for running tests under
68# /data/local/tmp/goroot. The adb sync command does not follow
69# symlinks so we have to copy.
70export ANDROID_PRODUCT_OUT="${ANDROID_TEST_DIR}/out"
71FAKE_GOROOT=$ANDROID_PRODUCT_OUT/data/local/tmp/goroot
72mkdir -p $FAKE_GOROOT
73mkdir -p $FAKE_GOROOT/pkg
74cp -a "${GOROOT}/src" "${FAKE_GOROOT}/"
75cp -a "${GOROOT}/test" "${FAKE_GOROOT}/"
76cp -a "${GOROOT}/lib" "${FAKE_GOROOT}/"
77cp -a "${pkgdir}" "${FAKE_GOROOT}/pkg/"
78
79echo '# Syncing test files to android device'
80adb shell mkdir -p /data/local/tmp/goroot
81time adb sync data &> /dev/null
82
83export CLEANER=${ANDROID_TEST_DIR}/androidcleaner-$$
84cp ../misc/android/cleaner.go $CLEANER.go
85echo 'var files = `' >> $CLEANER.go
86(cd $ANDROID_PRODUCT_OUT/data/local/tmp/goroot; find . >> $CLEANER.go)
87echo '`' >> $CLEANER.go
88go build -o $CLEANER $CLEANER.go
89adb push $CLEANER /data/local/tmp/cleaner
90adb shell /data/local/tmp/cleaner
91
92echo ''
93
94# Run standard tests.
95bash run.bash --no-rebuild
96