113 lines
3.4 KiB
Nix
113 lines
3.4 KiB
Nix
{ system ? builtins.currentSystem,
|
|
config ? {},
|
|
pkgs ? import ../.. { inherit system config; }
|
|
}:
|
|
|
|
with import ../lib/testing-python.nix { inherit system pkgs; };
|
|
with pkgs.lib;
|
|
|
|
let
|
|
common = {
|
|
virtualisation.useBootLoader = true;
|
|
virtualisation.useEFIBoot = true;
|
|
boot.loader.systemd-boot.enable = true;
|
|
boot.loader.efi.canTouchEfiVariables = true;
|
|
environment.systemPackages = [ pkgs.efibootmgr ];
|
|
};
|
|
in
|
|
{
|
|
basic = makeTest {
|
|
name = "systemd-boot";
|
|
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ danielfullmer ];
|
|
|
|
machine = common;
|
|
|
|
testScript = ''
|
|
machine.start()
|
|
machine.wait_for_unit("multi-user.target")
|
|
|
|
machine.succeed("test -e /boot/loader/entries/nixos-generation-1.conf")
|
|
|
|
# Ensure we actually booted using systemd-boot
|
|
# Magic number is the vendor UUID used by systemd-boot.
|
|
machine.succeed(
|
|
"test -e /sys/firmware/efi/efivars/LoaderEntrySelected-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f"
|
|
)
|
|
|
|
# "bootctl install" should have created an EFI entry
|
|
machine.succeed('efibootmgr | grep "Linux Boot Manager"')
|
|
'';
|
|
};
|
|
|
|
# Check that specialisations create corresponding boot entries.
|
|
specialisation = makeTest {
|
|
name = "systemd-boot-specialisation";
|
|
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ lukegb ];
|
|
|
|
machine = { pkgs, lib, ... }: {
|
|
imports = [ common ];
|
|
specialisation.something.configuration = {};
|
|
};
|
|
|
|
testScript = ''
|
|
machine.start()
|
|
machine.wait_for_unit("multi-user.target")
|
|
|
|
machine.succeed(
|
|
"test -e /boot/loader/entries/nixos-specialisation-something-generation-1.conf"
|
|
)
|
|
machine.succeed(
|
|
"grep -q 'title NixOS (something)' /boot/loader/entries/nixos-specialisation-something-generation-1.conf"
|
|
)
|
|
'';
|
|
};
|
|
|
|
# Boot without having created an EFI entry--instead using default "/EFI/BOOT/BOOTX64.EFI"
|
|
fallback = makeTest {
|
|
name = "systemd-boot-fallback";
|
|
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ danielfullmer ];
|
|
|
|
machine = { pkgs, lib, ... }: {
|
|
imports = [ common ];
|
|
boot.loader.efi.canTouchEfiVariables = mkForce false;
|
|
};
|
|
|
|
testScript = ''
|
|
machine.start()
|
|
machine.wait_for_unit("multi-user.target")
|
|
|
|
machine.succeed("test -e /boot/loader/entries/nixos-generation-1.conf")
|
|
|
|
# Ensure we actually booted using systemd-boot
|
|
# Magic number is the vendor UUID used by systemd-boot.
|
|
machine.succeed(
|
|
"test -e /sys/firmware/efi/efivars/LoaderEntrySelected-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f"
|
|
)
|
|
|
|
# "bootctl install" should _not_ have created an EFI entry
|
|
machine.fail('efibootmgr | grep "Linux Boot Manager"')
|
|
'';
|
|
};
|
|
|
|
update = makeTest {
|
|
name = "systemd-boot-update";
|
|
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ danielfullmer ];
|
|
|
|
machine = common;
|
|
|
|
testScript = ''
|
|
machine.succeed("mount -o remount,rw /boot")
|
|
|
|
# Replace version inside sd-boot with something older. See magic[] string in systemd src/boot/efi/boot.c
|
|
machine.succeed(
|
|
"""
|
|
find /boot -iname '*.efi' -print0 | \
|
|
xargs -0 -I '{}' sed -i 's/#### LoaderInfo: systemd-boot .* ####/#### LoaderInfo: systemd-boot 001 ####/' '{}'
|
|
"""
|
|
)
|
|
|
|
output = machine.succeed("/run/current-system/bin/switch-to-configuration boot")
|
|
assert "updating systemd-boot from 001 to " in output
|
|
'';
|
|
};
|
|
}
|