Home | History | Annotate | Download | only in tests
      1 #!/usr/bin/env python3
      2 
      3 from __future__ import print_function
      4 
      5 import os
      6 import sys
      7 import unittest
      8 
      9 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
     10 
     11 from compat import StringIO, patch
     12 from vndk_definition_tool import (ELF, ELFLinker, PT_SYSTEM, PT_VENDOR)
     13 from utils import GraphBuilder
     14 
     15 
     16 class ELFLinkerVNDKTest(unittest.TestCase):
     17     def test_normalize_partition_tags_bad_vendor_deps(self):
     18         """Check whether normalize_partition_tags() hides the dependencies from
     19         the system partition to the vendor partition if the dependencies are
     20         not SP-HAL libraries."""
     21 
     22         gb = GraphBuilder()
     23         libfwk = gb.add_lib32(PT_SYSTEM, 'libfwk', dt_needed=['libvnd.so'])
     24         libvnd = gb.add_lib32(PT_VENDOR, 'libvnd')
     25         gb.resolve()
     26 
     27         self.assertIn(libvnd, libfwk.deps_needed)
     28         self.assertIn(libfwk, libvnd.users_needed)
     29 
     30         stderr = StringIO()
     31         with patch('sys.stderr', stderr):
     32             gb.graph.normalize_partition_tags(set(), None)
     33 
     34         self.assertRegexpMatches(
     35                 stderr.getvalue(),
     36                 'error: .*: system exe/lib must not depend on vendor lib .*.  '
     37                 'Assume such dependency does not exist.')
     38 
     39         self.assertNotIn(libvnd, libfwk.deps_needed)
     40         self.assertNotIn(libfwk, libvnd.users_needed)
     41 
     42         self.assertIn(libvnd, libfwk.deps_needed_hidden)
     43         self.assertIn(libfwk, libvnd.users_needed_hidden)
     44 
     45         self.assertIn(libvnd, libfwk.deps_all)
     46         self.assertIn(libvnd, libfwk.deps_needed_all)
     47         self.assertNotIn(libvnd, libfwk.deps_good)
     48 
     49         self.assertIn(libfwk, libvnd.users_all)
     50         self.assertIn(libfwk, libvnd.users_needed_all)
     51         self.assertNotIn(libfwk, libvnd.users_good)
     52 
     53 
     54     def test_normalize_partition_tags_sp_hal(self):
     55         """Check whether normalize_partition_tags() keep dependencies to SP-HAL
     56         libraries as-is."""
     57 
     58         gb = GraphBuilder()
     59         libfwk = gb.add_lib32(PT_SYSTEM, 'libfwk', dt_needed=['libsphal.so'])
     60         libsphal = gb.add_lib32(PT_VENDOR, 'libsphal')
     61         gb.resolve()
     62 
     63         self.assertIn(libsphal, libfwk.deps_needed)
     64         self.assertIn(libfwk, libsphal.users_needed)
     65 
     66         gb.graph.normalize_partition_tags({libsphal}, None)
     67 
     68         # SP-HALs should be kept as-is.
     69         self.assertIn(libsphal, libfwk.deps_needed)
     70         self.assertIn(libfwk, libsphal.users_needed)
     71 
     72 
     73     def test_vndk(self):
     74         """Check the computation of vndk without generic references."""
     75 
     76         gb = GraphBuilder()
     77         libfwk = gb.add_lib32(PT_SYSTEM, 'libfwk')
     78         libvndk = gb.add_lib32(PT_SYSTEM, 'libvndk', extra_dir='vndk')
     79         libvndk_sp = gb.add_lib32(PT_SYSTEM, 'libutils', extra_dir='vndk-sp')
     80         libvnd = gb.add_lib32(PT_VENDOR, 'libvnd',
     81                               dt_needed=['libvndk.so', 'libutils.so'])
     82         gb.resolve()
     83 
     84         self.assertIn(libvndk, libvnd.deps_all)
     85         self.assertIn(libvndk_sp, libvnd.deps_all)
     86 
     87         vndk_sets = gb.graph.compute_degenerated_vndk(None)
     88 
     89         self.assertIn(libvndk, vndk_sets.vndk)
     90         self.assertIn(libvndk_sp, vndk_sets.vndk_sp)
     91 
     92 
     93     def test_vndk_bad_vendor_deps(self):
     94         """Check the computation of vndk without generic references."""
     95 
     96         gb = GraphBuilder()
     97         libfwk = gb.add_lib32(PT_SYSTEM, 'libfwk')
     98         libvndk = gb.add_lib32(PT_SYSTEM, 'libvndk',
     99                                dt_needed=['libvnd_bad.so'], extra_dir='vndk')
    100         libvndk_sp = gb.add_lib32(PT_SYSTEM, 'libutils',
    101                                   dt_needed=['libvnd_bad.so'],
    102                                   extra_dir='vndk-sp')
    103         libvnd = gb.add_lib32(PT_VENDOR, 'libvnd',
    104                               dt_needed=['libvndk.so', 'libutils.so'])
    105         libvnd_bad = gb.add_lib32(PT_VENDOR, 'libvnd_bad', extra_dir='vndk-sp')
    106         gb.resolve()
    107 
    108         self.assertIn(libvnd_bad, libvndk.deps_all)
    109         self.assertIn(libvnd_bad, libvndk_sp.deps_all)
    110 
    111         with patch('sys.stderr', StringIO()):
    112             vndk_sets = gb.graph.compute_degenerated_vndk(None)
    113 
    114         self.assertNotIn(libvnd_bad, vndk_sets.vndk)
    115         self.assertNotIn(libvnd_bad, vndk_sets.vndk_sp)
    116 
    117 
    118     def test_ll_ndk_indirect_without_sp_hal(self):
    119         """Check the computation of ll_ndk_indirect excludes sp_hal."""
    120 
    121         gb = GraphBuilder()
    122         libEGL = gb.add_lib32(PT_SYSTEM, 'libEGL',
    123                               dt_needed=['libEGL_dep.so'])
    124         libEGL_dep = gb.add_lib32(PT_SYSTEM, 'libEGL_dep')
    125         libEGL_chipset = gb.add_lib32(PT_VENDOR, 'libEGL_chipset',
    126                                       extra_dir='egl',
    127                                       dt_needed=['libEGL.so'])
    128         gb.resolve()
    129 
    130         libEGL.add_dlopen_dep(libEGL_chipset)
    131 
    132         vndk_sets = gb.graph.compute_degenerated_vndk(None)
    133 
    134         self.assertIn(libEGL, vndk_sets.ll_ndk)
    135         self.assertIn(libEGL_dep, vndk_sets.ll_ndk_indirect)
    136         self.assertIn(libEGL_chipset, vndk_sets.sp_hal)
    137 
    138         self.assertNotIn(libEGL_chipset, vndk_sets.ll_ndk_indirect)
    139 
    140 
    141 if __name__ == '__main__':
    142     unittest.main()
    143