summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac J. Manjarres <isaacmanjarres@google.com>2024-02-16 14:50:08 -0800
committerAndroid Build Cherrypicker Worker <android-build-cherrypicker-worker@google.com>2024-02-22 02:06:56 +0000
commitbd39eb285f84fff3b1ad03fef5d5edb3fa49a6d1 (patch)
tree80e6bbdcb469e1380e6d1186ab7c895bbda8aa8d
parent9f15622ef823103bc098362a2c72027275a73864 (diff)
downloadbuild-bd39eb285f84fff3b1ad03fef5d5edb3fa49a6d1.tar.gz
kleaf: Test modules.dep to ensure modules in modules.load* can be loaded
Depmod generates the modules.dep file which contains the dependencies for each module in the directory that depmod runs in. When specifying module lists, it is important that there's an entry for each module in each module list to ensure that the module's dependencies are loaded before attempting to load the module. Therefore, add a test to ensure that each module in each module list has an entry in modules.dep. Bug: 323710246 Signed-off-by: Isaac J. Manjarres <isaacmanjarres@google.com> (cherry picked from https://android-review.googlesource.com/q/commit:2cef65c72ee9d91ebbbe184a47b1186a0954a950) Merged-In: Ie6a7cb65cad336d4ccda9fa6957624448690e3c7 Change-Id: Ie6a7cb65cad336d4ccda9fa6957624448690e3c7
-rw-r--r--kleaf/artifact_tests/initramfs_modules_lists_test.py64
1 files changed, 63 insertions, 1 deletions
diff --git a/kleaf/artifact_tests/initramfs_modules_lists_test.py b/kleaf/artifact_tests/initramfs_modules_lists_test.py
index 19f14c78..4f7f4e2a 100644
--- a/kleaf/artifact_tests/initramfs_modules_lists_test.py
+++ b/kleaf/artifact_tests/initramfs_modules_lists_test.py
@@ -19,6 +19,7 @@ import sys
import tempfile
import unittest
import re
+import pathlib
from absl.testing import absltest
@@ -106,7 +107,7 @@ class InitramfsModulesLists(unittest.TestCase):
def test_diff(self):
initramfs_list = [f for f in arguments.files if os.path.basename(f) == "initramfs.img"]
- self.assertEqual(1, len(initramfs_list))
+ self.assertEqual(len(initramfs_list), 1)
initramfs = initramfs_list[0]
modules_lists_map = {}
@@ -168,6 +169,67 @@ class InitramfsModulesLists(unittest.TestCase):
if arguments.expected_modules_charger_list:
self._verify_modules_load_lists("modules.load.charger", vendor_boot_name, arguments.files)
+ def _verify_modules_dep_contains_modules_lists(self, modules_lists, modules_dir):
+ """Ensures that modules.dep contains all entries needed for modules.load*.
+
+ Given a list of modules lists, this function ensures that modules.dep
+ contains an entry for each module in all of the modules lists.
+
+ Args:
+ modules_lists: The list of modules.load* that need to be tested.
+ modules_dir: The directory in which the modules reside in.
+ """
+ modules_dep_path = pathlib.Path(modules_dir, "modules.dep")
+ modules_dep_set = set()
+
+ self.assertTrue(modules_dep_path.is_file(), f"Can't find {modules_dep_path}")
+
+ with open(modules_dep_path) as modules_dep_file:
+ for line in modules_dep_file:
+ # depmod entries have the form:
+ # mod_path: dep_path_1 dep_path_2
+ mod_name = line.split(":")[0].strip()
+ modules_dep_set.add(pathlib.Path(mod_name).name)
+
+ for mod_list in modules_lists:
+ mod_list_path = pathlib.Path(modules_dir, mod_list)
+ self.assertTrue(mod_list_path.is_file(), f"Can't find {mod_list_path}")
+ mod_list_modules = set()
+
+ with open(mod_list_path) as mod_list_file:
+ for line in mod_list_file:
+ mod_list_modules.add(pathlib.Path(line.strip()).name)
+
+ self.assertTrue(mod_list_modules.issubset(modules_dep_set),
+ "modules.dep does not contain an entry for each module to be loaded")
+
+ def test_modules_dep_contains_all_modules_lists(self):
+ initramfs_list = [file
+ for file in arguments.files
+ if pathlib.Path(file).name == "initramfs.img"]
+ self.assertEqual(len(initramfs_list), 1)
+ initramfs = initramfs_list[0]
+ modules_lists = []
+
+ if arguments.expected_modules_list:
+ modules_lists.append("modules.load")
+
+ if arguments.expected_modules_recovery_list:
+ modules_lists.append("modules.load.recovery")
+
+ if arguments.expected_modules_charger_list:
+ modules_lists.append("modules.load.charger")
+
+ with tempfile.TemporaryDirectory() as temp_dir:
+ self._decompress_initramfs(initramfs, temp_dir)
+
+ lib_modules = pathlib.Path(temp_dir, "lib/modules")
+ self.assertTrue(lib_modules.is_dir())
+
+ for kernel_version in lib_modules.iterdir():
+ modules_dir = pathlib.Path(lib_modules, kernel_version)
+ self._verify_modules_dep_contains_modules_lists(modules_lists, modules_dir)
+
if __name__ == '__main__':
arguments, unknown = load_arguments()
sys.argv[1:] = unknown