61 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
								 | 
							
								import ./make-test-python.nix ({ lib, ... }: {
							 | 
						||
| 
								 | 
							
								  name = "grub";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  meta = with lib.maintainers; {
							 | 
						||
| 
								 | 
							
								    maintainers = [ rnhmjoj ];
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  machine = { ... }: {
							 | 
						||
| 
								 | 
							
								    virtualisation.useBootLoader = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    boot.loader.timeout = null;
							 | 
						||
| 
								 | 
							
								    boot.loader.grub = {
							 | 
						||
| 
								 | 
							
								      enable = true;
							 | 
						||
| 
								 | 
							
								      users.alice.password = "supersecret";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      # OCR is not accurate enough
							 | 
						||
| 
								 | 
							
								      extraConfig = "serial; terminal_output serial";
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  testScript = ''
							 | 
						||
| 
								 | 
							
								    def grub_login_as(user, password):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Enters user and password to log into GRUB
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        machine.wait_for_console_text("Enter username:")
							 | 
						||
| 
								 | 
							
								        machine.send_chars(user + "\n")
							 | 
						||
| 
								 | 
							
								        machine.wait_for_console_text("Enter password:")
							 | 
						||
| 
								 | 
							
								        machine.send_chars(password + "\n")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def grub_select_all_configurations():
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Selects "All configurations" from the GRUB menu
							 | 
						||
| 
								 | 
							
								        to trigger a login request.
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        machine.send_monitor_command("sendkey down")
							 | 
						||
| 
								 | 
							
								        machine.send_monitor_command("sendkey ret")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    machine.start()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # wait for grub screen
							 | 
						||
| 
								 | 
							
								    machine.wait_for_console_text("GNU GRUB")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    grub_select_all_configurations()
							 | 
						||
| 
								 | 
							
								    with subtest("Invalid credentials are rejected"):
							 | 
						||
| 
								 | 
							
								        grub_login_as("wronguser", "wrongsecret")
							 | 
						||
| 
								 | 
							
								        machine.wait_for_console_text("error: access denied.")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    grub_select_all_configurations()
							 | 
						||
| 
								 | 
							
								    with subtest("Valid credentials are accepted"):
							 | 
						||
| 
								 | 
							
								        grub_login_as("alice", "supersecret")
							 | 
						||
| 
								 | 
							
								        machine.send_chars("\n")  # press enter to boot
							 | 
						||
| 
								 | 
							
								        machine.wait_for_console_text("Linux version")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    with subtest("Machine boots correctly"):
							 | 
						||
| 
								 | 
							
								        machine.wait_for_unit("multi-user.target")
							 | 
						||
| 
								 | 
							
								  '';
							 | 
						||
| 
								 | 
							
								})
							 |