1 #!/bin/bash 2 # 3 # Copyright 2010 Google Inc. All Rights Reserved. 4 # Author: bgay (at] google.com (Bruce Gay) 5 # 6 # The labpretest.sh script is designed to emulate a typical automated test lab 7 # session. It puts a device into bootloader mode, reboots into bootloader mode, 8 # determines device type, erases user cache, flashes a generic userdata image, 9 # updates the bootloader image, updates the radio image, updates the system 10 # image and reboots, sets up for a monkey run and finally runs a random monkey 11 # test. It will repeat this based on an optional parameter(-i) or default to 100 12 # times. It will detect if it is in a low battery situation and wait for it to 13 # charge again. 14 15 16 COUNT=100 17 ROOT=$(cd `dirname $0` && pwd) 18 ADB="$ROOT/tools/adb" 19 FASTBOOT="$ROOT/tools/fastboot" 20 MEVENTS=200 21 NOMONKEY=0 22 23 buildfile='' 24 device='' 25 product='' 26 bootpart='' 27 bootfile='' 28 29 while getopts "d:i::m:xh" optionName; do 30 case "$optionName" in 31 d) device="$OPTARG";; 32 i) COUNT=$OPTARG;; 33 m) MEVENTS=$OPTARG;; 34 x) NOMONKEY=1;; 35 h) echo "options: [-d <device ID>, -i <loop count>, -m <monkey events> -x (skips monkey)]"; exit;; 36 *) echo "invalid parameter -$optionName"; exit -1;; 37 esac 38 done 39 40 declare -r COUNT 41 declare -r MEVENTS 42 declare -r NOMONKEY 43 44 45 ################################################ 46 # Prints output to console with time stamp 47 # Arguments: 48 # None 49 # Returns: 50 # None 51 ################################################ 52 log_print() 53 { 54 if [ -z "$1" ]; then 55 echo "# $(date +'%D %T')" 56 else 57 echo "# $(date +'%D %T'): $1" 58 fi 59 } 60 61 ################################################ 62 # Blocks until battery level is at least 63 # above TARGET if below LIMIT 64 # Globals: 65 # ADB 66 # device 67 # Arguments: 68 # None 69 # Returns: 70 # None 71 ################################################ 72 wait_for_battery() 73 { 74 TARGET=80 75 LIMIT=20 76 local battery 77 local tick 78 log_print "checking battery level" 79 while [ "$battery" = "" ]; do 80 battery=`$ADB -s $device shell dumpsys battery | tr -d '\r' | awk '/level:/ {print $2}'` 81 sleep 2 82 done 83 if [ $battery -lt $LIMIT ]; then 84 log_print "Battery is low, waiting for charge" 85 while true; do 86 battery=`$ADB -s $device shell dumpsys battery | tr -d '\r' | awk '/level:/ {print $2}'` 87 if (( $battery >= $TARGET )); then break; fi 88 tick=$[$TARGET - $battery] 89 echo "battery charge level is $battery, sleeping for $tick seconds" 90 sleep $[$TARGET - $battery * 10] 91 done 92 log_print "resuming test run with battery level at $battery%" 93 else 94 log_print "resuming test run with battery level at $battery%" 95 fi 96 } 97 98 ################################################ 99 # Blocks until device is in fastboot mode or 100 # time out is reached 101 # Globals: 102 # loop 103 # device 104 # Arguments: 105 # None 106 # Returns: 107 # None 108 ################################################ 109 fastboot_wait_for_device() 110 { 111 local fdevice="" 112 local n=0 113 while [ "$device" != "$fdevice" -a $n -le 30 ]; do 114 sleep 6 115 fdevice=`$FASTBOOT devices | sed -n "s/\($device\).*/\1/ p"` 116 let n+=1 117 done 118 if [ $n -gt 30 ]; then 119 log_print "device time out after $loop iterations" 120 exit 121 else 122 log_print "device returned and available" 123 fi 124 } 125 126 ################################################ 127 # reboots device into fastboot mode or 128 # time out is reached 129 # Globals: 130 # device 131 # ADB 132 # Arguments: 133 # None 134 # Returns: 135 # None 136 ################################################ 137 reboot_into_fastboot_from_adb() 138 { 139 log_print "rebooting into bootloader and waiting for availability via fastboot" 140 $ADB -s $device reboot bootloader 141 fastboot_wait_for_device 142 } 143 144 ################################################ 145 # reboots device into fastboot mode or 146 # times out 147 # Globals: 148 # device 149 # FASTBOOT 150 # Arguments: 151 # None 152 # Returns: 153 # None 154 ################################################ 155 reboot_into_fastboot_from_fastboot() 156 { 157 log_print "rebooting into bootloader and waiting for availability via fastboot" 158 $FASTBOOT -s $device reboot-bootloader 159 fastboot_wait_for_device 160 } 161 162 ################################################ 163 # reboots device from fastboot to adb or 164 # times out 165 # Globals: 166 # device 167 # FASTBOOT 168 # ADB 169 # Arguments: 170 # None 171 # Returns: 172 # None 173 ################################################ 174 reboot_into_adb_from_fastboot() 175 { 176 log_print "rebooting and waiting for availability via adb" 177 $FASTBOOT -s $device reboot 178 $ADB -s $device wait-for-device 179 } 180 181 ################################################ 182 # reboots device from fastboot to adb or 183 # times out 184 # Globals: 185 # device 186 # ADB 187 # Arguments: 188 # None 189 # Returns: 190 # None 191 ################################################ 192 wait_for_boot_complete() 193 { 194 log_print "waiting for device to finish booting" 195 local result=$($ADB -s $device shell getprop dev.bootcomplete) 196 local result_test=${result:1:1} 197 echo -n "." 198 while [ -z $result_test ]; do 199 sleep 1 200 echo -n "." 201 result=$($ADB -s $device shell getprop dev.bootcomplete) 202 result_test=${result:0:1} 203 done 204 log_print "finished booting" 205 } 206 207 ################################################ 208 # fastboot flashes partition 209 # 210 # Globals: 211 # device 212 # FASTBOOT 213 # Arguments: 214 # command_name 215 # command_parameters 216 # Returns: 217 # None 218 ################################################ 219 fastboot_command() 220 { 221 $FASTBOOT -s $device $1 $2 $3 222 sleep 5 223 } 224 225 ################################################ 226 # fastboot command wrapper 227 # 228 # Globals: 229 # device 230 # FASTBOOT 231 # Arguments: 232 # partition_name 233 # file_name 234 # Returns: 235 # None 236 ################################################ 237 flash_partition() 238 { 239 $FASTBOOT -s $device flash $1 $2 240 sleep 5 241 } 242 243 ################################################ 244 # adb command wrapper 245 # 246 # Globals: 247 # device 248 # ADB 249 # Arguments: 250 # command_name 251 # command_parameters 252 # Returns: 253 # None 254 ################################################ 255 adb_command() 256 { 257 $ADB -s $device $1 $2 $3 $4 $5 258 sleep 5 259 } 260 261 ################################################ 262 # sets the name of the boot partition and 263 # bootfile, then flashes device 264 # 265 # Globals: 266 # product 267 # ROOT 268 # bootloaderfile 269 # bootpart 270 # device 271 # Arguments: 272 # None 273 # Returns: 274 # None 275 ################################################ 276 flash_bootloader_image() 277 { 278 if [ "$bootpart" == '' ]; then 279 log_print "bootpart not defined" 280 exit 281 fi 282 if [ "$bootloaderfile" == '' ]; then 283 log_print "getting bootloader file for $product" 284 bootloaderfile=`ls -1 $ROOT/$product | sed -n 's/\(.*boot[0-9._]\+img\)/\1/ p'` 285 if [ "$bootloaderfile" == '' ]; then 286 log_print "bootloader file empty: $bootloaderfile" 287 exit 288 fi 289 if [ ! -e "$ROOT/$product/$bootloaderfile" ]; then 290 log_print "bootloader file not found: ./$product/$bootloaderfile" 291 exit 292 fi 293 log_print "using $ROOT/$product/$bootloaderfile as the bootloader image file" 294 fi 295 log_print "downloading bootloader image to $device" 296 flash_partition $bootpart $ROOT/$product/$bootloaderfile 297 reboot_into_fastboot_from_fastboot 298 } 299 300 ################################################ 301 # sets the name of the radio partition and 302 # radiofile and flashes device 303 # 304 # Globals: 305 # product 306 # ROOT 307 # radiofile 308 # radiopart 309 # device 310 # Arguments: 311 # None 312 # Returns: 313 # None 314 ################################################ 315 flash_radio_image() 316 { 317 if [ "$radiopart" == '' ]; then 318 log_print "setting radio partion to 'radio'" 319 radiopart='radio' 320 fi 321 if [ "$radiofile" == "" ]; then 322 log_print "getting radio file for $product" 323 radiofile=`ls -1 $ROOT/$product | sed -n 's/\(radio[0-9._A-Za-z]\+img\)/\1/ p'` 324 if [ "$radiofile" == "" ]; then 325 log_print "radio file empty: $radiofile" 326 exit 327 fi 328 if [ ! -e "$ROOT/$product/$radiofile" ]; then 329 log_print "radio file not found: ./$product/$radiofile" 330 exit 331 fi 332 log_print "using $ROOT/$product/$radiofile as the radio image file" 333 fi 334 log_print "downloading radio image to $device" 335 flash_partition $radiopart $ROOT/$product/$radiofile 336 reboot_into_fastboot_from_fastboot 337 } 338 339 ################################################ 340 # sets the name of the boot partition and 341 # bootfile 342 # 343 # Globals: 344 # product 345 # ROOT 346 # buildfile 347 # device 348 # Arguments: 349 # None 350 # Returns: 351 # None 352 ################################################ 353 flash_system_image() 354 { 355 if [ "$buildfile" == "" ]; then 356 log_print "getting build file for $product" 357 buildfile=`\ls -1 $ROOT/$product 2>&1 | sed -n 's/\([a-z]\+-img-[0-9]\+.zip\)/\1/ p'` 358 if [ "$buildfile" == "" ]; then 359 log_print "build file empty: $buildfile" 360 exit 361 fi 362 if [ ! -e "$ROOT/$product/$buildfile" ]; then 363 log_print "build file not found: ./$product/$buildfile" 364 exit 365 fi 366 log_print "using $ROOT/$product/$buildfile as the system image file" 367 fi 368 log_print "downloading system image to $device" 369 fastboot_command update $ROOT/$product/$buildfile 370 371 } 372 ################################################ 373 # flashes the userdata partition 374 # 375 # Globals: 376 # product 377 # ROOT 378 # Arguments: 379 # None 380 # Returns: 381 # None 382 ################################################ 383 flash_userdata_image() 384 { 385 log_print "flashing userdata..." 386 if [ -e $ROOT/$product/userdata.img ];then 387 flash_partition userdata $ROOT/$product/userdata.img 388 else 389 log_print "userdata.img file not found: $ROOT/$product/userdata.img" 390 exit 391 fi 392 } 393 394 395 ################################################ 396 # flashes the device 397 # 398 # Globals: 399 # product 400 # ROOT 401 # FASTBOOT 402 # bootfile 403 # bootpart 404 # radiofile 405 # Arguments: 406 # None 407 # Returns: 408 # None 409 ################################################ 410 flash_device() 411 { 412 log_print "erasing cache..." 413 fastboot_command erase cache 414 flash_userdata_image 415 flash_bootloader_image 416 flash_radio_image 417 flash_system_image 418 #device has been rebooted 419 adb_command wait-for-device 420 } 421 422 ################################################ 423 # gets the device product type and sets product 424 # 425 # Globals: 426 # product 427 # ROOT 428 # FASTBOOT 429 # device 430 # Arguments: 431 # None 432 # Returns: 433 # None 434 ################################################ 435 set_product_type() 436 { 437 if [ "$product" == "" ]; then 438 log_print "getting device product type" 439 product=`$FASTBOOT -s $device getvar product 2>&1 | sed -n 's/product: \([a-z]*\)\n*/\1/ p'` 440 if [ ! -e "$ROOT/$product" ]; then 441 log_print "device product id not supported: $product" 442 exit 443 fi 444 fi 445 log_print "using $product as device product id" 446 } 447 448 449 450 #start of script 451 #test for dependencies 452 if [ ! -e $ADB ]; then 453 echo "Error: adb not in path! Please correct this." 454 exit 455 fi 456 if [ ! -e $FASTBOOT ]; then 457 echo "Error: fastboot not in path! Please correct this." 458 exit 459 fi 460 #checks to see if the called device is available 461 if [ "$device" != "" ]; then 462 tmpdevice=`$ADB devices | sed -n "s/\($device\).*/\1/ p"` 463 if [ "$device" != "$tmpdevice" ]; then 464 tmpdevice=`$FASTBOOT devices | sed -n "s/\($device\).*/\1/ p"` 465 if [ "$device" != "$tmpdevice" ]; then 466 echo "Warning: device not found... $device" 467 exit 468 else 469 echo "'Device '$device' found!'" 470 reboot_into_adb_from_fastboot 471 wait_for_boot_complete 472 fi 473 fi 474 else 475 device=`$ADB devices | sed -n 's/.*\(^[0-9A-Z]\{2\}[0-9A-Z]*\).*/\1/ p'` 476 if [ `echo $device | wc -w` -ne 1 ]; then 477 echo 'There is more than one device found,' 478 echo 'please pass the correct device ID in as a parameter.' 479 exit 480 fi 481 fi 482 if [ "$device" == "" ]; then 483 echo 'Device not found via adb' 484 device=`$FASTBOOT devices | sed -n 's/.*\(^[0-9A-Z]\{2\}[0-9A-Z]*\).*/\1/ p'` 485 if [ `echo $device | wc -w` -ne 1 ]; then 486 echo "There is more than one device available," 487 echo "please pass the correct device ID in as a parameter." 488 exit 489 fi 490 if [ "$device" == "" ]; then 491 echo 'Device not found via fastboot, please investigate' 492 exit 493 else 494 echo 'Device '$device' found!' 495 reboot_into_adb_from_fastboot 496 wait_for_boot_complete 497 echo 'Hammering on '$device 498 fi 499 else 500 echo 'Hammering on '$device 501 fi 502 reboot_into_fastboot_from_adb 503 set_product_type 504 reboot_into_adb_from_fastboot 505 wait_for_boot_complete 506 507 #check for availability of a custom flash info file and retreive it 508 if [ -e "$ROOT/$product/custom_flash.sh" ]; then 509 . $ROOT/$product/custom_flash.sh 510 fi 511 echo $'\n\n' 512 513 #start of looping 514 for ((loop=1 ; loop <= $COUNT ; loop++ )) ; do 515 echo "" 516 echo "" 517 echo ________________ $(date +'%D %T') - $loop - $device ______________________ 518 519 log_print "setting adb root and sleeping for 7 seconds" 520 adb_command root 521 wait_for_battery 522 log_print "rebooting into bootloader and waiting for availability via fastboot" 523 reboot_into_fastboot_from_adb 524 # not necessary, but useful in testing 525 log_print "using fastboot to reboot to bootloader for test purposes" 526 reboot_into_fastboot_from_fastboot 527 528 #flashing the device 529 flash_device 530 531 #preping device for monkey run 532 log_print "setting adb root" 533 adb_command root 534 log_print "setting ro.test_harness property" 535 adb_command shell setprop ro.test_harness 1 536 537 log_print "waiting for device to finish booting" 538 result=$($ADB -s $device shell getprop dev.bootcomplete) 539 result_test=${result:1:1} 540 echo -n "." 541 while [ -z $result_test ]; do 542 sleep 1 543 echo -n "." 544 result=$($ADB -s $device shell getprop dev.bootcomplete) 545 result_test=${result:0:1} 546 done 547 548 log_print "finished booting" 549 log_print "waiting for the Package Manager" 550 result=$($ADB -s $device shell pm path android) 551 result_test=${result:0:7} 552 echo -n "." 553 while [ $result_test != "package" ]; do 554 sleep 1 555 echo -n "." 556 result=$($ADB -s $device shell pm path android) 557 result_test=${result:0:7} 558 done 559 echo "Package Manager available" 560 561 #lets you see what's going on 562 log_print "setting shell svc power stayon true" 563 adb_command shell svc power stayon true 564 565 #calls the monkey run if not skipped 566 if [ $NOMONKEY == 0 ]; then 567 seed=$(($(date +%s) % 99)) 568 log_print "running short monkey run..." 569 $ADB -s $device shell monkey -p com.android.alarmclock -p com.android.browser -p com.android.calculator2 -p com.android.calendar -p com.android.camera -p com.android.contacts -p com.google.android.gm -p com.android.im -p com.android.launcher -p com.google.android.apps.maps -p com.android.mms -p com.android.music -p com.android.phone -p com.android.settings -p com.google.android.street -p com.android.vending -p com.google.android.youtube -p com.android.email -p com.google.android.voicesearch -c android.intent.category.LAUNCHER --ignore-security-exceptions -s $seed $MEVENTS 570 log_print "finished running monkey, rinse, repeat..." 571 else 572 log_print "-x parameter used, skipping the monkey run" 573 fi 574 575 if [ $loop -eq $COUNT ]; then 576 log_print "device $device has returned, testing completed, count = $loop" 577 echo `echo "Device $device has returned, testing completed, count = $loop." > $ROOT/$device.log` 578 else 579 log_print "device $device has returned, rinse and repeat count = $loop" 580 echo `echo "Device $device has returned, rinse and repeat count = $loop." > $ROOT/$device.log` 581 fi 582 done 583