Home | History | Annotate | Download | only in iface_fuzzer_test
      1 #!/usr/bin/env python
      2 #
      3 # Copyright (C) 2017 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the 'License');
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an 'AS IS' BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 #
     17 
     18 import logging
     19 import os
     20 
     21 from vts.runners.host import keys
     22 from vts.runners.host import test_runner
     23 from vts.utils.python.controllers import adb
     24 from vts.utils.python.controllers import android_device
     25 from vts.utils.python.common import vts_spec_utils
     26 
     27 from vts.testcases.fuzz.template.libfuzzer_test import libfuzzer_test_config as config
     28 from vts.testcases.fuzz.template.libfuzzer_test import libfuzzer_test_case
     29 from vts.testcases.fuzz.template.func_fuzzer_test import func_fuzzer_test
     30 
     31 
     32 class IfaceFuzzerTest(func_fuzzer_test.FuncFuzzerTest):
     33     """Runs iface_fuzzer tests on target.
     34 
     35     Attributes:
     36         See func_fuzzer_test.
     37     """
     38     _VTS_SPEC_DIR_TARGET = os.path.join(config.FUZZER_TEST_DIR, 'spec')
     39 
     40     def _PushVtsResources(self, hal_name, hal_version):
     41         """Pushes resources needed for test to target device.
     42 
     43         Args:
     44             hal_name: string, name of the hal, e.g. 'vibrator'.
     45             hal_version: string, version of the hal, e.g '7.4'
     46         """
     47         # Push .vts spec files.
     48         hal_name_dir = vts_spec_utils.HalNameDir(hal_name)
     49         src_dir = os.path.join(self.data_file_path, 'spec', 'hardware',
     50                                'interfaces', hal_name_dir, hal_version, 'vts')
     51         dst_dir = os.path.join(self._VTS_SPEC_DIR_TARGET, hal_name_dir,
     52                                hal_version)
     53 
     54         # Push corresponding VTS drivers.
     55         driver_name = 'android.hardware.%s@%s-vts.driver.so' % (hal_name,
     56                                                                 hal_version)
     57         asan_path = os.path.join(self.data_file_path, 'DATA', 'asan', 'system')
     58         driver32 = os.path.join(asan_path, 'lib', driver_name)
     59         driver64 = os.path.join(asan_path, 'lib64', driver_name)
     60         try:
     61             self._dut.adb.push(src_dir, dst_dir)
     62             self._dut.adb.push(driver32, 'data/local/tmp/32')
     63             self._dut.adb.push(driver64, 'data/local/tmp/64')
     64         except adb.AdbError as e:
     65             logging.exception(e)
     66 
     67     def _VtsSpecDirsTarget(self, hal_name, hal_version):
     68         """Returns a list of directories on target with .vts specs.
     69 
     70         Args:
     71             hal_name: string, name of the hal, e.g. 'vibrator'.
     72             hal_version: string, version of the hal, e.g '7.4'
     73 
     74         Returns:
     75             string list, directories on target
     76         """
     77         hal_name_dir = vts_spec_utils.HalNameDir(hal_name)
     78         spec_dirs = [os.path.join(self._VTS_SPEC_DIR_TARGET, hal_name_dir,
     79                                   hal_version)]
     80 
     81         imported_hals = self._vts_spec_parser.ImportedHals(hal_name,
     82                                                            hal_version)
     83         for name, version in imported_hals:
     84             spec_dirs.append(
     85                 os.path.join(self._VTS_SPEC_DIR_TARGET,
     86                              vts_spec_utils.HalNameDir(name), version))
     87         return spec_dirs
     88 
     89     # Override
     90     def CreateTestCases(self):
     91         """See base class."""
     92         hal_package = self.hal_hidl_package_name
     93         hal_name, hal_version = vts_spec_utils.HalPackageToNameAndVersion(
     94             hal_package)
     95 
     96         imported_hals = self._vts_spec_parser.IndirectImportedHals(hal_name,
     97                                                                    hal_version)
     98         self._PushVtsResources(hal_name, hal_version)
     99         for name, version in imported_hals:
    100             self._PushVtsResources(name, version)
    101 
    102         registered_interfaces = self._RegisteredInterfaces(hal_package)
    103         spec_dirs = ':'.join(self._VtsSpecDirsTarget(hal_name, hal_version))
    104 
    105         test_cases = []
    106         for iface in registered_interfaces:
    107             additional_params = {
    108                 'vts_spec_dir': spec_dirs,
    109                 'vts_exec_size': 16,
    110                 'vts_target_iface': iface,
    111             }
    112             libfuzzer_params = config.FUZZER_DEFAULT_PARAMS.copy()
    113             libfuzzer_params.update({
    114                 'max_len': 16777216,
    115                 'max_total_time': 600,
    116             })
    117             bin_host_path = os.path.join(self.data_file_path, 'DATA', 'bin',
    118                                          'vts_proto_fuzzer')
    119             test_case = libfuzzer_test_case.LibFuzzerTestCase(
    120                 bin_host_path, libfuzzer_params, additional_params)
    121             test_case.test_name = iface
    122             test_cases.append(test_case)
    123 
    124         return test_cases
    125 
    126     # Override
    127     def LogCrashReport(self, test_case):
    128         """See base class."""
    129         # Re-run the failing test case in debug mode.
    130         logging.info('Attempting to reproduce the failure.')
    131         repro_cmd = '"%s %s"' % (test_case.GetRunCommand(debug_mode=True),
    132                                  config.FUZZER_TEST_CRASH_REPORT)
    133         self._dut.adb.shell(repro_cmd, no_except=True)
    134 
    135 
    136 if __name__ == '__main__':
    137     test_runner.main()
    138