# Copyright 2016 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import logging import os import re from autotest_lib.client.bin import utils from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib.cros import arc from autotest_lib.client.cros.graphics import graphics_utils _CROS_BIN_DIR = '/usr/local/bin/' _SDCARD_DIR = '/sdcard/' _EXEC_DIR = '/data/executables/' _TEST_COMMAND = 'test -e' _POSSIBLE_BINARIES = ['gralloctest_amd64', 'gralloctest_arm', 'gralloctest_x86'] # The tests still can be run individually, though we run with the 'all' option # Run ./gralloctest in Android to get a list of options. _OPTION = 'all' # GraphicsTest should go first as it will pass initialize/cleanup function # to ArcTest. GraphicsTest initialize would not be called if ArcTest goes first class graphics_Gralloc(graphics_utils.GraphicsTest, arc.ArcTest): """gralloc test.""" version = 1 _executables = [] def arc_setup(self): super(graphics_Gralloc, self).arc_setup() # Get the executable from CrOS and copy it to Android container. Due to # weird permission issues inside the container, we first have to copy # the test to /sdcard/, then move it to a /data/ subdirectory we create. # The permissions on the exectuable have to be modified as well. arc.adb_root() arc._android_shell('mkdir -p %s' % (_EXEC_DIR)) for binary in _POSSIBLE_BINARIES: cros_path = os.path.join(_CROS_BIN_DIR, binary) cros_cmd = '%s %s' % (_TEST_COMMAND, cros_path) job = utils.run(cros_cmd, ignore_status=True) if job.exit_status: continue sdcard_path = os.path.join(_SDCARD_DIR, binary) arc.adb_cmd('-e push %s %s' % (cros_path, sdcard_path)) exec_path = os.path.join(_EXEC_DIR, binary) arc._android_shell('mv %s %s' % (sdcard_path, exec_path)) arc._android_shell('chmod o+rwx %s' % (exec_path)) self._executables.append(exec_path) def arc_teardown(self): for executable in self._executables: # Remove test contents from Android container. arc._android_shell('rm -rf %s' % (executable)) super(graphics_Gralloc, self).arc_teardown() def run_once(self): gpu_family = utils.get_gpu_family() if not self._executables: raise error.TestFail('Failed: No executables found on %s' % gpu_family) logging.debug('Running %d executables', len(self._executables)) for executable in self._executables: try: cmd = '%s %s' % (executable, _OPTION) stdout = arc._android_shell(cmd) except Exception: logging.error('Exception running %s', cmd) raise error.TestFail('Failed: gralloc on %s' % gpu_family) # Look for the regular expression indicating failure. for line in stdout.splitlines(): match = re.search(r'\[ FAILED \]', stdout) if match: self.add_failures(line) logging.error(line) else: logging.debug(stdout) if self.get_failures(): raise error.TestFail('Failed: gralloc on %s in %s.' % (gpu_family, self.get_failures()))