#!/usr/bin/env python3
from __future__ import print_function
from vndk_definition_tool import (PT_SYSTEM, PT_VENDOR)
from .compat import StringIO, TestCase, patch
from .utils import GraphBuilder
class ELFLinkerVNDKTest(TestCase):
def test_normalize_partition_tags_bad_vendor_deps(self):
"""Check whether normalize_partition_tags() hides the dependencies from
the system partition to the vendor partition if the dependencies are
not SP-HAL libraries."""
gb = GraphBuilder()
libfwk = gb.add_lib32(PT_SYSTEM, 'libfwk', dt_needed=['libvnd.so'])
libvnd = gb.add_lib32(PT_VENDOR, 'libvnd')
gb.resolve()
self.assertIn(libvnd, libfwk.deps_needed)
self.assertIn(libfwk, libvnd.users_needed)
stderr = StringIO()
with patch('sys.stderr', stderr):
gb.graph.normalize_partition_tags(set(), None)
self.assertRegex(
stderr.getvalue(),
'error: .*: system exe/lib must not depend on vendor lib .*. '
'Assume such dependency does not exist.')
self.assertNotIn(libvnd, libfwk.deps_needed)
self.assertNotIn(libfwk, libvnd.users_needed)
self.assertIn(libvnd, libfwk.deps_needed_hidden)
self.assertIn(libfwk, libvnd.users_needed_hidden)
self.assertIn(libvnd, libfwk.deps_all)
self.assertIn(libvnd, libfwk.deps_needed_all)
self.assertNotIn(libvnd, libfwk.deps_good)
self.assertIn(libfwk, libvnd.users_all)
self.assertIn(libfwk, libvnd.users_needed_all)
self.assertNotIn(libfwk, libvnd.users_good)
def test_normalize_partition_tags_sp_hal(self):
"""Check whether normalize_partition_tags() keep dependencies to SP-HAL
libraries as-is."""
gb = GraphBuilder()
libfwk = gb.add_lib32(PT_SYSTEM, 'libfwk', dt_needed=['libsphal.so'])
libsphal = gb.add_lib32(PT_VENDOR, 'libsphal')
gb.resolve()
self.assertIn(libsphal, libfwk.deps_needed)
self.assertIn(libfwk, libsphal.users_needed)
gb.graph.normalize_partition_tags({libsphal}, None)
# SP-HALs should be kept as-is.
self.assertIn(libsphal, libfwk.deps_needed)
self.assertIn(libfwk, libsphal.users_needed)
def test_vndk(self):
"""Check the computation of vndk without generic references."""
gb = GraphBuilder()
gb.add_lib32(PT_SYSTEM, 'libfwk')
libvndk = gb.add_lib32(PT_SYSTEM, 'libvndk', extra_dir='vndk')
libvndk_sp = gb.add_lib32(PT_SYSTEM, 'libutils', extra_dir='vndk-sp')
libvnd = gb.add_lib32(PT_VENDOR, 'libvnd',
dt_needed=['libvndk.so', 'libutils.so'])
gb.resolve()
self.assertIn(libvndk, libvnd.deps_all)
self.assertIn(libvndk_sp, libvnd.deps_all)
vndk_sets = gb.graph.compute_degenerated_vndk(None)
self.assertIn(libvndk, vndk_sets.vndk)
self.assertIn(libvndk_sp, vndk_sets.vndk_sp)
def test_vndk_bad_vendor_deps(self):
"""Check the computation of vndk without generic references."""
gb = GraphBuilder()
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_bad = gb.add_lib32(PT_VENDOR, 'libvnd_bad', extra_dir='vndk-sp')
gb.resolve()
self.assertIn(libvnd_bad, libvndk.deps_all)
self.assertIn(libvnd_bad, libvndk_sp.deps_all)
with patch('sys.stderr', StringIO()):
vndk_sets = gb.graph.compute_degenerated_vndk(None)
self.assertNotIn(libvnd_bad, vndk_sets.vndk)
self.assertNotIn(libvnd_bad, vndk_sets.vndk_sp)
def test_ll_ndk_indirect_without_sp_hal(self):
"""Check the computation of ll_ndk_indirect excludes sp_hal."""
gb = GraphBuilder()
libEGL = gb.add_lib32(PT_SYSTEM, 'libEGL',
dt_needed=['libEGL_dep.so'])
libEGL_dep = gb.add_lib32(PT_SYSTEM, 'libEGL_dep')
libEGL_chipset = gb.add_lib32(PT_VENDOR, 'libEGL_chipset',
extra_dir='egl',
dt_needed=['libEGL.so'])
gb.resolve()
libEGL.add_dlopen_dep(libEGL_chipset)
vndk_sets = gb.graph.compute_degenerated_vndk(None)
self.assertIn(libEGL, vndk_sets.ll_ndk)
self.assertIn(libEGL_dep, vndk_sets.ll_ndk_indirect)
self.assertIn(libEGL_chipset, vndk_sets.sp_hal)
self.assertNotIn(libEGL_chipset, vndk_sets.ll_ndk_indirect)