| #!/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 |