[autotest] test_droid V1.
This CL introduces test_droid, a script to launch autotest
tests against local Android DUTs connected to the host
computer via USB.
Much of the logic is similar to test_that, so this has all
been pulled into a new script test_utils.py
Pending work:
* Moving of generate_test_report to somewhere it is accesible
outside of the chroot.
* Add in support for remote adb hosts (i.e. the DUT is
connected to a remote computer).
* Sequences support.
BUG=b:25748759
TEST=./test_droid.py 7d52318 brillo_WhitelistedGtests
CQ-DEPEND=CL:315230
Change-Id: Idab3805f7921173fbc706354b322f37244240fa2
Reviewed-on: https://chromium-review.googlesource.com/314870
Commit-Ready: Simran Basi <[email protected]>
Tested-by: Simran Basi <[email protected]>
Reviewed-by: Aviv Keshet <[email protected]>
diff --git a/server/autoserv_utils.py b/server/autoserv_utils.py
index 3a11cca..679418c 100644
--- a/server/autoserv_utils.py
+++ b/server/autoserv_utils.py
@@ -29,7 +29,8 @@
no_console_prefix=False,
ssh_options=None,
use_packaging=True,
- in_lab=False):
+ in_lab=False,
+ host_attributes=None):
"""
Construct an autoserv command from a job or host queue entry.
@@ -61,6 +62,7 @@
environment. This information is useful as autoserv knows
the database is available and can make database calls such
as looking up host attributes at runtime.
+ @param host_attributes: Dict of host attributes to pass into autoserv.
@returns The autoserv command line as a list of executable + parameters.
@@ -109,6 +111,9 @@
elif control_type_value == control_data.CONTROL_TYPE.SERVER:
command.append('-s')
+ if host_attributes:
+ command += ['--host_attributes', repr(host_attributes)]
+
if verbose:
command.append('--verbose')
diff --git a/server/constants.py b/server/constants.py
index 2840370..18319c1 100644
--- a/server/constants.py
+++ b/server/constants.py
@@ -8,4 +8,4 @@
CRASHLOGS_MARKER = '.crashjob'
# Flag file to indicate the host is an adb tester.
-ANDROID_TESTER_FILEFLAG = '/mnt/stateful_partition/.android_tester'
+ANDROID_TESTER_FILEFLAG = '/mnt/stateful_partition/.android_tester'
\ No newline at end of file
diff --git a/server/hosts/adb_host.py b/server/hosts/adb_host.py
index cce602b..238cbdd 100644
--- a/server/hosts/adb_host.py
+++ b/server/hosts/adb_host.py
@@ -115,6 +115,10 @@
"""
Check if the given host is an adb host.
+ If SSH connectivity can't be established, check_host will try to use
+ user 'adb' as well. If SSH connectivity still can't be established
+ then the original SSH user is restored.
+
@param host: An ssh host representing a device.
@param timeout: The timeout for the run command.
@@ -124,13 +128,16 @@
@raises AutoservRunError: If the command failed.
@raises AutoservSSHTimeout: Ssh connection has timed out.
"""
+ ssh_user = host.user
try:
- if not host.verify_ssh_user_access():
+ if not (host.hostname == 'localhost' or
+ host.verify_ssh_user_access()):
host.user = 'adb'
result = host.run(
'test -f %s' % server_constants.ANDROID_TESTER_FILEFLAG,
timeout=timeout)
except (error.AutoservRunError, error.AutoservSSHTimeout):
+ host.user = ssh_user
return False
return result.exit_status == 0
diff --git a/server/hosts/factory.py b/server/hosts/factory.py
index 9e87012..2382df9 100644
--- a/server/hosts/factory.py
+++ b/server/hosts/factory.py
@@ -3,6 +3,7 @@
import logging
from contextlib import closing
+from autotest_lib.client.bin import local_host
from autotest_lib.client.common_lib import error, global_config
from autotest_lib.server import utils as server_utils
from autotest_lib.server.hosts import cros_host, ssh_host
@@ -29,6 +30,8 @@
# overhead in checking for less common host types.
host_types = [cros_host.CrosHost, moblab_host.MoblabHost, sonic_host.SonicHost,
adb_host.ADBHost,]
+OS_HOST_DICT = {'cros' : cros_host.CrosHost,
+ 'android': adb_host.ADBHost}
def _get_host_arguments():
@@ -113,8 +116,10 @@
args['ssh_verbosity_flag'] = ssh_verbosity_flag
args['ssh_options'] = ssh_options
+ if hostname == 'localhost':
+ connectivity_class = local_host.LocalHost
# by default assume we're using SSH support
- if SSH_ENGINE == 'paramiko':
+ elif SSH_ENGINE == 'paramiko':
from autotest_lib.server.hosts import paramiko_host
connectivity_class = paramiko_host.ParamikoHost
elif SSH_ENGINE == 'raw_ssh':
@@ -124,12 +129,13 @@
"value of the configuration key 'ssh_engine' "
"on autotest's global_config.ini file." %
SSH_ENGINE)
-
- if not host_class:
+ host_attributes = args.get('host_attributes', {})
+ host_class = host_class or OS_HOST_DICT.get(host_attributes.get('os_type'))
+ if host_class:
+ classes = [host_class, connectivity_class]
+ else:
classes = [_detect_host(connectivity_class, hostname, **args),
connectivity_class]
- else:
- classes = [host_class, connectivity_class]
# create a custom host class for this machine and return an instance of it
host_class = type("%s_host" % hostname, tuple(classes), {})