| #!/usr/bin/env python3 |
| |
| from __future__ import print_function |
| |
| import unittest |
| |
| from vndk_definition_tool import ( |
| DepsInsightCommand, ModuleInfo, PT_SYSTEM, PT_VENDOR) |
| |
| from .compat import StringIO, patch |
| from .utils import GraphBuilder |
| |
| |
| class DepsInsightCommandTest(unittest.TestCase): |
| _PATH_FIELD = 0 |
| _ELF_CLASS_FIELD = 1 |
| _TAGS_FIELD = 2 |
| _DEPS_FIELD = 3 |
| _USERS_FIELD = 4 |
| _SOURCE_DIRS_FIELD = 5 |
| |
| |
| @classmethod |
| def _get_module(cls, strs, mods, path): |
| for mod in mods: |
| if strs[mod[cls._PATH_FIELD]] == path: |
| return mod |
| return None |
| |
| |
| @classmethod |
| def _get_module_deps(cls, strs, mods, path): |
| mod = cls._get_module(strs, mods, path) |
| result = set() |
| for deps in mod[cls._DEPS_FIELD]: |
| result.update(strs[mods[x][cls._PATH_FIELD]] for x in deps) |
| return result |
| |
| |
| @classmethod |
| def _get_module_users(cls, strs, mods, path): |
| mod = cls._get_module(strs, mods, path) |
| users = mod[cls._USERS_FIELD] |
| return set(strs[mods[x][cls._PATH_FIELD]] for x in users) |
| |
| |
| def test_serialize_data_with_all_deps(self): |
| # compute_degenerated_vndk() should not remove bad dependencies from |
| # the output of deps-insight. This test checks the existance of bad |
| # dependencies. |
| |
| gb = GraphBuilder() |
| |
| libsystem = gb.add_lib32(PT_SYSTEM, 'libsystem') |
| |
| libsystem2 = gb.add_lib32( |
| PT_SYSTEM, 'libsystem2', dt_needed=['libsystem.so']) |
| |
| libvndk = gb.add_lib32( |
| PT_SYSTEM, 'libvndk', dt_needed=['libvendor_bad.so'], |
| extra_dir='vndk') |
| |
| libvendor = gb.add_lib32( |
| PT_VENDOR, 'libvendor', dt_needed=['libvndk.so']) |
| |
| libvendor_bad = gb.add_lib32( |
| PT_VENDOR, 'libvendor_bad', extra_dir='vndk') |
| |
| gb.resolve() |
| |
| with patch('sys.stderr', StringIO()): |
| vndk_sets = gb.graph.compute_degenerated_vndk(set(), None) |
| |
| self.assertNotIn(libvendor_bad, libvndk.deps_good) |
| |
| strs, mods = DepsInsightCommand.serialize_data( |
| list(gb.graph.all_libs()), vndk_sets, ModuleInfo()) |
| |
| # libsystem |
| deps = self._get_module_deps(strs, mods, libsystem.path) |
| self.assertFalse(deps) |
| users = self._get_module_users(strs, mods, libsystem.path) |
| self.assertIn(libsystem2.path, users) |
| |
| # libsystem2 |
| deps = self._get_module_deps(strs, mods, libsystem2.path) |
| self.assertIn(libsystem.path, deps) |
| users = self._get_module_users(strs, mods, libsystem2.path) |
| self.assertFalse(users) |
| |
| # libvndk |
| deps = self._get_module_deps(strs, mods, libvndk.path) |
| self.assertIn(libvendor_bad.path, deps) |
| users = self._get_module_users(strs, mods, libvndk.path) |
| self.assertIn(libvendor.path, users) |
| |
| # libvendor |
| deps = self._get_module_deps(strs, mods, libvendor.path) |
| self.assertIn(libvndk.path, deps) |
| users = self._get_module_users(strs, mods, libvendor.path) |
| self.assertFalse(users) |
| |
| # libvendor_bad |
| deps = self._get_module_deps(strs, mods, libvendor_bad.path) |
| self.assertFalse(deps) |
| users = self._get_module_users(strs, mods, libvendor_bad.path) |
| self.assertIn(libvndk.path, users) |