This got refactored upstream. Test: checkbuild and ./run_tests.py Change-Id: I801869923cf7c51528de354f8a3da705f188ff43
66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
import time
|
|
|
|
import libcxx.test.executor
|
|
|
|
from libcxx.android import adb
|
|
from lit.util import executeCommand # pylint: disable=import-error
|
|
|
|
|
|
class AdbExecutor(libcxx.test.executor.RemoteExecutor):
|
|
def __init__(self, serial=None):
|
|
# TODO(danalbert): Should factor out the shared pieces of SSHExecutor
|
|
# so we don't have this ugly parent constructor...
|
|
super(AdbExecutor, self).__init__()
|
|
self.serial = serial
|
|
self.local_run = executeCommand
|
|
|
|
def _remote_temp(self, is_dir):
|
|
dir_arg = '-d' if is_dir else ''
|
|
cmd = 'mktemp -q {} /data/local/tmp/libcxx.XXXXXXXXXX'.format(dir_arg)
|
|
_, temp_path, err, exitCode = self._execute_command_remote([cmd])
|
|
temp_path = temp_path.strip()
|
|
if exitCode != 0:
|
|
raise RuntimeError(err)
|
|
return temp_path
|
|
|
|
def _copy_in_file(self, src, dst): # pylint: disable=no-self-use
|
|
adb.push(src, dst)
|
|
|
|
def _execute_command_remote(self, cmd, remote_work_dir='.', env=None):
|
|
adb_cmd = ['adb', 'shell']
|
|
if self.serial:
|
|
adb_cmd.extend(['-s', self.serial])
|
|
|
|
delimiter = 'x'
|
|
probe_cmd = ' '.join(cmd) + '; echo {}$?'.format(delimiter)
|
|
|
|
env_cmd = []
|
|
if env is not None:
|
|
env_cmd = ['env'] + ['%s=%s' % (k, v) for k, v in env.items()]
|
|
|
|
remote_cmd = ' '.join(env_cmd + [probe_cmd])
|
|
if remote_work_dir != '.':
|
|
remote_cmd = 'cd {} && {}'.format(remote_work_dir, remote_cmd)
|
|
|
|
adb_cmd.append(remote_cmd)
|
|
|
|
# Tests will commonly fail with ETXTBSY. Possibly related to this bug:
|
|
# https://code.google.com/p/android/issues/detail?id=65857. Work around
|
|
# it by just waiting a second and then retrying.
|
|
for _ in range(10):
|
|
out, err, exit_code = self.local_run(adb_cmd)
|
|
if 'Text file busy' in out:
|
|
time.sleep(1)
|
|
else:
|
|
out, delim, rc_str = out.rpartition(delimiter)
|
|
if delim == '':
|
|
continue
|
|
|
|
out = out.strip()
|
|
try:
|
|
exit_code = int(rc_str)
|
|
break
|
|
except ValueError:
|
|
continue
|
|
return adb_cmd, out, err, exit_code
|