You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.5 KiB
96 lines
3.5 KiB
#!/usr/bin/env python3
|
|
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import unittest
|
|
|
|
from vndk_definition_tool import GenericRefs
|
|
|
|
|
|
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
|
class MockELF(object):
|
|
# pylint: disable=too-few-public-methods
|
|
def __init__(self, exported_symbols):
|
|
self.exported_symbols = exported_symbols
|
|
|
|
|
|
class MockLib(object):
|
|
# pylint: disable=too-few-public-methods
|
|
def __init__(self, path, exported_symbols):
|
|
self.path = path
|
|
self.elf = MockELF(exported_symbols)
|
|
|
|
|
|
class GenericRefsTest(unittest.TestCase):
|
|
def setUp(self):
|
|
self.ref = GenericRefs()
|
|
self.ref.add('/system/lib/libc.so',
|
|
MockELF({'fclose', 'fopen', 'fread', 'fwrite'}))
|
|
self.ref.add('/system/lib/libm.so',
|
|
MockELF({'cos', 'sin', 'tan'}))
|
|
self.ref.add('/system/lib64/libc.so',
|
|
MockELF({'fclose', 'fopen', 'fread', 'fwrite'}))
|
|
self.ref.add('/system/lib64/libm.so',
|
|
MockELF({'cos', 'sin', 'tan'}))
|
|
|
|
|
|
def test_create_from_sym_dir(self):
|
|
input_dir = os.path.join(SCRIPT_DIR, 'testdata', 'test_generic_refs')
|
|
|
|
g = GenericRefs.create_from_sym_dir(input_dir)
|
|
self.assertEqual(4, len(g.refs))
|
|
|
|
self.assertIn('/system/lib/libc.so', g.refs)
|
|
self.assertIn('/system/lib/libm.so', g.refs)
|
|
self.assertIn('/system/lib64/libc.so', g.refs)
|
|
self.assertIn('/system/lib64/libm.so', g.refs)
|
|
|
|
self.assertEqual({'fclose', 'fopen', 'fread', 'fwrite'},
|
|
g.refs['/system/lib/libc.so'].exported_symbols)
|
|
self.assertEqual({'fclose', 'fopen', 'fread', 'fwrite'},
|
|
g.refs['/system/lib64/libc.so'].exported_symbols)
|
|
|
|
self.assertEqual({'cos', 'sin', 'tan'},
|
|
g.refs['/system/lib/libm.so'].exported_symbols)
|
|
self.assertEqual({'cos', 'sin', 'tan'},
|
|
g.refs['/system/lib64/libm.so'].exported_symbols)
|
|
|
|
|
|
def test_classify_lib(self):
|
|
libc_sub = MockLib('/system/lib/libc.so', {'fclose', 'fopen', 'fread'})
|
|
libc_sup = MockLib('/system/lib/libc.so',
|
|
{'fclose', 'fopen', 'fread', 'fwrite', 'open'})
|
|
libc_eq = MockLib('/system/lib/libc.so',
|
|
{'fclose', 'fopen', 'fread', 'fwrite'})
|
|
libfoo = MockLib('/system/lib/libfoo.so', {})
|
|
|
|
self.assertEqual(GenericRefs.MODIFIED, self.ref.classify_lib(libc_sub))
|
|
self.assertEqual(GenericRefs.EXPORT_SUPER_SET,
|
|
self.ref.classify_lib(libc_sup))
|
|
self.assertEqual(GenericRefs.EXPORT_EQUAL,
|
|
self.ref.classify_lib(libc_eq))
|
|
self.assertEqual(GenericRefs.NEW_LIB, self.ref.classify_lib(libfoo))
|
|
|
|
|
|
def test_is_equivalent_lib(self):
|
|
libc_sub = MockLib('/system/lib/libc.so', {'fclose', 'fopen', 'fread'})
|
|
libc_sup = MockLib('/system/lib/libc.so',
|
|
{'fclose', 'fopen', 'fread', 'fwrite', 'open'})
|
|
libc_eq = MockLib('/system/lib/libc.so',
|
|
{'fclose', 'fopen', 'fread', 'fwrite'})
|
|
|
|
self.assertFalse(self.ref.is_equivalent_lib(libc_sub))
|
|
self.assertFalse(self.ref.is_equivalent_lib(libc_sup))
|
|
|
|
self.assertTrue(self.ref.is_equivalent_lib(libc_eq))
|
|
|
|
|
|
def test_has_same_name_lib(self):
|
|
self.assertTrue(self.ref.has_same_name_lib(
|
|
MockLib('/vendor/lib/libc.so', {})))
|
|
self.assertFalse(self.ref.has_same_name_lib(
|
|
MockLib('/vendor/lib/lib_does_not_exist.so', {})))
|