131 lines
5.0 KiB
Python
131 lines
5.0 KiB
Python
# 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()
|