fix(test): select persistent UEFI test media without changing boot order

This commit is contained in:
Codex
2026-10-13 22:49:33 +03:00
parent 3c15890823
commit 6058a0660e
5 changed files with 185 additions and 15 deletions
+24
View File
@@ -63,6 +63,30 @@ class SmokeTests(unittest.TestCase):
self.assertNotIn('media=cdrom', ' '.join(argv))
self.assertNotIn('-cdrom', argv)
def test_persistent_optical_drive_keeps_topology_with_no_installed_medium(self):
disk = self.root / 'disk.qcow2'
self.mod.reserve_disk(disk)
iso = self.root / 'trusted.iso'
iso.write_bytes(b'ISO')
optical = []
for medium in (iso, None):
argv = self.mod.qemu_argv('qemu', self.root, disk, self.code,
self.variables, medium, 2048, keep_cdrom_drive=True)
drives = [argv[i + 1] for i, value in enumerate(argv[:-1]) if value == '-drive']
cdrom = [dict(field.split('=', 1) for field in drive.split(','))
for drive in drives if 'media=cdrom' in drive]
self.assertEqual(len(cdrom), 1)
self.assertEqual(cdrom[0]['if'], 'ide')
self.assertEqual(cdrom[0]['index'], '0')
self.assertEqual(cdrom[0]['id'], 'acceptance-cdrom')
self.assertEqual(cdrom[0]['readonly'], 'on')
optical.append(cdrom[0])
self.assertEqual(optical[0].pop('file'), str(iso))
self.assertEqual(optical[0].pop('format'), 'raw')
self.assertNotIn('file', optical[1], 'Installed boot must have no ISO medium')
self.assertNotIn('format', optical[1], 'An empty drive must not request a raw block backend')
self.assertEqual(optical[0], optical[1])
def test_hardlinked_disk_is_refused(self):
disk = self.root / 'disk.qcow2'
self.mod.reserve_disk(disk)
+84
View File
@@ -9,6 +9,38 @@ import urllib.error
import urllib.request
class BootConsole:
"""Captured efibootmgr format with observable guest NVRAM mutations."""
def __init__(self, entries=None, changed_order=False, drop_next=False, changed_create_order=False):
self.order = '0000,0001,0002,0003'
self.next = None
self.changed_order, self.drop_next = changed_order, drop_next
self.changed_create_order = changed_create_order
self.entries = entries if entries is not None else (
'Boot0000* UiApp\tFvVol(example)/FvFile(example)\n'
'Boot0001* UEFI QEMU DVD-ROM QM00001 \tPciRoot(0x0)/Pci(0x1f,0x2)/Sata(0,65535,0){auto_created_boot_option}\n'
'Boot0002* UEFI Misc Device\tPciRoot(0x0)/Pci(0x3,0x0)\n'
'Boot0003* EFI Internal Shell\tFvVol(example)/FvFile(example)\n'
'Boot0004* HydraOS\tHD(1,GPT,5d24ab30-9c80-4f5d-8594-f9f08fdf31fb,0x800,0x100000)/\\EFI\\HydraOS\\grubx64.efi\n')
def command(self, command, timeout):
if command == 'sudo -n blkid -s PARTUUID -o value /dev/vda1':
return b'5d24ab30-9c80-4f5d-8594-f9f08fdf31fb\n'
if command == "sudo -n efibootmgr --create-only --disk /dev/vda --part 1 --label HydraOS --loader '\\EFI\\HydraOS\\grubx64.efi'":
self.entries += ('Boot0004* HydraOS\tHD(1,GPT,5d24ab30-9c80-4f5d-8594-f9f08fdf31fb,0x800,0x100000)/\\EFI\\HydraOS\\grubx64.efi\n')
if self.changed_create_order:
self.order = '0004,0000,0001,0002,0003'
elif command.startswith('sudo -n efibootmgr --bootnext '):
if not self.drop_next:
self.next = command.split()[-1]
if self.changed_order:
self.order = '0001,0000,0002,0003'
elif command != 'sudo -n efibootmgr':
raise AssertionError('Unexpected firmware mutation: ' + command)
return ('BootCurrent: 0004\nTimeout: 1 seconds\nBootOrder: ' + self.order + '\n' +
('BootNext: ' + self.next + '\n' if self.next else '') + self.entries).encode()
SCRIPT = Path(__file__).resolve().parents[1] / 'dev/laptop-smoke.py'
@@ -80,6 +112,58 @@ class LaptopSmokeTests(unittest.TestCase):
with self.assertRaises(self.mod.SmokeError):
self.mod.partition_installer_command('bad;token')
def test_live_boot_is_selected_once_without_changing_bootorder(self):
console = BootConsole()
self.mod.select_live(console)
self.assertEqual(console.next, '0001')
self.assertEqual(console.order, '0000,0001,0002,0003')
def test_live_boot_refuses_missing_ambiguous_or_inactive_dvd_entry(self):
for entries in ('Boot0001* Unrelated DVD\tPciRoot(0x0)\n',
'Boot0001* UEFI QEMU DVD-ROM QM00001 Other\tPciRoot(0x0)\n',
'Boot0001 UEFI QEMU DVD-ROM QM00001 \tPciRoot(0x0)\n',
'Boot0001* UEFI QEMU DVD-ROM QM00001 \tPciRoot(0x0)\n'
'Boot0002* UEFI QEMU DVD-ROM QM00001 \tPciRoot(0x0)\n'):
console = BootConsole(entries=entries)
with self.subTest(entries=entries), self.assertRaises(self.mod.SmokeError):
self.mod.select_live(console)
self.assertIsNone(console.next)
def test_boot_selection_verifies_effective_bootnext_and_unchanged_order(self):
for selector in ('select_live', 'select_installed'):
for fault in ('changed_order', 'drop_next'):
with self.subTest(selector=selector, fault=fault), self.assertRaises(self.mod.SmokeError):
getattr(self.mod, selector)(BootConsole(**{fault: True}))
def test_installed_boot_recreates_pruned_owned_entry_without_changing_order(self):
console = BootConsole()
console.entries = console.entries[:console.entries.index('Boot0004')]
with self.assertRaises(self.mod.SmokeError):
self.mod.select_installed(console)
self.assertIsNone(console.next, 'First selection must prove installer registration')
self.mod.select_installed(console, recreate=True)
self.assertEqual(console.next, '0004')
self.assertEqual(console.order, '0000,0001,0002,0003')
self.assertIn('\\EFI\\HydraOS\\grubx64.efi', console.entries)
def test_recreated_entry_cannot_change_bootorder(self):
console = BootConsole(changed_create_order=True)
console.entries = console.entries[:console.entries.index('Boot0004')]
with self.assertRaises(self.mod.SmokeError):
self.mod.select_installed(console, recreate=True)
self.assertIsNone(console.next)
def test_boot_selection_rejects_correct_label_with_foreign_device_or_loader(self):
for selector, before, after in (
('select_live', 'Sata(0,65535,0)', 'Sata(2,65535,0)'),
('select_installed', '5d24ab30-9c80-4f5d-8594-f9f08fdf31fb', 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'),
('select_installed', '\\EFI\\HydraOS\\grubx64.efi', '\\EFI\\ForeignOS\\grubx64.efi')):
console = BootConsole()
console.entries = console.entries.replace(before, after)
with self.subTest(selector=selector, wrong=after), self.assertRaises(self.mod.SmokeError):
getattr(self.mod, selector)(console)
self.assertIsNone(console.next)
def test_base_state_compares_kernel_bytes_without_including_mounted_esp(self):
# Offline /boot/efi is an empty mountpoint; on disk-only boot it contains
# the mounted ESP. That mount must not produce a false base mismatch.