#!/usr/bin/env python3 from __future__ import print_function import os import sys import unittest sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from compat import StringIO, patch from vndk_definition_tool import ( DepsInsightCommand, ModuleInfo, PT_SYSTEM, PT_VENDOR) 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() libfwk = gb.add_lib32(PT_SYSTEM, 'libfwk') libvndk = gb.add_lib32(PT_SYSTEM, 'libvndk', dt_needed=['libvnd_bad.so'], extra_dir='vndk') libvndk_sp = gb.add_lib32(PT_SYSTEM, 'libutils', dt_needed=['libvnd_bad.so'], extra_dir='vndk-sp') libvnd = gb.add_lib32(PT_VENDOR, 'libvnd', dt_needed=['libvndk.so', 'libutils.so']) libvnd_bad = gb.add_lib32(PT_VENDOR, 'libvnd_bad', extra_dir='vndk-sp') gb.resolve() with patch('sys.stderr', StringIO()): vndk_sets = gb.graph.compute_degenerated_vndk(set(), None) self.assertNotIn(libvnd_bad, libvndk.deps_good) self.assertNotIn(libvnd_bad, libvndk_sp.deps_good) strs, mods = DepsInsightCommand.serialize_data( list(gb.graph.all_libs()), vndk_sets, ModuleInfo()) deps = self._get_module_deps(strs, mods, libvndk.path) self.assertIn(libvnd_bad.path, deps) deps = self._get_module_deps(strs, mods, libvndk_sp.path) self.assertIn(libvnd_bad.path, deps) users = self._get_module_users(strs, mods, libvnd_bad.path) self.assertIn(libvndk.path, users) self.assertIn(libvndk_sp.path, users) if __name__ == '__main__': unittest.main()