| 
									
										
										
										
											2020-04-11 16:38:55 -04:00
										 |  |  | { system ? builtins.currentSystem, | 
					
						
							|  |  |  |   config ? {}, | 
					
						
							|  |  |  |   pkgs ? import ../.. { inherit system config; } | 
					
						
							|  |  |  | }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | with import ../lib/testing-python.nix { inherit system pkgs; }; | 
					
						
							|  |  |  | with pkgs.lib; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-14 14:14:43 -04:00
										 |  |  | let | 
					
						
							|  |  |  |   common = { | 
					
						
							| 
									
										
										
										
											2020-04-11 16:38:55 -04:00
										 |  |  |     virtualisation.useBootLoader = true; | 
					
						
							|  |  |  |     virtualisation.useEFIBoot = true; | 
					
						
							|  |  |  |     boot.loader.systemd-boot.enable = true; | 
					
						
							| 
									
										
										
										
											2020-06-13 23:25:34 -04:00
										 |  |  |     boot.loader.efi.canTouchEfiVariables = true; | 
					
						
							|  |  |  |     environment.systemPackages = [ pkgs.efibootmgr ]; | 
					
						
							| 
									
										
										
										
											2020-04-11 16:38:55 -04:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-06-14 14:14:43 -04:00
										 |  |  | 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") | 
					
						
							| 
									
										
										
										
											2020-04-11 16:38:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-14 14:14:43 -04:00
										 |  |  |       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" | 
					
						
							|  |  |  |       ) | 
					
						
							| 
									
										
										
										
											2020-06-13 23:25:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # "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"') | 
					
						
							| 
									
										
										
										
											2020-06-14 14:14:43 -04:00
										 |  |  |     '';
 | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-04-11 16:38:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-14 14:14:43 -04:00
										 |  |  |   update = makeTest { | 
					
						
							|  |  |  |     name = "systemd-boot-update"; | 
					
						
							|  |  |  |     meta.maintainers = with pkgs.stdenv.lib.maintainers; [ danielfullmer ]; | 
					
						
							| 
									
										
										
										
											2020-04-11 16:38:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-14 14:14:43 -04:00
										 |  |  |     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 | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-04-11 16:38:55 -04:00
										 |  |  | } |