2024-06-09 22:12:45 +02:00
|
|
|
import platform
|
2024-06-03 18:05:29 +02:00
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
from ekernel import Kernel
|
2024-06-13 00:11:16 +02:00
|
|
|
from test import capture_stderr, Interceptor
|
|
|
|
import test.data.kernel as data
|
2024-06-03 18:05:29 +02:00
|
|
|
|
|
|
|
import ekernel
|
|
|
|
|
|
|
|
def run (*argv):
|
|
|
|
return ekernel.install(list(argv))
|
|
|
|
|
|
|
|
class Tests (unittest.TestCase):
|
|
|
|
|
|
|
|
def setUp (self):
|
2024-06-04 03:39:10 +02:00
|
|
|
# setup test environment
|
|
|
|
data.setup()
|
|
|
|
self.kernel = Kernel.latest()
|
|
|
|
self.kernel.bzImage.touch()
|
2024-06-09 22:12:45 +02:00
|
|
|
self.current = Kernel.current()
|
2024-06-03 18:05:29 +02:00
|
|
|
# start interceptor
|
2024-06-07 00:01:57 +02:00
|
|
|
@data.efi
|
2024-06-03 18:05:29 +02:00
|
|
|
def run (tracer, *args, **kwargs):
|
2024-06-09 22:12:45 +02:00
|
|
|
if args[0][0] == "findmnt":
|
|
|
|
return subprocess.CompletedProcess("", 0, b"/dev/sda1")
|
|
|
|
elif args[0][0] == "eselect":
|
2024-06-03 18:05:29 +02:00
|
|
|
data.linux.unlink()
|
|
|
|
data.linux.symlink_to(self.kernel.src.name)
|
2024-06-09 22:12:45 +02:00
|
|
|
def release (tracer, *args, **kwargs):
|
|
|
|
return f"{self.current.version.base_version}-gentoo"
|
2024-06-07 00:01:57 +02:00
|
|
|
self.interceptor = Interceptor()
|
2024-06-03 18:05:29 +02:00
|
|
|
self.interceptor.add(subprocess.run, call=run)
|
2024-06-09 22:12:45 +02:00
|
|
|
self.interceptor.add(platform.release, call=release)
|
2024-06-03 18:05:29 +02:00
|
|
|
self.interceptor.start()
|
|
|
|
|
|
|
|
def tearDown (self):
|
|
|
|
# stop interceptor
|
|
|
|
self.interceptor.stop()
|
|
|
|
|
2024-06-09 22:12:45 +02:00
|
|
|
def check_install (self, backup=False):
|
2024-06-03 18:05:29 +02:00
|
|
|
trace_it = iter(self.interceptor.trace)
|
2024-06-07 00:01:57 +02:00
|
|
|
# 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})
|
2024-06-09 22:12:45 +02:00
|
|
|
# mount <boot>
|
2024-06-03 18:05:29 +02:00
|
|
|
tracer, (args, kwargs) = next(trace_it)
|
|
|
|
self.assertEqual(tracer.name, "subprocess.run")
|
2024-06-07 00:01:57 +02:00
|
|
|
self.assertEqual(args, (["mount", "/boot"],))
|
2024-06-03 18:05:29 +02:00
|
|
|
self.assertEqual(kwargs, {"capture_output": True, "check": True})
|
2024-06-12 01:45:25 +02:00
|
|
|
# eselect kernel set <name>
|
|
|
|
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)
|
2024-06-12 01:49:25 +02:00
|
|
|
# make modules_install
|
|
|
|
tracer, (args, kwargs) = next(trace_it)
|
|
|
|
self.assertEqual(tracer.name, "subprocess.run")
|
2024-06-13 00:11:16 +02:00
|
|
|
self.assertEqual(args, (["make", "modules_install", ">/dev/null"],))
|
2024-06-12 01:49:25 +02:00
|
|
|
self.assertEqual(kwargs, {"check": True})
|
2024-06-12 01:45:25 +02:00
|
|
|
# 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})
|
2024-06-09 22:12:45 +02:00
|
|
|
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 <boot>
|
|
|
|
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 <disk> -p <part> -L <label> -l <loader>
|
|
|
|
tracer, (args, kwargs) = next(trace_it)
|
|
|
|
self.assertEqual(tracer.name, "subprocess.run")
|
|
|
|
self.assertEqual(args, ([
|
|
|
|
"efibootmgr",
|
|
|
|
"-q",
|
|
|
|
"-c",
|
|
|
|
"-d", "/dev/sda",
|
|
|
|
"-p", "1",
|
|
|
|
"-L", "Gentoo (fallback)",
|
|
|
|
"-l", str(self.current.bkp)
|
|
|
|
],))
|
|
|
|
self.assertEqual(kwargs, {"check": True})
|
|
|
|
# umount <boot>
|
2024-06-07 00:01:57 +02:00
|
|
|
tracer, (args, kwargs) = next(trace_it)
|
|
|
|
self.assertEqual(tracer.name, "subprocess.run")
|
|
|
|
self.assertEqual(args, (["umount", "/tmp"],))
|
|
|
|
self.assertEqual(kwargs, {"check": True})
|
2024-06-03 18:05:29 +02:00
|
|
|
# check generated files
|
2024-06-10 19:27:24 +02:00
|
|
|
self.assertTrue(ekernel.efi.img.exists())
|
2024-06-07 00:01:57 +02:00
|
|
|
self.assertTrue(self.kernel.bkp.exists())
|
2024-06-03 18:05:29 +02:00
|
|
|
|
|
|
|
def test_install (self):
|
|
|
|
self.assertEqual(run("-q"), 0)
|
|
|
|
self.check_install()
|
|
|
|
|
2024-06-04 02:07:17 +02:00
|
|
|
def test_install_source (self):
|
2024-06-03 18:05:29 +02:00
|
|
|
self.kernel = Kernel.current()
|
|
|
|
self.assertEqual(run("-q", "-s", str(data.current)), 0)
|
|
|
|
self.check_install()
|
|
|
|
|
2024-06-09 22:12:45 +02:00
|
|
|
def test_install_backup (self):
|
|
|
|
self.assertEqual(run("-q", "-b"), 0)
|
|
|
|
self.check_install(backup=True)
|
|
|
|
|
|
|
|
def test_install_backup_missing_image (self):
|
|
|
|
self.current.bkp.unlink()
|
|
|
|
self.kernel.bzImage.write_bytes(b"missing image")
|
|
|
|
self.assertEqual(run("-q", "-b"), 0)
|
|
|
|
self.check_install(backup=True)
|
|
|
|
self.assertTrue(self.current.bkp.exists())
|
|
|
|
|
2024-06-03 18:05:29 +02:00
|
|
|
@capture_stderr
|
|
|
|
def test_install_missing_bzImage (self):
|
2024-06-04 02:07:17 +02:00
|
|
|
self.kernel.bzImage.unlink()
|
2024-06-03 18:05:29 +02:00
|
|
|
with self.assertRaises(SystemExit):
|
2024-06-10 02:41:33 +02:00
|
|
|
run("-s", str(data.latest))
|
2024-06-03 18:05:29 +02:00
|
|
|
self.assertRegex(sys.stderr.getvalue(), r"missing.*bzImage")
|
2024-06-07 00:32:27 +02:00
|
|
|
tracer, (args, kwargs) = self.interceptor.trace[-1]
|
|
|
|
self.assertEqual(tracer.name, "subprocess.run")
|
|
|
|
self.assertEqual(args, (["umount", "/tmp"],))
|
|
|
|
self.assertEqual(kwargs, {"check": True})
|