import platform import subprocess import sys import unittest from ekernel import Kernel from tests import capture_stderr, Interceptor import tests.data.kernel as data import ekernel def run (*argv): return ekernel.install(list(argv)) class Tests (unittest.TestCase): def setUp (self): # setup test environment data.setup() self.kernel = Kernel.latest() self.kernel.bzImage.touch() self.current = Kernel.current() # start interceptor @data.efi def run (tracer, *args, **kwargs): if args[0][0] == "findmnt": return subprocess.CompletedProcess("", 0, b"/dev/sda1") elif args[0][0] == "eselect": data.linux.unlink() data.linux.symlink_to(self.kernel.src.name) def release (tracer, *args, **kwargs): return f"{self.current.version.base_version}-gentoo" self.interceptor = Interceptor() self.interceptor.add(subprocess.run, call=run) self.interceptor.add(platform.release, call=release) self.interceptor.start() def tearDown (self): # stop interceptor self.interceptor.stop() def check_install (self, backup=False): trace_it = iter(self.interceptor.trace) # efibootmgr tracer, (args, kwargs) = next(trace_it) self.assertEqual(tracer.name, "subprocess.run") self.assertEqual(args, (["efibootmgr"],)) self.assertEqual(kwargs, {"capture_output": True, "check": True}) # mount tracer, (args, kwargs) = next(trace_it) self.assertEqual(tracer.name, "subprocess.run") self.assertEqual(args, (["mount", "/boot"],)) self.assertEqual(kwargs, {"capture_output": True, "check": True}) # eselect kernel set tracer, (args, kwargs) = next(trace_it) self.assertEqual(tracer.name, "subprocess.run") self.assertEqual( args, (["eselect", "kernel", "set", self.kernel.src.name],) ) self.assertEqual(kwargs, {"check": True}) self.assertEqual(str(data.linux.readlink()), self.kernel.src.name) # make modules_install tracer, (args, kwargs) = next(trace_it) self.assertEqual(tracer.name, "subprocess.run") self.assertEqual(args, (["make", "modules_install"],)) self.assertEqual(kwargs, {"check": True}) # emerge @module-rebuild tracer, (args, kwargs) = next(trace_it) self.assertEqual(tracer.name, "subprocess.run") self.assertEqual(args, (["emerge", "-q", "@module-rebuild"],)) self.assertEqual(kwargs, {"check": True}) if backup: if data.boot.read_bytes() == b"missing image": # platform.release tracer, (args, kwargs) = next(trace_it) self.assertEqual(tracer.name, "platform.release") # findmnt -rno SOURCE tracer, (args, kwargs) = next(trace_it) self.assertEqual(tracer.name, "subprocess.run") self.assertEqual(args, (["findmnt", "-rno", "SOURCE", "/tmp"],)) self.assertEqual(kwargs, {"capture_output": True, "check": True}) # efibootmgr -b 0003 -B tracer, (args, kwargs) = next(trace_it) self.assertEqual(tracer.name, "subprocess.run") self.assertEqual(args, (["efibootmgr", "-q", "-b", "0003", "-B"],)) self.assertEqual(kwargs, {"check": True}) # efibootmgr -c -d -p -L