91 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.7 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"')
 | 
						|
    '';
 | 
						|
  };
 | 
						|
 | 
						|
  # 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
 | 
						|
    '';
 | 
						|
  };
 | 
						|
}
 |