| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 1 | #!/bin/bash -u | 
 | 2 |  | 
 | 3 | set -o pipefail | 
 | 4 |  | 
 | 5 | # Test that the mk and ninja files generated by Soong don't change if some | 
 | 6 | # incremental modules are restored from cache. | 
 | 7 |  | 
 | 8 | OUTPUT_DIR="$(mktemp -d tmp.XXXXXX)" | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 9 |  | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 10 | echo ${OUTPUT_DIR} | 
 | 11 |  | 
 | 12 | function cleanup { | 
 | 13 |   rm -rf "${OUTPUT_DIR}" | 
 | 14 | } | 
 | 15 | trap cleanup EXIT | 
 | 16 |  | 
 | 17 | function run_soong_build { | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 18 |   USE_RBE=false TARGET_PRODUCT=aosp_arm TARGET_RELEASE=trunk_staging TARGET_BUILD_VARIANT=userdebug build/soong/soong_ui.bash --make-mode "$@" nothing | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 19 | } | 
 | 20 |  | 
 | 21 | function run_soong_clean { | 
 | 22 |   build/soong/soong_ui.bash --make-mode clean | 
 | 23 | } | 
 | 24 |  | 
 | 25 | function assert_files_equal { | 
 | 26 |   if [ $# -ne 2 ]; then | 
 | 27 |     echo "Usage: assert_files_equal file1 file2" | 
 | 28 |     exit 1 | 
 | 29 |   fi | 
 | 30 |  | 
 | 31 |   if ! cmp -s "$1" "$2"; then | 
 | 32 |     echo "Files are different: $1 $2" | 
 | 33 |     exit 1 | 
 | 34 |   fi | 
 | 35 | } | 
 | 36 |  | 
 | 37 | function compare_mtimes() { | 
 | 38 |   if [ $# -ne 2 ]; then | 
 | 39 |     echo "Usage: compare_mtimes file1 file2" | 
 | 40 |     exit 1 | 
 | 41 |   fi | 
 | 42 |  | 
 | 43 |   file1_mtime=$(stat -c '%Y' $1) | 
 | 44 |   file2_mtime=$(stat -c '%Y' $2) | 
 | 45 |  | 
 | 46 |   if [ "$file1_mtime" -eq "$file2_mtime" ]; then | 
 | 47 |       return 1 | 
 | 48 |   else | 
 | 49 |       return 0 | 
 | 50 |   fi | 
 | 51 | } | 
 | 52 |  | 
 | 53 | function test_build_action_restoring() { | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 54 |   local test_dir="${OUTPUT_DIR}/test_build_action_restoring" | 
 | 55 |   mkdir -p ${test_dir} | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 56 |   run_soong_clean | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 57 |   cat > ${test_dir}/Android.bp <<'EOF' | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 58 | python_binary_host { | 
 | 59 |   name: "my_little_binary_host", | 
 | 60 |   srcs: ["my_little_binary_host.py"], | 
 | 61 | } | 
 | 62 | EOF | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 63 |   touch ${test_dir}/my_little_binary_host.py | 
 | 64 |   run_soong_build --incremental-build-actions | 
 | 65 |   local dir_before="${test_dir}/before" | 
 | 66 |   mkdir -p ${dir_before} | 
 | 67 |   cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/before | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 68 |   # add a comment to the bp file, this should force a new analysis but no module | 
 | 69 |   # should be really impacted, so all the incremental modules should be skipped. | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 70 |   cat >> ${test_dir}/Android.bp <<'EOF' | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 71 | // new comments | 
 | 72 | EOF | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 73 |   run_soong_build --incremental-build-actions | 
 | 74 |   local dir_after="${test_dir}/after" | 
 | 75 |   mkdir -p ${dir_after} | 
 | 76 |   cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/after | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 77 |  | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 78 |   compare_incremental_files $dir_before $dir_after | 
 | 79 |   rm -rf "$test_dir" | 
 | 80 |   echo "test_build_action_restoring test passed" | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 81 | } | 
 | 82 |  | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 83 | function test_incremental_build_parity() { | 
 | 84 |   local test_dir="${OUTPUT_DIR}/test_incremental_build_parity" | 
 | 85 |   run_soong_clean | 
 | 86 |   run_soong_build | 
 | 87 |   local dir_before="${test_dir}/before" | 
 | 88 |   mkdir -p ${dir_before} | 
 | 89 |   cp -pr out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/before | 
 | 90 |  | 
 | 91 |   # Now run clean build with incremental enabled | 
 | 92 |   run_soong_clean | 
 | 93 |   run_soong_build --incremental-build-actions | 
 | 94 |   local dir_after="${test_dir}/after" | 
 | 95 |   mkdir -p ${dir_after} | 
 | 96 |   cp -pr out/soong/build_aosp_arm_ninja_incremental out/soong/*.mk out/soong/build.aosp_arm*.ninja ${test_dir}/after | 
 | 97 |  | 
 | 98 |   compare_files_parity $dir_before $dir_after | 
 | 99 |   rm -rf "$test_dir" | 
 | 100 |   echo "test_incremental_build_parity test passed" | 
 | 101 | } | 
 | 102 |  | 
 | 103 | function compare_files_parity() { | 
 | 104 |   local dir_before=$1; shift | 
 | 105 |   local dir_after=$1; shift | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 106 |   count=0 | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 107 |   for file_before in ${dir_before}/*.mk; do | 
 | 108 |     file_after="${dir_after}/$(basename "$file_before")" | 
 | 109 |     assert_files_equal $file_before $file_after | 
 | 110 |     ((count++)) | 
 | 111 |   done | 
 | 112 |   echo "Compared $count mk files" | 
 | 113 |  | 
 | 114 |   combined_before_file="${dir_before}/combined_files.ninja" | 
 | 115 |   count=0 | 
 | 116 |   for file in ${dir_before}/build.aosp_arm.*.ninja; do | 
 | 117 |     cat $file >> $combined_before_file | 
 | 118 |     ((count++)) | 
 | 119 |   done | 
 | 120 |   echo "Combined $count ninja files from normal build" | 
 | 121 |  | 
 | 122 |   combined_after_file="${dir_after}/combined_files.ninja" | 
 | 123 |   count=0 | 
 | 124 |   for file in ${dir_after}/build.aosp_arm.*.ninja; do | 
 | 125 |     cat $file >> $combined_after_file | 
 | 126 |     ((count++)) | 
 | 127 |   done | 
 | 128 |   echo "Combined $count ninja files from incremental build" | 
 | 129 |  | 
 | 130 |   combined_incremental_ninjas="${dir_after}/combined_incremental_files.ninja" | 
 | 131 |   count=0 | 
 | 132 |   for file in ${dir_after}/build_aosp_arm_ninja_incremental/*.ninja; do | 
 | 133 |     cat $file >> $combined_incremental_ninjas | 
 | 134 |     ((count++)) | 
 | 135 |   done | 
 | 136 |   echo "Combined $count incremental ninja files" | 
 | 137 |  | 
 | 138 |   cat $combined_incremental_ninjas >> $combined_after_file | 
 | 139 |   sort $combined_after_file -o $combined_after_file | 
 | 140 |   sort $combined_before_file -o $combined_before_file | 
 | 141 |   assert_files_equal $combined_before_file $combined_after_file | 
 | 142 | } | 
 | 143 |  | 
 | 144 | function compare_incremental_files() { | 
 | 145 |   local dir_before=$1; shift | 
 | 146 |   local dir_after=$1; shift | 
 | 147 |   count=0 | 
 | 148 |   for file_before in ${dir_before}/*.ninja; do | 
 | 149 |     file_after="${dir_after}/$(basename "$file_before")" | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 150 |     assert_files_equal $file_before $file_after | 
 | 151 |     compare_mtimes $file_before $file_after | 
 | 152 |     if [ $? -ne 0 ]; then | 
 | 153 |       echo "Files have identical mtime: $file_before $file_after" | 
 | 154 |       exit 1 | 
 | 155 |     fi | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 156 |     ((count++)) | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 157 |   done | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 158 |   echo "Compared $count ninja files" | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 159 |  | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 160 |   count=0 | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 161 |   for file_before in ${dir_before}/*.mk; do | 
 | 162 |     file_after="${dir_after}/$(basename "$file_before")" | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 163 |     assert_files_equal $file_before $file_after | 
 | 164 |     compare_mtimes $file_before $file_after | 
 | 165 |     # mk files shouldn't be regenerated | 
 | 166 |     if [ $? -ne 1 ]; then | 
 | 167 |       echo "Files have different mtimes: $file_before $file_after" | 
 | 168 |       exit 1 | 
 | 169 |     fi | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 170 |     ((count++)) | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 171 |   done | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 172 |   echo "Compared $count mk files" | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 173 |  | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 174 |   count=0 | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 175 |   for file_before in ${dir_before}/build_aosp_arm_ninja_incremental/*.ninja; do | 
 | 176 |     file_after="${dir_after}/build_aosp_arm_ninja_incremental/$(basename "$file_before")" | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 177 |     assert_files_equal $file_before $file_after | 
 | 178 |     compare_mtimes $file_before $file_after | 
 | 179 |     # ninja files of skipped modules shouldn't be regenerated | 
 | 180 |     if [ $? -ne 1 ]; then | 
 | 181 |       echo "Files have different mtimes: $file_before $file_after" | 
 | 182 |       exit 1 | 
 | 183 |     fi | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 184 |     ((count++)) | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 185 |   done | 
| Yu Liu | d37ccb7 | 2024-09-19 18:53:41 +0000 | [diff] [blame] | 186 |   echo "Compared $count incremental ninja files" | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 187 | } | 
 | 188 |  | 
| Yu Liu | 480c0e5 | 2024-09-20 23:10:38 +0000 | [diff] [blame] | 189 | test_incremental_build_parity | 
| Yu Liu | 4faab81 | 2024-09-12 23:56:31 +0000 | [diff] [blame] | 190 | test_build_action_restoring |