vndk-def: Compute sp-lib in compute_vndk()

This commit extracts some sp-lib related code from VNDKCommand.main()
into compute_vndk() to simplify the API.

For the unit test, we will run ELFLinker._compute_vndk() so that we can
mock SPLibResult.

Test: ./tests/run.py
Change-Id: Ic43df22a4d178b96a4228097af625b153f8cc5a3
diff --git a/vndk/tools/definition-tool/README.md b/vndk/tools/definition-tool/README.md
index 1314446..dbda891 100644
--- a/vndk/tools/definition-tool/README.md
+++ b/vndk/tools/definition-tool/README.md
@@ -88,7 +88,7 @@
 
     - The libraries will be installed to `/vendor/lib[64]/vndk-$VND-ext`
 
-10. **extra-vendor**
+10. **extra-vendor-lib**
 
     - This contains the extra libraries that have to be copied from
       `/system/lib[64]` to `/vendor/lib[64]`.
diff --git a/vndk/tools/definition-tool/tests/test_vndk.py b/vndk/tools/definition-tool/tests/test_vndk.py
index 36e9d3d..5908e5e 100755
--- a/vndk/tools/definition-tool/tests/test_vndk.py
+++ b/vndk/tools/definition-tool/tests/test_vndk.py
@@ -10,7 +10,7 @@
 
 from compat import StringIO
 from vndk_definition_tool import (ELF, ELFLinker, PT_SYSTEM, PT_VENDOR,
-                                  GenericRefs)
+                                  GenericRefs, SPLibResult)
 
 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
 TESTDATA_DIR = os.path.join(SCRIPT_DIR ,'testdata', 'test_vndk')
@@ -42,9 +42,8 @@
     def _create_graph_vndk(self, input_dir, generic_refs_dir):
         graph, generic_refs = self._create_graph_gr(input_dir, generic_refs_dir)
 
