# Copyright 2017 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """A test which verifies the camera function with HAL3 interface.""" import contextlib import json import logging import os import xml.etree.ElementTree from autotest_lib.client.bin import test, utils from autotest_lib.client.common_lib import error from autotest_lib.client.cros import service_stopper from autotest_lib.client.cros.camera import camera_utils from autotest_lib.client.cros.video import device_capability from sets import Set class camera_HAL3(test.test): """ This test is a wrapper of the test binary cros_camera_test. """ version = 1 test_binary = 'cros_camera_test' dep = 'camera_hal3' cros_camera_service = 'cros-camera' media_profiles_path = os.path.join('vendor', 'etc', 'media_profiles.xml') tablet_board_list = ['scarlet', 'nocturne'] test_config_path = '/var/cache/camera/test_config.json' def setup(self): """ Run common setup steps. """ self.dep_dir = os.path.join(self.autodir, 'deps', self.dep) self.job.setup_dep([self.dep]) logging.debug('mydep is at %s', self.dep_dir) @contextlib.contextmanager def set_test_config(self, test_config): with open(self.test_config_path, 'w') as fp: json.dump(test_config, fp) yield os.remove(self.test_config_path) def get_recording_params(self): """ Get recording parameters from media profiles """ xml_content = utils.system_output([ 'android-sh', '-c', 'cat "%s"' % utils.sh_escape(self.media_profiles_path) ]) root = xml.etree.ElementTree.fromstring(xml_content) recording_params = Set() for camcorder_profiles in root.findall('CamcorderProfiles'): for encoder_profile in camcorder_profiles.findall('EncoderProfile'): video = encoder_profile.find('Video') recording_params.add('%s:%s:%s:%s' % ( camcorder_profiles.get('cameraId'), video.get('width'), video.get('height'), video.get('frameRate'))) return '--recording_params=' + ','.join(recording_params) def run_once(self, cmd_timeout=600, camera_hals=None, options=None, capability=None, test_config=None): """ Entry point of this test. @param cmd_timeout: Seconds. Timeout for running the test command. @param camera_hals: The camera HALs to be tested. e.g. ['usb.so'] @param options: Option strings passed to test command. e.g. ['--v=1'] @param capability: Capability required for executing this test. """ if options is None: options = [] if test_config is None: test_config = {} if capability: device_capability.DeviceCapability().ensure_capability(capability) self.job.install_pkg(self.dep, 'dep', self.dep_dir) camera_hal_paths = camera_utils.get_camera_hal_paths_for_test() if camera_hals is not None: name_map = dict((os.path.basename(path), path) for path in camera_hal_paths) camera_hal_paths = [] for name in camera_hals: path = name_map.get(name) if path is None: msg = 'HAL %r is not available for test' % name raise error.TestNAError(msg) camera_hal_paths.append(path) binary_path = os.path.join(self.dep_dir, 'bin', self.test_binary) with service_stopper.ServiceStopper([self.cros_camera_service]), \ self.set_test_config(test_config): has_facing_option = False cmd = ['sudo', '--user=arc-camera', binary_path] for option in options: if 'gtest_filter' in option: filters = option.split('=')[1] if 'Camera3DeviceTest' in filters.split('-')[0]: if utils.get_current_board() in self.tablet_board_list: option += (':' if '-' in filters else '-') option += '*SensorOrientationTest/*' if any(name in filters.split('-')[0] for name in ('Camera3ModuleFixture', 'Camera3RecordingFixture')): cmd.append(self.get_recording_params()) elif 'camera_facing' in option: has_facing_option = True cmd.append(option) if has_facing_option: utils.system(cmd, timeout=cmd_timeout) else: for camera_hal_path in camera_hal_paths: logging.info('Run test with %r', camera_hal_path) cmd.append('--camera_hal_path=%s' % camera_hal_path) utils.system(cmd, timeout=cmd_timeout) cmd.pop()