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()
 |