1512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker#!/bin/bash 2512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# 3512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# A script for testing imgdiff/applypatch. It takes two full OTA 4512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# packages as arguments. It generates (on the host) patches for all 5512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# the zip/jar/apk files they have in common, as well as boot and 6512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# recovery images. It then applies the patches on the device (or 7512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# emulator) and checks that the resulting file is correct. 8512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 9512536a54a1a211a9f582e76cbf12850dc7d5466Doug ZongkerEMULATOR_PORT=5580 10512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 11512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# set to 0 to use a device instead 12512536a54a1a211a9f582e76cbf12850dc7d5466Doug ZongkerUSE_EMULATOR=0 13512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 14512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# where on the device to do all the patching. 15512536a54a1a211a9f582e76cbf12850dc7d5466Doug ZongkerWORK_DIR=/data/local/tmp 16512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 17512536a54a1a211a9f582e76cbf12850dc7d5466Doug ZongkerSTART_OTA_PACKAGE=$1 18512536a54a1a211a9f582e76cbf12850dc7d5466Doug ZongkerEND_OTA_PACKAGE=$2 19512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 20512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# ------------------------ 21512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 22512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkertmpdir=$(mktemp -d) 23512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 24512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerif [ "$USE_EMULATOR" == 1 ]; then 25512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker emulator -wipe-data -noaudio -no-window -port $EMULATOR_PORT & 26512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker pid_emulator=$! 27512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker ADB="adb -s emulator-$EMULATOR_PORT " 28512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerelse 29512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker ADB="adb -d " 30512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerfi 31512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 32512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerecho "waiting to connect to device" 33512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker$ADB wait-for-device 34512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 35512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# run a command on the device; exit with the exit status of the device 36512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# command. 37512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerrun_command() { 38512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker $ADB shell "$@" \; echo \$? | awk '{if (b) {print a}; a=$0; b=1} END {exit a}' 39512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker} 40512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 41512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkertestname() { 42512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker echo 43512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker echo "$1"... 44512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker testname="$1" 45512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker} 46512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 47512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerfail() { 48512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker echo 49512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker echo FAIL: $testname 50512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker echo 51512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker [ "$open_pid" == "" ] || kill $open_pid 52512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker [ "$pid_emulator" == "" ] || kill $pid_emulator 53512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker exit 1 54512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker} 55512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 56512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkersha1() { 57512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker sha1sum $1 | awk '{print $1}' 58512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker} 59512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 60512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkersize() { 61512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker stat -c %s $1 | tr -d '\n' 62512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker} 63512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 64512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkercleanup() { 65512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker # not necessary if we're about to kill the emulator, but nice for 66512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker # running on real devices or already-running emulators. 67512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker testname "removing test files" 68512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker run_command rm $WORK_DIR/applypatch 69512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker run_command rm $WORK_DIR/source 70512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker run_command rm $WORK_DIR/target 71512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker run_command rm $WORK_DIR/patch 72512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 73512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker [ "$pid_emulator" == "" ] || kill $pid_emulator 74512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 75512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker rm -rf $tmpdir 76512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker} 77512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 78512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker$ADB push $ANDROID_PRODUCT_OUT/system/bin/applypatch $WORK_DIR/applypatch 79512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 80512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerpatch_and_apply() { 81512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker local fn=$1 82512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker shift 83512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 84512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker unzip -p $START_OTA_PACKAGE $fn > $tmpdir/source 85512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker unzip -p $END_OTA_PACKAGE $fn > $tmpdir/target 86512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker imgdiff "$@" $tmpdir/source $tmpdir/target $tmpdir/patch 87512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker bsdiff $tmpdir/source $tmpdir/target $tmpdir/patch.bs 88512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker echo "patch for $fn is $(size $tmpdir/patch) [of $(size $tmpdir/target)] ($(size $tmpdir/patch.bs) with bsdiff)" 89512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker echo "$fn $(size $tmpdir/patch) of $(size $tmpdir/target) bsdiff $(size $tmpdir/patch.bs)" >> /tmp/stats.txt 90512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker $ADB push $tmpdir/source $WORK_DIR/source || fail "source push failed" 91512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker run_command rm /data/local/tmp/target 92512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker $ADB push $tmpdir/patch $WORK_DIR/patch || fail "patch push failed" 93512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker run_command /data/local/tmp/applypatch /data/local/tmp/source \ 94512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker /data/local/tmp/target $(sha1 $tmpdir/target) $(size $tmpdir/target) \ 95512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker $(sha1 $tmpdir/source):/data/local/tmp/patch \ 96512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker || fail "applypatch of $fn failed" 97512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker $ADB pull /data/local/tmp/target $tmpdir/result 98512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker diff -q $tmpdir/target $tmpdir/result || fail "patch output not correct!" 99512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker} 100512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 101512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# --------------- basic execution ---------------------- 102512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 103512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerfor i in $((zipinfo -1 $START_OTA_PACKAGE; zipinfo -1 $END_OTA_PACKAGE) | \ 104512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker sort | uniq -d | egrep -e '[.](apk|jar|zip)$'); do 105512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker patch_and_apply $i -z 106512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerdone 107512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerpatch_and_apply boot.img 108512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerpatch_and_apply system/recovery.img 109512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 110512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 111512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker# --------------- cleanup ---------------------- 112512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 113512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkercleanup 114512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 115512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerecho 116512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerecho PASS 117512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongkerecho 118512536a54a1a211a9f582e76cbf12850dc7d5466Doug Zongker 119