blob: 1478e374616ec00dc94a443a441e9737a22e1a91 [file] [log] [blame]
Lukacs T. Berki3b730c42021-04-08 13:21:13 +02001#!/bin/bash -eu
2
3HARDWIRED_MOCK_TOP=
4# Uncomment this to be able to view the source tree after a test is run
5# HARDWIRED_MOCK_TOP=/tmp/td
6
7REAL_TOP="$(readlink -f "$(dirname "$0")"/../../..)"
8
Lukacs T. Berki686965b2021-04-14 16:40:03 +02009if [[ ! -z "$HARDWIRED_MOCK_TOP" ]]; then
10 MOCK_TOP="$HARDWIRED_MOCK_TOP"
11else
12 MOCK_TOP=$(mktemp -t -d st.XXXXX)
13 trap cleanup_mock_top EXIT
14fi
15
16WARMED_UP_MOCK_TOP=$(mktemp -t soong_integration_tests_warmup.XXXXXX.tar.gz)
17trap 'rm -f "$WARMED_UP_MOCK_TOP"' EXIT
18
19function warmup_mock_top {
20 info "Warming up mock top ..."
21 info "Mock top warmup archive: $WARMED_UP_MOCK_TOP"
22 cleanup_mock_top
23 mkdir -p "$MOCK_TOP"
24 cd "$MOCK_TOP"
25
26 create_mock_soong
27 run_soong
28 tar czf "$WARMED_UP_MOCK_TOP" *
29}
30
31function cleanup_mock_top {
32 cd /
33 rm -fr "$MOCK_TOP"
34}
35
36function info {
37 echo -e "\e[92;1m[TEST HARNESS INFO]\e[0m" $*
38}
39
Lukacs T. Berki3b730c42021-04-08 13:21:13 +020040function fail {
Lukacs T. Berki686965b2021-04-14 16:40:03 +020041 echo -e "\e[91;1mFAILED:\e[0m" $*
Lukacs T. Berki3b730c42021-04-08 13:21:13 +020042 exit 1
43}
44
45function copy_directory() {
46 local dir="$1"
47 local parent="$(dirname "$dir")"
48
49 mkdir -p "$MOCK_TOP/$parent"
50 cp -R "$REAL_TOP/$dir" "$MOCK_TOP/$parent"
51}
52
53function symlink_file() {
54 local file="$1"
55
56 mkdir -p "$MOCK_TOP/$(dirname "$file")"
57 ln -s "$REAL_TOP/$file" "$MOCK_TOP/$file"
58}
59
60function symlink_directory() {
61 local dir="$1"
62
63 mkdir -p "$MOCK_TOP/$dir"
64 # We need to symlink the contents of the directory individually instead of
65 # using one symlink for the whole directory because finder.go doesn't follow
66 # symlinks when looking for Android.bp files
67 for i in $(ls "$REAL_TOP/$dir"); do
68 local target="$MOCK_TOP/$dir/$i"
69 local source="$REAL_TOP/$dir/$i"
70
71 if [[ -e "$target" ]]; then
72 if [[ ! -d "$source" || ! -d "$target" ]]; then
73 fail "Trying to symlink $dir twice"
74 fi
75 else
76 ln -s "$REAL_TOP/$dir/$i" "$MOCK_TOP/$dir/$i";
77 fi
78 done
79}
80
Lukacs T. Berki686965b2021-04-14 16:40:03 +020081function create_mock_soong {
Lukacs T. Berki3b730c42021-04-08 13:21:13 +020082 copy_directory build/blueprint
83 copy_directory build/soong
84
85 symlink_directory prebuilts/go
86 symlink_directory prebuilts/build-tools
87 symlink_directory external/golang-protobuf
88
89 touch "$MOCK_TOP/Android.bp"
Lukacs T. Berki686965b2021-04-14 16:40:03 +020090}
Lukacs T. Berki3b730c42021-04-08 13:21:13 +020091
Lukacs T. Berki686965b2021-04-14 16:40:03 +020092function setup() {
93 cleanup_mock_top
94 mkdir -p "$MOCK_TOP"
Lukacs T. Berki3b730c42021-04-08 13:21:13 +020095
Lukacs T. Berki686965b2021-04-14 16:40:03 +020096 echo
97 echo ----------------------------------------------------------------------------
98 info "Running test case ${FUNCNAME[1]}"
99 cd "$MOCK_TOP"
100
101 tar xzf "$WARMED_UP_MOCK_TOP"
Lukacs T. Berki3b730c42021-04-08 13:21:13 +0200102}
103
104function run_soong() {
105 build/soong/soong_ui.bash --make-mode --skip-ninja --skip-make --skip-soong-tests
106}
Lukacs T. Berki686965b2021-04-14 16:40:03 +0200107
108info "Starting Soong integration test suite $(basename $0)"
109info "Mock top: $MOCK_TOP"
110
111
112export ALLOW_MISSING_DEPENDENCIES=true
113warmup_mock_top