Home | History | Annotate | Download | only in camera_HAL3
      1 # Copyright 2017 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """A test which verifies the camera function with HAL3 interface."""
      6 
      7 import contextlib
      8 import json
      9 import logging
     10 import os
     11 import xml.etree.ElementTree
     12 from autotest_lib.client.bin import test, utils
     13 from autotest_lib.client.common_lib import error
     14 from autotest_lib.client.cros import service_stopper
     15 from autotest_lib.client.cros.camera import camera_utils
     16 from autotest_lib.client.cros.video import device_capability
     17 from sets import Set
     18 
     19 
     20 class camera_HAL3(test.test):
     21     """
     22     This test is a wrapper of the test binary cros_camera_test.
     23     """
     24 
     25     version = 1
     26     test_binary = 'cros_camera_test'
     27     dep = 'camera_hal3'
     28     cros_camera_service = 'cros-camera'
     29     media_profiles_path = os.path.join('vendor', 'etc', 'media_profiles.xml')
     30     tablet_board_list = ['scarlet', 'nocturne']
     31     test_config_path = '/var/cache/camera/test_config.json'
     32 
     33     def setup(self):
     34         """
     35         Run common setup steps.
     36         """
     37         self.dep_dir = os.path.join(self.autodir, 'deps', self.dep)
     38         self.job.setup_dep([self.dep])
     39         logging.debug('mydep is at %s', self.dep_dir)
     40 
     41     @contextlib.contextmanager
     42     def set_test_config(self, test_config):
     43         with open(self.test_config_path, 'w') as fp:
     44             json.dump(test_config, fp)
     45         yield
     46         os.remove(self.test_config_path)
     47 
     48     def get_recording_params(self):
     49         """
     50         Get recording parameters from media profiles
     51         """
     52         xml_content = utils.system_output([
     53             'android-sh', '-c',
     54             'cat "%s"' % utils.sh_escape(self.media_profiles_path)
     55         ])
     56         root = xml.etree.ElementTree.fromstring(xml_content)
     57         recording_params = Set()
     58         for camcorder_profiles in root.findall('CamcorderProfiles'):
     59             for encoder_profile in camcorder_profiles.findall('EncoderProfile'):
     60                 video = encoder_profile.find('Video')
     61                 recording_params.add('%s:%s:%s:%s' % (
     62                     camcorder_profiles.get('cameraId'), video.get('width'),
     63                     video.get('height'), video.get('frameRate')))
     64         return '--recording_params=' + ','.join(recording_params)
     65 
     66     def run_once(self,
     67                  cmd_timeout=600,
     68                  camera_hals=None,
     69                  options=None,
     70                  capability=None,
     71                  test_config=None):
     72         """
     73         Entry point of this test.
     74 
     75         @param cmd_timeout: Seconds. Timeout for running the test command.
     76         @param camera_hals: The camera HALs to be tested. e.g. ['usb.so']
     77         @param options: Option strings passed to test command. e.g. ['--v=1']
     78         @param capability: Capability required for executing this test.
     79         """
     80         if options is None:
     81             options = []
     82 
     83         if test_config is None:
     84             test_config = {}
     85 
     86         if capability:
     87             device_capability.DeviceCapability().ensure_capability(capability)
     88 
     89         self.job.install_pkg(self.dep, 'dep', self.dep_dir)
     90 
     91         camera_hal_paths = camera_utils.get_camera_hal_paths_for_test()
     92         if camera_hals is not None:
     93             name_map = dict((os.path.basename(path), path)
     94                             for path in camera_hal_paths)
     95             camera_hal_paths = []
     96             for name in camera_hals:
     97                 path = name_map.get(name)
     98                 if path is None:
     99                     msg = 'HAL %r is not available for test' % name
    100                     raise error.TestNAError(msg)
    101                 camera_hal_paths.append(path)
    102 
    103         binary_path = os.path.join(self.dep_dir, 'bin', self.test_binary)
    104 
    105         with service_stopper.ServiceStopper([self.cros_camera_service]), \
    106                 self.set_test_config(test_config):
    107             has_facing_option = False
    108             cmd = [binary_path]
    109             for option in options:
    110                 if 'gtest_filter' in option:
    111                     filters = option.split('=')[1]
    112                     if 'Camera3DeviceTest' in filters.split('-')[0]:
    113                         if utils.get_current_board() in self.tablet_board_list:
    114                             option += (':' if '-' in filters else '-')
    115                             option += '*SensorOrientationTest/*'
    116                     if any(name in filters.split('-')[0] for name in
    117                            ('Camera3ModuleFixture', 'Camera3RecordingFixture')):
    118                         cmd.append(self.get_recording_params())
    119                 elif 'camera_facing' in option:
    120                     has_facing_option = True
    121                 cmd.append(option)
    122 
    123             if has_facing_option:
    124                 utils.system(cmd, timeout=cmd_timeout)
    125             else:
    126                 for camera_hal_path in camera_hal_paths:
    127                     logging.info('Run test with %r', camera_hal_path)
    128                     cmd.append('--camera_hal_path=%s' % camera_hal_path)
    129                     utils.system(cmd, timeout=cmd_timeout)
    130                     cmd.pop()
    131