|  | #!/bin/bash -ex | 
|  |  | 
|  | : "${OUT_DIR:?Must set OUT_DIR}" | 
|  | TOP=$(cd $(dirname $0)/../../..; pwd) | 
|  | cd ${TOP} | 
|  |  | 
|  | UNAME="$(uname)" | 
|  | case "$UNAME" in | 
|  | Linux) | 
|  | OS='linux' | 
|  | ;; | 
|  | Darwin) | 
|  | OS='darwin' | 
|  | ;; | 
|  | *) | 
|  | exit 1 | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | # Verify that go test and go build work on all the same projects that are parsed by | 
|  | # build/soong/build_kzip.bash | 
|  | declare -ar go_modules=(build/blueprint build/soong | 
|  | build/make/tools/canoninja build/make/tools/compliance build/make/tools/rbcrun) | 
|  | export GOROOT=${TOP}/prebuilts/go/${OS}-x86 | 
|  | export GOENV=off | 
|  | export GOPROXY=off | 
|  | abs_out_dir=$(cd ${OUT_DIR}; pwd) | 
|  | export GOPATH=${abs_out_dir}/gopath | 
|  | export GOCACHE=${abs_out_dir}/gocache | 
|  | export GOMODCACHE=${abs_out_dir}/gomodcache | 
|  | export TMPDIR=${abs_out_dir}/gotemp | 
|  | mkdir -p ${TMPDIR} | 
|  | ${GOROOT}/bin/go env | 
|  |  | 
|  | if [[ ${OS} = linux ]]; then | 
|  | # Building with the race detector enabled uses the host linker, set the | 
|  | # path to use the hermetic one. | 
|  | CLANG_VERSION=$(build/soong/scripts/get_clang_version.py) | 
|  | export CC="${TOP}/prebuilts/clang/host/${OS}-x86/${CLANG_VERSION}/bin/clang" | 
|  | export CXX="${TOP}/prebuilts/clang/host/${OS}-x86/${CLANG_VERSION}/bin/clang++" | 
|  | fi | 
|  |  | 
|  | # androidmk_test.go gets confused if ANDROID_BUILD_TOP is set. | 
|  | unset ANDROID_BUILD_TOP | 
|  |  | 
|  | network_jail="" | 
|  | if [[ ${OS} = linux ]]; then | 
|  | # The go tools often try to fetch dependencies from the network, | 
|  | # wrap them in an nsjail to prevent network access. | 
|  | network_jail=${TOP}/prebuilts/build-tools/linux-x86/bin/nsjail | 
|  | # Quiet | 
|  | network_jail="${network_jail} -q" | 
|  | # No timeout | 
|  | network_jail="${network_jail} -t 0" | 
|  | # Set working directory | 
|  | network_jail="${network_jail} --cwd=\$PWD" | 
|  | # Pass environment variables through | 
|  | network_jail="${network_jail} -e" | 
|  | # Allow read-only access to everything | 
|  | network_jail="${network_jail} -R /" | 
|  | # Allow write access to the out directory | 
|  | network_jail="${network_jail} -B ${abs_out_dir}" | 
|  | # Allow write access to the /tmp directory | 
|  | network_jail="${network_jail} -B /tmp" | 
|  | # Set high values, as network_jail uses low defaults. | 
|  | network_jail="${network_jail} --rlimit_as soft" | 
|  | network_jail="${network_jail} --rlimit_core soft" | 
|  | network_jail="${network_jail} --rlimit_cpu soft" | 
|  | network_jail="${network_jail} --rlimit_fsize soft" | 
|  | network_jail="${network_jail} --rlimit_nofile soft" | 
|  | fi | 
|  |  | 
|  | for dir in "${go_modules[@]}"; do | 
|  | (cd "$dir"; | 
|  | eval ${network_jail} -- ${GOROOT}/bin/go build ./... | 
|  | eval ${network_jail} -- ${GOROOT}/bin/go test ./... | 
|  | eval ${network_jail} -- ${GOROOT}/bin/go test -race -timeout 20m -short ./... | 
|  | ) | 
|  | done |