-        vndk = graph.compute_vndk(
-                sp_hals=set(),
-                vndk_stable=set(),
+        vndk = graph._compute_vndk(
+                sp_lib=SPLibResult(set(), set(), set(), set(), set()),
                 vndk_customized_for_system=set(),
                 vndk_customized_for_vendor=set(),
                 generic_refs=generic_refs,
@@ -98,9 +97,8 @@
         self.assertIsNotNone(libjpeg_64)
 
         # Compute vndk sets and move libraries to the correct directories.
-        vndk = graph.compute_vndk(
-                sp_hals=set(),
-                vndk_stable=set(),
+        vndk = graph._compute_vndk(
+                sp_lib=SPLibResult(set(), set(), set(), set(), set()),
                 vndk_customized_for_system=set(),
                 vndk_customized_for_vendor=set(),
                 generic_refs=generic_refs,
diff --git a/vndk/tools/definition-tool/vndk_definition_tool.py b/vndk/tools/definition-tool/vndk_definition_tool.py
index 681d7f8..b77d16a 100755
--- a/vndk/tools/definition-tool/vndk_definition_tool.py
+++ b/vndk/tools/definition-tool/vndk_definition_tool.py
@@ -621,7 +621,26 @@
 
 VNDKResult = collections.namedtuple(
         'VNDKResult',
-        'extra_vendor_libs vndk_core vndk_indirect vndk_fwk_ext vndk_vnd_ext')
+        'sp_hal sp_hal_dep sp_hal_vndk_stable sp_ndk sp_ndk_vndk_stable '
+        'extra_vendor_lib vndk_core vndk_indirect vndk_fwk_ext vndk_vnd_ext')
+
+def print_vndk_lib(vndk_lib, file=sys.stdout):
+    # SP-NDK and SP-HAL
+    print_sp_lib(vndk_lib, file=file)
+
+    # VNDK (framework)
+    for lib in sorted_lib_path_list(vndk_lib.vndk_core):
+        print('vndk-core:', lib, file=file)
+    for lib in sorted_lib_path_list(vndk_lib.vndk_indirect):
+        print('vndk-indirect:', lib, file=file)
+    for lib in sorted_lib_path_list(vndk_lib.vndk_fwk_ext):
+        print('vndk-fwk-ext:', lib, file=file)
+
+    # VNDK (vendor)
+    for lib in sorted_lib_path_list(vndk_lib.vndk_vnd_ext):
+        print('vndk-vnd-ext:', lib, file=file)
+    for lib in sorted_lib_path_list(vndk_lib.extra_vendor_lib):
+        print('extra-vendor-lib:', lib, file=file)
 
 
 SPLibResult = collections.namedtuple(
@@ -1168,8 +1187,23 @@
 
         return (vndk_core, vndk_fwk_ext, vndk_vnd_ext)
 
-    def compute_vndk(self, sp_hals, vndk_stable, vndk_customized_for_system,
+    def compute_vndk(self, vndk_customized_for_system,
                      vndk_customized_for_vendor, generic_refs, banned_libs):
+        return self._compute_vndk(
+                self.compute_sp_lib(generic_refs), vndk_customized_for_system,
+                vndk_customized_for_vendor, generic_refs, banned_libs)
+
+    def _compute_vndk(self, sp_lib, vndk_customized_for_system,
+                      vndk_customized_for_vendor, generic_refs, banned_libs):
+        # Compute sp-hal and vndk-stable.
+        vndk_stable = sp_lib.sp_hal_vndk_stable | sp_lib.sp_ndk_vndk_stable
+        sp_hal_closure = sp_lib.sp_hal | sp_lib.sp_hal_dep
+
+        # Normalize partition tags.  We expect many violations from the
+        # pre-Treble world.  Guess a resolution for the incorrect partition
+        # tag.
+        self.normalize_partition_tags(sp_lib.sp_hal, generic_refs)
+
         # ELF resolvers.
         VNDK_CORE_SEARCH_PATH32 = (
             '/system/lib/vndk',
@@ -1210,7 +1244,7 @@
         # Collect VNDK candidates.
         def is_not_vndk(lib):
             return (lib.is_ndk or banned_libs.is_banned(lib.path) or
-                    (lib in sp_hals) or (lib in vndk_stable))
+                    (lib in sp_hal_closure) or (lib in vndk_stable))
 
         def collect_libs_with_partition_user(lib_set, partition):
             result = set()
@@ -1227,7 +1261,7 @@
         vndk_visited = set(vndk_candidates)
 
         # Sets for missing libraries.
-        extra_vendor_libs = set()
+        extra_vendor_lib = set()
 
         def get_vndk_core_lib_name(lib):
             lib_name = os.path.basename(lib.path)
@@ -1364,7 +1398,7 @@
                 for lib in prev_vndk_candidates:
                     category = generic_refs.classify_lib(lib)
                     if category == GenericRefs.NEW_LIB:
-                        extra_vendor_libs.add(lib)
+                        extra_vendor_lib.add(lib)
                         add_deps_to_vndk_candidate(lib)
                     elif category == GenericRefs.EXPORT_EQUAL:
                         vndk_customized_candidates.add(lib)
@@ -1464,8 +1498,11 @@
             else:
                 vndk_indirect.add(lib)
 
-        return VNDKResult(extra_vendor_libs, vndk_core, vndk_indirect,
-                          vndk_fwk_ext, vndk_vnd_ext)
+        return VNDKResult(
+                sp_lib.sp_hal, sp_lib.sp_hal_dep, sp_lib.sp_hal_vndk_stable,
+                sp_lib.sp_ndk, sp_lib.sp_ndk_vndk_stable,
+                extra_vendor_lib, vndk_core, vndk_indirect,
+                vndk_fwk_ext, vndk_vnd_ext)
 
     def compute_vndk_cap(self, banned_libs):
         # ELF files on vendor partitions are banned unconditionally.  ELF files
@@ -1820,17 +1857,6 @@
         if args.warn_banned_vendor_lib_deps:
             self._warn_banned_vendor_lib_deps(graph, banned_libs)
 
-        # Compute sp-hal and vndk-stable.
-        sp_lib = graph.compute_sp_lib(generic_refs)
-
-        vndk_stable = sp_lib.sp_hal_vndk_stable | sp_lib.sp_ndk_vndk_stable
-        sp_hal_closure = sp_lib.sp_hal | sp_lib.sp_hal_dep
-
-        # Normalize partition tags.  We expect many violations from the
-        # pre-Treble world.  Guess a resolution for the incorrect partition
-        # tag.
-        graph.normalize_partition_tags(sp_lib.sp_hal, generic_refs)
-
         # User may specify the partition for outward-customized vndk libs.  The
         # following code converts the path into ELFLinkData.
         vndk_customized_for_system = set()
@@ -1854,32 +1880,17 @@
                         args.outward_customization_for_vendor, lambda x: None))
 
         # Compute vndk heuristics.
-        vndk = graph.compute_vndk(
-                sp_hal_closure, vndk_stable, vndk_customized_for_system,
-                vndk_customized_for_vendor, generic_refs, banned_libs)
+        vndk_lib = graph.compute_vndk(vndk_customized_for_system,
+                                      vndk_customized_for_vendor, generic_refs,
+                                      banned_libs)
 
         if args.warn_high_level_ndk_deps:
             self._warn_high_level_ndk_deps(
-                    (vndk.vndk_core, vndk.vndk_indirect, vndk.vndk_fwk_ext,
-                     vndk.vndk_vnd_ext))
+                    (vndk_lib.vndk_core, vndk_lib.vndk_indirect,
+                     vndk_lib.vndk_fwk_ext, vndk_lib.vndk_vnd_ext))
 
-        # SP-NDK and SP-HAL
-        print_sp_lib(sp_lib)
-
-        # VNDK (framework)
-        for lib in sorted_lib_path_list(vndk.vndk_core):
-            print('vndk-core:', lib)
-        for lib in sorted_lib_path_list(vndk.vndk_indirect):
-            print('vndk-indirect:', lib)
-        for lib in sorted_lib_path_list(vndk.vndk_fwk_ext):
-            print('vndk-fwk-ext:', lib)
-
-        # VNDK (vendor)
-        for lib in sorted_lib_path_list(vndk.vndk_vnd_ext):
-            print('vndk-vnd-ext:', lib)
-        for lib in sorted_lib_path_list(vndk.extra_vendor_libs):
-            print('extra-vendor-lib:', lib)
-
+        # Print results.
+        print_vndk_lib(vndk_lib)
         return 0