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