OLD | NEW |
---|---|
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Provides an interface to communicate with the device via the adb command. | 5 """Provides an interface to communicate with the device via the adb command. |
6 | 6 |
7 Assumes adb binary is currently on system path. | 7 Assumes adb binary is currently on system path. |
8 """ | 8 """ |
9 | 9 |
10 import collections | 10 import collections |
11 import datetime | 11 import datetime |
12 import logging | 12 import logging |
13 import os | 13 import os |
14 import random | |
14 import re | 15 import re |
15 import shlex | 16 import shlex |
16 import subprocess | 17 import subprocess |
17 import sys | 18 import sys |
18 import tempfile | 19 import tempfile |
19 import time | 20 import time |
20 | 21 |
21 import pexpect | 22 import pexpect |
22 import io_stats_parser | 23 import io_stats_parser |
23 | 24 |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
305 uninstall_command = 'uninstall %s' % package | 306 uninstall_command = 'uninstall %s' % package |
306 | 307 |
307 logging.info('>>> $' + uninstall_command) | 308 logging.info('>>> $' + uninstall_command) |
308 return self._adb.SendCommand(uninstall_command, timeout_time=60) | 309 return self._adb.SendCommand(uninstall_command, timeout_time=60) |
309 | 310 |
310 def Install(self, package_file_path, reinstall=False): | 311 def Install(self, package_file_path, reinstall=False): |
311 """Installs the specified package to the device. | 312 """Installs the specified package to the device. |
312 | 313 |
313 Args: | 314 Args: |
314 package_file_path: Path to .apk file to install. | 315 package_file_path: Path to .apk file to install. |
315 reinstall: Whether to reinstall over existing package | 316 reinstall: Reinstall an existing apk. |
316 | 317 |
317 Returns: | 318 Returns: |
318 A status string returned by adb install | 319 A status string returned by adb install |
319 """ | 320 """ |
320 assert os.path.isfile(package_file_path) | 321 assert os.path.isfile(package_file_path) |
321 | 322 |
322 if reinstall: | 323 if reinstall: |
323 install_cmd = 'install -r %s' | 324 install_cmd = 'install -r %s' |
324 else: | 325 else: |
325 install_cmd = 'install %s' | 326 install_cmd = 'install %s' |
326 | 327 |
327 return self._adb.SendCommand(install_cmd % package_file_path, | 328 return self._adb.SendCommand(install_cmd % package_file_path, |
328 timeout_time=2*60, retry_count=0) | 329 timeout_time=2*60, retry_count=0) |
329 | 330 |
330 def ManagedInstall(self, apk_path, keep_data, package_name=None, | 331 def ManagedInstall(self, apk_path, package_name=None, reinstall=False, |
331 reboots_on_failure=2): | 332 reboots_on_failure=2): |
332 """Installs specified package and reboots device on timeouts. | 333 """Installs specified package and reboots device on timeouts. |
333 | 334 |
334 Args: | 335 Args: |
335 apk_path: Path to .apk file to install. | 336 apk_path: Path to .apk file to install. |
336 keep_data: Whether to keep data if package already exists | 337 package_name: Package name (only needed if reinstall=False) |
337 package_name: Package name (only needed if keep_data=False) | 338 reinstall: Whether to reinstall instead of uninstalling first. |
Isaac (away)
2012/08/22 02:03:28
I know I said it was OK earlier but I think reinst
frankf
2012/08/22 21:46:55
Done.
| |
338 reboots_on_failure: number of time to reboot if package manager is frozen. | 339 reboots_on_failure: number of time to reboot if package manager is frozen. |
339 | 340 |
340 Returns: | 341 Returns: |
341 A status string returned by adb install | 342 A status string returned by adb install |
342 """ | 343 """ |
343 reboots_left = reboots_on_failure | 344 reboots_left = reboots_on_failure |
344 while True: | 345 while True: |
345 try: | 346 try: |
346 if not keep_data: | 347 if not reinstall: |
348 assert package_name | |
347 self.Uninstall(package_name) | 349 self.Uninstall(package_name) |
348 install_status = self.Install(apk_path, keep_data) | 350 install_status = self.Install(apk_path, reinstall=reinstall) |
349 if 'Success' in install_status: | 351 if 'Success' in install_status: |
350 return install_status | 352 return install_status |
351 except errors.WaitForResponseTimedOutError: | 353 except errors.WaitForResponseTimedOutError: |
352 print '@@@STEP_WARNINGS@@@' | 354 print '@@@STEP_WARNINGS@@@' |
353 logging.info('Timeout on installing %s' % apk_path) | 355 logging.info('Timeout on installing %s' % apk_path) |
354 | 356 |
355 if reboots_left <= 0: | 357 if reboots_left <= 0: |
356 raise Exception('Install failure') | 358 raise Exception('Install failure') |
357 | 359 |
358 # Force a hard reboot on last attempt | 360 # Force a hard reboot on last attempt |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
980 if len(process_results) <= 8: | 982 if len(process_results) <= 8: |
981 continue | 983 continue |
982 # Column 0 is the executable name | 984 # Column 0 is the executable name |
983 # Column 1 is the pid | 985 # Column 1 is the pid |
984 # Column 8 is the Inode in use | 986 # Column 8 is the Inode in use |
985 if process_results[8] == socket_name: | 987 if process_results[8] == socket_name: |
986 pids.append((int(process_results[1]), process_results[0])) | 988 pids.append((int(process_results[1]), process_results[0])) |
987 break | 989 break |
988 logging.info('PidsUsingDevicePort: %s', pids) | 990 logging.info('PidsUsingDevicePort: %s', pids) |
989 return pids | 991 return pids |
992 | |
993 def RunMonkey(self, package_name, category=None, throttle=100, seed=None, | |
994 event_count=10000, verbose=1, extra_args=''): | |
995 """Runs monkey test for a given package. | |
996 | |
997 Args: | |
998 package_name: Allowed package. | |
999 category: A list of allowed categories. | |
1000 throttle: Delay between events (ms). | |
1001 seed: Seed value for pseduo-random generator. Same seed value | |
1002 generates the same sequence of events. Seed is randomized by | |
1003 default. | |
1004 event_count: Number of events to generate. | |
1005 verbose: Verbosity level [0-3]. | |
1006 extra_args: A string of other args to pass to the command verbatim. | |
1007 | |
1008 Returns: | |
1009 Output of the test run. | |
1010 """ | |
1011 if category is None: | |
Isaac (away)
2012/08/22 02:03:28
the preferred way of doing this is:
category = ca
frankf
2012/08/22 21:46:55
Done.
| |
1012 category = [] | |
1013 | |
1014 if not seed: | |
1015 seed = random.randint(1, 100) | |
Isaac (away)
2012/08/22 02:03:28
seed = seed or random.randint(1, 100)
frankf
2012/08/22 21:46:55
Done.
| |
1016 | |
1017 cmd = ['monkey', | |
1018 '-p %s' % package_name, | |
1019 ' '.join(['-c %s' % c for c in category]), | |
1020 '--throttle %d' % throttle, | |
1021 '-s %d' % seed, | |
1022 ' '.join(['-v'] * verbose), | |
Isaac (away)
2012/08/22 02:03:28
don't like this syntax -- can you figure out an al
frankf
2012/08/22 21:46:55
The only other way is restrict verbose to a bool (
Isaac (away)
2012/08/22 21:53:19
Oh, I didn't realize you wanted to pass multiple -
| |
1023 extra_args, | |
1024 '%s' % event_count] | |
1025 return self.RunShellCommand(' '.join(cmd), | |
1026 timeout_time=event_count*throttle*1.5) | |
OLD | NEW |