Home | History | Annotate | Download | only in tests
      1 #!/usr/bin/env python3
      2 
      3 from __future__ import print_function
      4 
      5 import os
      6 import unittest
      7 
      8 from vndk_definition_tool import GenericRefs
      9 
     10 
     11 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
     12 
     13 
     14 class MockELF(object):
     15     # pylint: disable=too-few-public-methods
     16     def __init__(self, exported_symbols):
     17         self.exported_symbols = exported_symbols
     18 
     19 
     20 class MockLib(object):
     21     # pylint: disable=too-few-public-methods
     22     def __init__(self, path, exported_symbols):
     23         self.path = path
     24         self.elf = MockELF(exported_symbols)
     25 
     26 
     27 class GenericRefsTest(unittest.TestCase):
     28     def setUp(self):
     29         self.ref = GenericRefs()
     30         self.ref.add('/system/lib/libc.so',
     31                      MockELF({'fclose', 'fopen', 'fread', 'fwrite'}))
     32         self.ref.add('/system/lib/libm.so',
     33                      MockELF({'cos', 'sin', 'tan'}))
     34         self.ref.add('/system/lib64/libc.so',
     35                      MockELF({'fclose', 'fopen', 'fread', 'fwrite'}))
     36         self.ref.add('/system/lib64/libm.so',
     37                      MockELF({'cos', 'sin', 'tan'}))
     38 
     39 
     40     def test_create_from_sym_dir(self):
     41         input_dir = os.path.join(SCRIPT_DIR, 'testdata', 'test_generic_refs')
     42 
     43         g = GenericRefs.create_from_sym_dir(input_dir)
     44         self.assertEqual(4, len(g.refs))
     45 
     46         self.assertIn('/system/lib/libc.so', g.refs)
     47         self.assertIn('/system/lib/libm.so', g.refs)
     48         self.assertIn('/system/lib64/libc.so', g.refs)
     49         self.assertIn('/system/lib64/libm.so', g.refs)
     50 
     51         self.assertEqual({'fclose', 'fopen', 'fread', 'fwrite'},
     52                          g.refs['/system/lib/libc.so'].exported_symbols)
     53         self.assertEqual({'fclose', 'fopen', 'fread', 'fwrite'},
     54                          g.refs['/system/lib64/libc.so'].exported_symbols)
     55 
     56         self.assertEqual({'cos', 'sin', 'tan'},
     57                          g.refs['/system/lib/libm.so'].exported_symbols)
     58         self.assertEqual({'cos', 'sin', 'tan'},
     59                          g.refs['/system/lib64/libm.so'].exported_symbols)
     60 
     61 
     62     def test_classify_lib(self):
     63         libc_sub = MockLib('/system/lib/libc.so', {'fclose', 'fopen', 'fread'})
     64         libc_sup = MockLib('/system/lib/libc.so',
     65                            {'fclose', 'fopen', 'fread', 'fwrite', 'open'})
     66         libc_eq = MockLib('/system/lib/libc.so',
     67                           {'fclose', 'fopen', 'fread', 'fwrite'})
     68         libfoo = MockLib('/system/lib/libfoo.so', {})
     69 
     70         self.assertEqual(GenericRefs.MODIFIED, self.ref.classify_lib(libc_sub))
     71         self.assertEqual(GenericRefs.EXPORT_SUPER_SET,
     72                          self.ref.classify_lib(libc_sup))
     73         self.assertEqual(GenericRefs.EXPORT_EQUAL,
     74                          self.ref.classify_lib(libc_eq))
     75         self.assertEqual(GenericRefs.NEW_LIB, self.ref.classify_lib(libfoo))
     76 
     77 
     78     def test_is_equivalent_lib(self):
     79         libc_sub = MockLib('/system/lib/libc.so', {'fclose', 'fopen', 'fread'})
     80         libc_sup = MockLib('/system/lib/libc.so',
     81                            {'fclose', 'fopen', 'fread', 'fwrite', 'open'})
     82         libc_eq = MockLib('/system/lib/libc.so',
     83                           {'fclose', 'fopen', 'fread', 'fwrite'})
     84 
     85         self.assertFalse(self.ref.is_equivalent_lib(libc_sub))
     86         self.assertFalse(self.ref.is_equivalent_lib(libc_sup))
     87 
     88         self.assertTrue(self.ref.is_equivalent_lib(libc_eq))
     89 
     90 
     91     def test_has_same_name_lib(self):
     92         self.assertTrue(self.ref.has_same_name_lib(
     93             MockLib('/vendor/lib/libc.so', {})))
     94         self.assertFalse(self.ref.has_same_name_lib(
     95             MockLib('/vendor/lib/lib_does_not_exist.so', {})))
     96