ekernel/test/test_clean.py

137 lines
4.6 KiB
Python
Raw Normal View History

2024-06-03 18:05:29 +02:00
import io
import os
import shutil
import subprocess
import sys
import unittest
from ekernel import Kernel
2024-06-13 00:11:16 +02:00
from test import capture_stdout, colorless, Interceptor
import test.data.kernel as data
2024-06-03 18:05:29 +02:00
import ekernel
def run (*argv):
return ekernel.clean(list(argv))
class Tests (unittest.TestCase):
def setUp (self):
# setup test environment
data.setup()
# update src symlink to new kernel
data.linux.unlink()
data.linux.symlink_to(data.latest)
# initialize git repository
os.chdir(data.tmp)
2024-06-03 18:05:29 +02:00
for k in data.kernels[:-2]:
if not k.config.exists():
k.config.touch()
if not k.modules.exists():
k.modules.mkdir(parents=True)
if not k.bkp.exists():
k.bkp.touch()
2024-06-03 18:05:29 +02:00
# start interceptor
@data.efi
def run (tracer, *args, **kwargs): pass
2024-06-03 18:05:29 +02:00
self.interceptor = Interceptor()
self.interceptor.add(subprocess.run, call=run)
2024-06-03 18:05:29 +02:00
self.interceptor.start()
def tearDown (self):
# stop interceptor
self.interceptor.stop()
2024-06-10 02:41:33 +02:00
def check_clean (self, keep=2):
2024-06-03 18:05:29 +02:00
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})
2024-06-03 18:05:29 +02:00
# mount /boot
tracer, (args, kwargs) = next(trace_it)
self.assertEqual(tracer.name, "subprocess.run")
self.assertEqual(args, (["mount", "/boot"],))
2024-06-03 18:05:29 +02:00
self.assertEqual(kwargs, {"capture_output": True, "check": True})
# emerge -cq gentoo-sources
tracer, (args, kwargs) = next(trace_it)
self.assertEqual(tracer.name, "subprocess.run")
2024-06-12 01:45:25 +02:00
self.assertEqual(args, (["emerge", "-q", "-c", "gentoo-sources"],))
self.assertEqual(kwargs, {"check": True})
if keep < 3:
# 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})
# umount /boot
tracer, (args, kwargs) = next(trace_it)
self.assertEqual(tracer.name, "subprocess.run")
self.assertEqual(args, (["umount", "/tmp"],))
self.assertEqual(kwargs, {"check": True})
# check files
2024-06-10 02:41:33 +02:00
for k in data.kernels[:keep]:
2024-06-03 18:05:29 +02:00
self.assertTrue(k.src.exists())
self.assertTrue(k.modules.exists())
self.assertTrue(k.bkp.exists())
2024-06-10 02:41:33 +02:00
for k in data.kernels[keep:]:
2024-06-03 18:05:29 +02:00
self.assertFalse(k.src.exists())
self.assertFalse(k.modules.exists())
self.assertFalse(k.bkp.exists())
2024-06-03 18:05:29 +02:00
def test_clean (self):
self.assertEqual(run("-q"), 0)
self.check_clean()
def test_clean_missing_efi (self):
data.kernels[-1].bkp.unlink()
2024-06-03 18:05:29 +02:00
self.assertEqual(run("-q"), 0)
self.check_clean()
def test_clean_missing_modules (self):
shutil.rmtree(data.kernels[-1].modules)
self.assertEqual(run("-q"), 0)
self.check_clean()
def test_clean_keep_3 (self):
self.assertEqual(run("-q", "-k", "3"), 0)
self.check_clean(3)
2024-06-03 18:05:29 +02:00
def test_clean_keep_none (self):
2024-06-10 02:41:33 +02:00
with self.assertRaises(SystemExit):
run("-q", "-k", "0")
2024-06-03 18:05:29 +02:00
def test_clean_keep_gt_available (self):
self.assertEqual(run("-q", "-k", "10"), 0)
self.check_clean(10)
2024-06-07 00:32:27 +02:00
@capture_stdout
def test_clean_umount_on_error (self):
with self.assertRaises(SystemExit):
2024-06-10 02:41:33 +02:00
run("-h")
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})
2024-06-03 18:05:29 +02:00
@colorless
@capture_stdout
def test_clean_dry_run (self):
self.assertEqual(run("-n"), 0)
for src in data.sources:
self.assertTrue(src.exists())
2024-06-10 02:41:33 +02:00
kernels = data.kernels[2:]
rm = {
"sources": [k.src for k in kernels],
"modules": [k.modules for k in kernels],
"images": [k.bkp for k in kernels]
2024-06-10 02:41:33 +02:00
}
2024-06-03 18:05:29 +02:00
expected = io.StringIO()
2024-06-10 02:41:33 +02:00
for k, v in rm.items():
expected.write(f" * deleting {k}:\n")
for p in v:
expected.write(f"{p}\n")
expected.write(" * deleting boot entry Gentoo (fallback)\n")
2024-06-03 18:05:29 +02:00
self.assertEqual(sys.stdout.getvalue(), expected.getvalue())