vndk-def: Cleanup ELF linker test cases.

Test: ./tests/run.py

Change-Id: I219fba79224b547f47b9fef3aac808e9c9d22eab
This commit is contained in:
Logan Chien
2017-02-20 15:56:24 +08:00
parent 94acf17619
commit 32d21642db

View File

@@ -11,7 +11,8 @@ import unittest
from compat import StringIO
from vndk_definition_tool import ELF, ELFLinker, PT_SYSTEM, PT_VENDOR
class ELFLinkerTest(unittest.TestCase):
class GraphBuilder(object):
_PARTITION_NAMES = {
PT_SYSTEM: 'system',
PT_VENDOR: 'vendor',
@@ -22,60 +23,96 @@ class ELFLinkerTest(unittest.TestCase):
ELF.ELFCLASS64: 'lib64',
}
def _create_elf(self, partition, klass, name, dt_needed, exported_symbols):
def __init__(self):
self.graph = ELFLinker()
def add_lib(self, partition, klass, name, dt_needed, exported_symbols,
imported_symbols):
"""Create and add a shared library to ELFLinker."""
elf = ELF(klass, ELF.ELFDATA2LSB, dt_needed=dt_needed,
exported_symbols=exported_symbols)
exported_symbols=exported_symbols,
imported_symbols=imported_symbols)
setattr(self, 'elf' + elf.elf_class_name + '_' + name, elf)
path = os.path.join('/', self._PARTITION_NAMES[partition],
self._LIB_DIRS[klass], name + '.so')
self.graph.add(partition, path, elf)
def _create_elfs(self, partition, name, dt_needed, exported_symbols):
for klass in (ELF.ELFCLASS32, ELF.ELFCLASS64):
self._create_elf(partition, klass, name, dt_needed,
exported_symbols)
def add_multilib(self, partition, name, dt_needed, exported_symbols,
imported_symbols):
"""Add 32-bit / 64-bit shared libraries to ELFLinker."""
def setUp(self):
self.graph = ELFLinker()
self._create_elfs(PT_SYSTEM, 'libdl', dt_needed=[],
exported_symbols={'dlclose', 'dlopen', 'dlsym'})
self._create_elfs(PT_SYSTEM, 'libm', dt_needed=[],
exported_symbols={'cos', 'sin'})
self._create_elfs(PT_SYSTEM, 'libc', dt_needed=['libdl.so', 'libm.so'],
exported_symbols={'fclose', 'fopen', 'fread'})
self._create_elfs(PT_SYSTEM, 'libRS', dt_needed=['libdl.so'],
exported_symbols={'rsContextCreate'})
self._create_elfs(PT_SYSTEM, 'libcutils',
dt_needed=['libc.so', 'libdl.so'],
exported_symbols={})
self._create_elfs(PT_VENDOR, 'libEGL',
dt_needed=['libc.so', 'libcutils.so', 'libdl.so'],
exported_symbols={'eglGetDisplay'})
for klass in (ELF.ELFCLASS32, ELF.ELFCLASS64):
self.add_lib(partition, klass, name, dt_needed,
exported_symbols, imported_symbols)
def resolve(self):
self.graph.resolve_deps()
def test_map_path_to_lib(self):
node = self.graph.map_path_to_lib('/system/lib/libc.so')
self.assertEqual(self.elf32_libc, node.elf)
self.assertEqual('/system/lib/libc.so', node.path)
node = self.graph.map_path_to_lib('/system/lib64/libdl.so')
self.assertEqual(self.elf64_libdl, node.elf)
self.assertEqual('/system/lib64/libdl.so', node.path)
class ELFLinkerTest(unittest.TestCase):
def _create_normal_graph(self):
gb = GraphBuilder()
node = self.graph.map_path_to_lib('/vendor/lib64/libEGL.so')
self.assertEqual(self.elf64_libEGL, node.elf)
self.assertEqual('/vendor/lib64/libEGL.so', node.path)
gb.add_multilib(PT_SYSTEM, 'libdl', dt_needed=[],
exported_symbols={'dlclose', 'dlopen', 'dlsym'},
imported_symbols={})
self.assertEqual(None, self.graph.map_path_to_lib('/no/such/path.so'))
gb.add_multilib(PT_SYSTEM, 'libm', dt_needed=[],
exported_symbols={'cos', 'sin'},
imported_symbols={})
gb.add_multilib(PT_SYSTEM, 'libc', dt_needed=['libdl.so', 'libm.so'],
exported_symbols={'fclose', 'fopen', 'fread'},
imported_symbols={'dlclose', 'dlopen', 'cos', 'sin'})
gb.add_multilib(PT_SYSTEM, 'libRS', dt_needed=['libdl.so'],
exported_symbols={'rsContextCreate'},
imported_symbols={'dlclose', 'dlopen', 'dlsym'})
gb.add_multilib(PT_SYSTEM, 'libcutils',
dt_needed=['libc.so', 'libdl.so'],
exported_symbols={},
imported_symbols={'dlclose', 'dlopen', 'fclose',
'fopen'})
gb.add_multilib(PT_VENDOR, 'libEGL',
dt_needed=['libc.so', 'libcutils.so', 'libdl.so'],
exported_symbols={'eglGetDisplay'},
imported_symbols={'fclose', 'fopen'})
gb.resolve()
return gb
def _get_paths_from_nodes(self, nodes):
return sorted([node.path for node in nodes])
def test_map_path_to_lib(self):
gb = self._create_normal_graph()
graph = gb.graph
node = graph.map_path_to_lib('/system/lib/libc.so')
self.assertEqual(gb.elf32_libc, node.elf)
self.assertEqual('/system/lib/libc.so', node.path)
node = graph.map_path_to_lib('/system/lib64/libdl.so')
self.assertEqual(gb.elf64_libdl, node.elf)
self.assertEqual('/system/lib64/libdl.so', node.path)
node = graph.map_path_to_lib('/vendor/lib64/libEGL.so')
self.assertEqual(gb.elf64_libEGL, node.elf)
self.assertEqual('/vendor/lib64/libEGL.so', node.path)
self.assertEqual(None, graph.map_path_to_lib('/no/such/path.so'))
def test_map_paths_to_libs(self):
gb = self._create_normal_graph()
graph = gb.graph
bad = []
paths = ['/system/lib/libc.so', '/system/lib/libdl.so']
nodes = self.graph.map_paths_to_libs(paths, lambda x: bad.append(x))
nodes = graph.map_paths_to_libs(paths, bad.append)
self.assertEqual([], bad)
self.assertEqual(2, len(nodes))
@@ -83,56 +120,76 @@ class ELFLinkerTest(unittest.TestCase):
bad = []
paths = ['/no/such/path.so', '/system/lib64/libdl.so']
nodes = self.graph.map_paths_to_libs(paths, lambda x: bad.append(x))
nodes = graph.map_paths_to_libs(paths, bad.append)
self.assertEqual(['/no/such/path.so'], bad)
self.assertEqual(['/system/lib64/libdl.so'],
self._get_paths_from_nodes(nodes))
def test_elf_class(self):
self.assertEqual(6, len(self.graph.lib32))
self.assertEqual(6, len(self.graph.lib64))
gb = self._create_normal_graph()
graph = gb.graph
self.assertEqual(6, len(graph.lib32))
self.assertEqual(6, len(graph.lib64))
def test_partitions(self):
self.assertEqual(10, len(self.graph.lib_pt[PT_SYSTEM]))
self.assertEqual(2, len(self.graph.lib_pt[PT_VENDOR]))
gb = self._create_normal_graph()
graph = gb.graph
self.assertEqual(10, len(gb.graph.lib_pt[PT_SYSTEM]))
self.assertEqual(2, len(gb.graph.lib_pt[PT_VENDOR]))
def test_deps(self):
libc_32 = self.graph.map_path_to_lib('/system/lib/libc.so')
gb = self._create_normal_graph()
graph = gb.graph
# Check the dependencies of libc.so.
node = gb.graph.map_path_to_lib('/system/lib/libc.so')
self.assertEqual(['/system/lib/libdl.so', '/system/lib/libm.so'],
self._get_paths_from_nodes(libc_32.deps))
self._get_paths_from_nodes(node.deps))
libRS_64 = self.graph.map_path_to_lib('/system/lib64/libRS.so')
# Check the dependencies of libRS.so.
node = gb.graph.map_path_to_lib('/system/lib64/libRS.so')
self.assertEqual(['/system/lib64/libdl.so'],
self._get_paths_from_nodes(libRS_64.deps))
self._get_paths_from_nodes(node.deps))
libEGL_64 = self.graph.map_path_to_lib('/vendor/lib64/libEGL.so')
# Check the dependencies of libEGL.so.
node = gb.graph.map_path_to_lib('/vendor/lib64/libEGL.so')
self.assertEqual(['/system/lib64/libc.so', '/system/lib64/libcutils.so',
'/system/lib64/libdl.so'],
self._get_paths_from_nodes(libEGL_64.deps))
self._get_paths_from_nodes(node.deps))
def test_users(self):
libc_32 = self.graph.map_path_to_lib('/system/lib/libc.so')
self.assertEqual(['/system/lib/libcutils.so', '/vendor/lib/libEGL.so'],
self._get_paths_from_nodes(libc_32.users))
gb = self._create_normal_graph()
graph = gb.graph
libdl_32 = self.graph.map_path_to_lib('/system/lib/libdl.so')
# Check the users of libc.so.
node = graph.map_path_to_lib('/system/lib/libc.so')
self.assertEqual(['/system/lib/libcutils.so', '/vendor/lib/libEGL.so'],
self._get_paths_from_nodes(node.users))
# Check the users of libdl.so.
node = graph.map_path_to_lib('/system/lib/libdl.so')
self.assertEqual(['/system/lib/libRS.so', '/system/lib/libc.so',
'/system/lib/libcutils.so', '/vendor/lib/libEGL.so'],
self._get_paths_from_nodes(libdl_32.users))
self._get_paths_from_nodes(node.users))
libRS_64 = self.graph.map_path_to_lib('/system/lib64/libRS.so')
self.assertEqual([], self._get_paths_from_nodes(libRS_64.users))
# Check the users of libRS.so.
node = graph.map_path_to_lib('/system/lib64/libRS.so')
self.assertEqual([], self._get_paths_from_nodes(node.users))
libEGL_64 = self.graph.map_path_to_lib('/vendor/lib64/libEGL.so')
self.assertEqual([], self._get_paths_from_nodes(libEGL_64.users))
# Check the users of libEGL.so.
node = graph.map_path_to_lib('/vendor/lib64/libEGL.so')
self.assertEqual([], self._get_paths_from_nodes(node.users))
def test_compute_vndk_libs(self):
gb = self._create_normal_graph()
graph = gb.graph
class MockBannedLibs(object):
def get(self, name):
return None
vndk_core, vndk_indirect, vndk_ext = \
self.graph.compute_vndk_libs(None, MockBannedLibs())
graph.compute_vndk_libs(None, MockBannedLibs())
self.assertEqual(['/system/lib/libcutils.so',
'/system/lib64/libcutils.so'],