def test_add(self):
        d = BannedLibDict()
        d.add('libfoo.so', 'test', BA_WARN)
        x = d.get('libfoo.so')

        self.assertIsNotNone(x)
        self.assertEqual('libfoo.so', x.name)
        self.assertEqual('test', x.reason)
        self.assertEqual(BA_WARN, x.action)
 def test_is_banned(self):
     d = BannedLibDict.create_default()
     self.assertTrue(d.is_banned('/system/lib/libbinder.so'))
     self.assertTrue(d.is_banned('/system/lib/libselinux.so'))
     self.assertTrue(d.is_banned('/system/lib64/libbinder.so'))
     self.assertTrue(d.is_banned('/system/lib64/libselinux.so'))
     self.assertFalse(d.is_banned('/system/lib64/libc.so'))
    def test_compute_vndk_cap(self):
        gb = GraphBuilder()

        # Add LL-NDK libraries.
        gb.add_multilib(PT_SYSTEM, 'libc')
        gb.add_multilib(PT_SYSTEM, 'libdl')
        gb.add_multilib(PT_SYSTEM, 'liblog')
        gb.add_multilib(PT_SYSTEM, 'libm')
        gb.add_multilib(PT_SYSTEM, 'libstdc++')
        gb.add_multilib(PT_SYSTEM, 'libz')

        # Add SP-NDK libraries.
        gb.add_multilib(PT_SYSTEM, 'libEGL')
        gb.add_multilib(PT_SYSTEM, 'libGLES_v2')

        # Add banned libraries.
        gb.add_multilib(PT_SYSTEM, 'libbinder')
        gb.add_multilib(PT_SYSTEM, 'libselinux')

        # Add good examples.
        gb.add_multilib(PT_SYSTEM, 'libgood_a', dt_needed=['libc.so'])
        gb.add_multilib(PT_SYSTEM, 'libgood_b', dt_needed=['libEGL.so'])
        gb.add_multilib(PT_SYSTEM, 'libgood_c', dt_needed=['libGLES_v2.so'])

        # Add bad examples.
        gb.add_multilib(PT_SYSTEM, 'libbad_a', dt_needed=['libbinder.so'])
        gb.add_multilib(PT_SYSTEM, 'libbad_b', dt_needed=['libselinux.so'])
        gb.add_multilib(PT_SYSTEM, 'libbad_c', dt_needed=['libbad_a.so'])
        gb.add_multilib(PT_SYSTEM, 'libbad_d', dt_needed=['libbad_c.so'])
        gb.add_multilib(PT_VENDOR, 'libbad_e', dt_needed=['libc.so'])

        gb.resolve()

        # Compute VNDK cap.
        banned_libs = BannedLibDict.create_default()
        vndk_cap = gb.graph.compute_vndk_cap(banned_libs)
        vndk_cap = set(lib.path for lib in vndk_cap)

        # Check the existence of good examples.
        self.assertIn('/system/lib/libgood_a.so', vndk_cap)
        self.assertIn('/system/lib/libgood_b.so', vndk_cap)
        self.assertIn('/system/lib/libgood_c.so', vndk_cap)

        self.assertIn('/system/lib64/libgood_a.so', vndk_cap)
        self.assertIn('/system/lib64/libgood_b.so', vndk_cap)
        self.assertIn('/system/lib64/libgood_c.so', vndk_cap)

        # Check the absence of bad examples.
        self.assertNotIn('/system/lib/libbad_a.so', vndk_cap)
        self.assertNotIn('/system/lib/libbad_b.so', vndk_cap)
        self.assertNotIn('/system/lib/libbad_c.so', vndk_cap)
        self.assertNotIn('/system/lib/libbad_d.so', vndk_cap)
        self.assertNotIn('/vendor/lib/libbad_e.so', vndk_cap)

        self.assertNotIn('/system/lib64/libbad_a.so', vndk_cap)
        self.assertNotIn('/system/lib64/libbad_b.so', vndk_cap)
        self.assertNotIn('/system/lib64/libbad_c.so', vndk_cap)
        self.assertNotIn('/system/lib64/libbad_d.so', vndk_cap)
        self.assertNotIn('/vendor/lib64/libbad_e.so', vndk_cap)

        # Check the absence of banned libraries.
        self.assertNotIn('/system/lib/libbinder.so', vndk_cap)
        self.assertNotIn('/system/lib/libselinux.so', vndk_cap)

        self.assertNotIn('/system/lib64/libbinder.so', vndk_cap)
        self.assertNotIn('/system/lib64/libselinux.so', vndk_cap)

        # Check the absence of NDK libraries.  Although LL-NDK and SP-NDK
        # libraries are not banned, they are not VNDK libraries either.
        self.assertNotIn('/system/lib/libEGL.so', vndk_cap)
        self.assertNotIn('/system/lib/libOpenGLES_v2.so', vndk_cap)
        self.assertNotIn('/system/lib/libc.so', vndk_cap)
        self.assertNotIn('/system/lib/libdl.so', vndk_cap)
        self.assertNotIn('/system/lib/liblog.so', vndk_cap)
        self.assertNotIn('/system/lib/libm.so', vndk_cap)
        self.assertNotIn('/system/lib/libstdc++.so', vndk_cap)
        self.assertNotIn('/system/lib/libz.so', vndk_cap)

        self.assertNotIn('/system/lib64/libEGL.so', vndk_cap)
        self.assertNotIn('/system/lib64/libOpenGLES_v2.so', vndk_cap)
        self.assertNotIn('/system/lib64/libc.so', vndk_cap)
        self.assertNotIn('/system/lib64/libdl.so', vndk_cap)
        self.assertNotIn('/system/lib64/liblog.so', vndk_cap)
        self.assertNotIn('/system/lib64/libm.so', vndk_cap)
        self.assertNotIn('/system/lib64/libstdc++.so', vndk_cap)
        self.assertNotIn('/system/lib64/libz.so', vndk_cap)
 def test_get(self):
     d = BannedLibDict.create_default()
     self.assertIsNotNone(d.get('libbinder.so'))
     self.assertIsNotNone(d.get('libselinux.so'))
     self.assertIsNone(d.get('libc.so'))
    def test_compute_vndk_cap(self):
        gb = GraphBuilder()

        # Add LL-NDK libraries.
        gb.add_multilib(PT_SYSTEM, 'libc')
        gb.add_multilib(PT_SYSTEM, 'libdl')
        gb.add_multilib(PT_SYSTEM, 'liblog')
        gb.add_multilib(PT_SYSTEM, 'libm')
        gb.add_multilib(PT_SYSTEM, 'libstdc++')
        gb.add_multilib(PT_SYSTEM, 'libz')

        # Add SP-NDK libraries.
        gb.add_multilib(PT_SYSTEM, 'libEGL')
        gb.add_multilib(PT_SYSTEM, 'libGLES_v2')

        # Add banned libraries.
        gb.add_multilib(PT_SYSTEM, 'libbinder')
        gb.add_multilib(PT_SYSTEM, 'libselinux')

        # Add good examples.
        gb.add_multilib(PT_SYSTEM, 'libgood_a', dt_needed=['libc.so'])
        gb.add_multilib(PT_SYSTEM, 'libgood_b', dt_needed=['libEGL.so'])
        gb.add_multilib(PT_SYSTEM, 'libgood_c', dt_needed=['libGLES_v2.so'])

        # Add bad examples.
        gb.add_multilib(PT_SYSTEM, 'libbad_a', dt_needed=['libbinder.so'])
        gb.add_multilib(PT_SYSTEM, 'libbad_b', dt_needed=['libselinux.so'])
        gb.add_multilib(PT_SYSTEM, 'libbad_c', dt_needed=['libbad_a.so'])
        gb.add_multilib(PT_SYSTEM, 'libbad_d', dt_needed=['libbad_c.so'])
        gb.add_multilib(PT_VENDOR, 'libbad_e', dt_needed=['libc.so'])

        gb.resolve()

        # Compute VNDK cap.
        banned_libs = BannedLibDict.create_default()
        vndk_cap = gb.graph.compute_vndk_cap(banned_libs)
        vndk_cap = set(lib.path for lib in vndk_cap)

        # Check the existence of good examples.
        self.assertIn('/system/lib/libgood_a.so', vndk_cap)
        self.assertIn('/system/lib/libgood_b.so', vndk_cap)
        self.assertIn('/system/lib/libgood_c.so', vndk_cap)

        self.assertIn('/system/lib64/libgood_a.so', vndk_cap)
        self.assertIn('/system/lib64/libgood_b.so', vndk_cap)
        self.assertIn('/system/lib64/libgood_c.so', vndk_cap)

        # Check the absence of bad examples.
        self.assertNotIn('/system/lib/libbad_a.so', vndk_cap)
        self.assertNotIn('/system/lib/libbad_b.so', vndk_cap)
        self.assertNotIn('/system/lib/libbad_c.so', vndk_cap)
        self.assertNotIn('/system/lib/libbad_d.so', vndk_cap)
        self.assertNotIn('/vendor/lib/libbad_e.so', vndk_cap)

        self.assertNotIn('/system/lib64/libbad_a.so', vndk_cap)
        self.assertNotIn('/system/lib64/libbad_b.so', vndk_cap)
        self.assertNotIn('/system/lib64/libbad_c.so', vndk_cap)
        self.assertNotIn('/system/lib64/libbad_d.so', vndk_cap)
        self.assertNotIn('/vendor/lib64/libbad_e.so', vndk_cap)

        # Check the absence of banned libraries.
        self.assertNotIn('/system/lib/libbinder.so', vndk_cap)
        self.assertNotIn('/system/lib/libselinux.so', vndk_cap)

        self.assertNotIn('/system/lib64/libbinder.so', vndk_cap)
        self.assertNotIn('/system/lib64/libselinux.so', vndk_cap)

        # Check the absence of NDK libraries.  Although LL-NDK and SP-NDK
        # libraries are not banned, they are not VNDK libraries either.
        self.assertNotIn('/system/lib/libEGL.so', vndk_cap)
        self.assertNotIn('/system/lib/libOpenGLES_v2.so', vndk_cap)
        self.assertNotIn('/system/lib/libc.so', vndk_cap)
        self.assertNotIn('/system/lib/libdl.so', vndk_cap)
        self.assertNotIn('/system/lib/liblog.so', vndk_cap)
        self.assertNotIn('/system/lib/libm.so', vndk_cap)
        self.assertNotIn('/system/lib/libstdc++.so', vndk_cap)
        self.assertNotIn('/system/lib/libz.so', vndk_cap)

        self.assertNotIn('/system/lib64/libEGL.so', vndk_cap)
        self.assertNotIn('/system/lib64/libOpenGLES_v2.so', vndk_cap)
        self.assertNotIn('/system/lib64/libc.so', vndk_cap)
        self.assertNotIn('/system/lib64/libdl.so', vndk_cap)
        self.assertNotIn('/system/lib64/liblog.so', vndk_cap)
        self.assertNotIn('/system/lib64/libm.so', vndk_cap)
        self.assertNotIn('/system/lib64/libstdc++.so', vndk_cap)
        self.assertNotIn('/system/lib64/libz.so', vndk_cap)