archinstall/tests/qemu/runners.py

176 lines
7.0 KiB
Python

import threading
import time
import os
import logging
import asyncio
from testbase import TestBase
logger = logging.getLogger("archtest")
class TestLeaveAllDefault(TestBase):
def __init__(self, serial_monitor):
super().__init__(serial_monitor)
self.running_test = False
self.installation_complete = False
self.installation_successful = False
self.fix_post_install_boot = False
self.entered_disk_enc_pw = False
self.exit_code = -1
threading.Thread.__init__(self)
self.start()
def run(self):
while True:
if b'Set/Modify the below options' in self.buffer and self.running_test is False:
# This is our entrypoint, from here on we'll have to fly blind because
# the menu system uses ANSI/VT100 escape codes to put the arrow and stuff.
# So we can't check for `> Archinstall langauge` for instance.
# So lets fire away our test sequence and monitor for some break-point values.
logger.info(f"Running through a typical installation scenario accepting all defaults.")
self.running_test = True
time.sleep(1)
logger.info(f"Selecting a good regional mirror")
# Navigate to Mirror selection
self.send_key('arrow_down', delay=0.2)
self.send_key('enter', delay=0.2)
self.send_key('enter', delay=0.2)
time.sleep(2) # Let the UI buffer complete before we start searching
# Search for a known mirror region with good speed relative to source of execution
self.send_key('/', delay=0.2)
self.send_string('Sweden', delay=0.2)
self.send_key('enter', delay=0.2)
# Exit the mirror selection screen
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('enter', delay=0.2)
# Enter 'locale' option
logger.info(f"Setting a keyboard locale to something known")
self.send_key('enter', delay=0.2)
# Enter keyboard layout
self.send_key('enter', delay=0.2)
time.sleep(1) # Let the UI buffer complete again before searching
self.send_key('/', delay=0.2)
time.sleep(0.5)
self.send_string('sv-latin1', delay=0.2)
self.send_key('enter', delay=0.2)
# Exit locale
logger.info(f"Selecting the one virtual harddrive")
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('enter', delay=0.2)
# Enter disk config
self.send_key('enter', delay=0.2)
# Enter partitioning
self.send_key('enter', delay=0.2)
# Use best effort
self.send_key('enter', delay=0.2)
# Select second option, which should be Virtio Block Device
self.send_key('arrow_down', delay=0.2)
self.send_key('enter', delay=0.2)
# Select btrfs
logger.info(f"Selecting btrfs + subvolumes + compression")
self.send_key('enter', delay=0.2)
# Use subvolumes
self.send_key('enter', delay=0.2)
# Use compression
self.send_key('enter', delay=0.2)
# Exit partitioning
logger.info(f"Setting disk encryption password")
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('enter', delay=0.2)
# Enter disk encryption
self.send_key('enter', delay=0.2)
# Select encryption type
self.send_key('enter', delay=0.2)
# Select LUKS
self.send_key('enter', delay=0.2)
# Enter password selection
self.send_key('arrow_down', delay=0.2)
self.send_key('enter', delay=0.2)
# Enter a test password
self.send_string('test', delay=0.2)
self.send_key('enter', delay=0.2)
self.send_string('test', delay=0.2)
self.send_key('enter', delay=0.2)
# Select partition
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('enter', delay=0.2)
# Select the default partition
self.send_key('enter', delay=0.2)
# Exit encryption menu
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('enter', delay=0.2)
# Skip some entries in the main menu
logger.info(f"Setting a root password")
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2) # Move to "root password"
self.send_key('enter', delay=0.2)
# Enter a test root password
self.send_string('test', delay=0.2)
self.send_key('enter', delay=0.2)
self.send_string('test', delay=0.2)
self.send_key('enter', delay=0.2)
# Skip some entries
logger.info(f"Adding nano as additional password")
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2) # Additional packages
self.send_key('enter', delay=0.2)
# Enter a test package that is reliable
self.send_string('nano', delay=0.2)
self.send_key('enter', delay=0.2)
logger.info(f"Setting network config")
# Configure networking
time.sleep(1)
self.send_key('enter', delay=0.2)
self.send_key('enter', delay=0.2)
time.sleep(2)
# Proceed to installation
logger.info(f"Proceeding to install")
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2)
self.send_key('arrow_down', delay=0.2) # Install
self.send_key('enter', delay=0.2)
# Proceed to install
self.send_key('enter', delay=0.2)
elif b'Would you like to chroot' in self.buffer and self.installation_complete is False:
logger.info(f"Installation appears to have completed")
self.installation_complete = True
self.send_key('arrow_down', delay=0.2) # No
self.send_key('enter', delay=0.2)
elif b'Installation completed without any errors' in self.buffer and self.installation_successful is False:
logger.info(f"Installation was successful, rebooting")
self.installation_successful = True
self.send_string('reboot', delay=0.2)
self.send_key('enter', delay=0.2)
elif b'Arch Linux (linux-fallback)' in self.buffer and self.installation_successful is True and self.fix_post_install_boot is False:
logger.info(f"Found linux-fallback, assuming bootloader needs adjusting for serial output")
self.fix_post_install_boot = True
asyncio.run_coroutine_threadsafe(self.serial_monitor.edit_boot(), loop=self.serial_monitor.QMP.loop)
elif b'A password is required to access the root volume' in self.buffer and self.installation_successful is True and self.fix_post_install_boot is True and self.entered_disk_enc_pw is False:
logger.info(f"Found disk encryption password, supplying it")
self.entered_disk_enc_pw = True
self.send_string('test', delay=0.2)
self.send_key('enter', delay=0.2)
elif b'archlinux login:' in self.buffer[-500:] and self.installation_successful and self.entered_disk_enc_pw:
logger.info("Installation successful, for real!")
self.exit_code = 0
break
time.sleep(0.25)
os.system('pkill tail')
exit(self.exit_code)