That's apparently not enough to catch the bug I ran into with the update to 2.3.1, but at least it will check the LDA appears to work.
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
import ./make-test.nix {
 | 
						|
  name = "dovecot";
 | 
						|
 | 
						|
  machine = { pkgs, ... }: {
 | 
						|
    imports = [ common/user-account.nix ];
 | 
						|
    services.postfix.enable = true;
 | 
						|
    services.dovecot2.enable = true;
 | 
						|
    services.dovecot2.protocols = [ "imap" "pop3" ];
 | 
						|
    environment.systemPackages = let
 | 
						|
      sendTestMail = pkgs.writeScriptBin "send-testmail" ''
 | 
						|
        #!${pkgs.stdenv.shell}
 | 
						|
        exec sendmail -vt <<MAIL
 | 
						|
        From: root@localhost
 | 
						|
        To: alice@localhost
 | 
						|
        Subject: Very important!
 | 
						|
 | 
						|
        Hello world!
 | 
						|
        MAIL
 | 
						|
      '';
 | 
						|
 | 
						|
      sendTestMailViaDeliveryAgent = pkgs.writeScriptBin "send-lda" ''
 | 
						|
        #!${pkgs.stdenv.shell}
 | 
						|
 | 
						|
        exec ${pkgs.dovecot}/libexec/dovecot/deliver -d bob <<MAIL
 | 
						|
        From: root@localhost
 | 
						|
        To: bob@localhost
 | 
						|
        Subject: Something else...
 | 
						|
 | 
						|
        I'm running short of ideas!
 | 
						|
        MAIL
 | 
						|
      '';
 | 
						|
 | 
						|
      testImap = pkgs.writeScriptBin "test-imap" ''
 | 
						|
        #!${pkgs.python3.interpreter}
 | 
						|
        import imaplib
 | 
						|
 | 
						|
        with imaplib.IMAP4('localhost') as imap:
 | 
						|
          imap.login('alice', 'foobar')
 | 
						|
          imap.select()
 | 
						|
          status, refs = imap.search(None, 'ALL')
 | 
						|
          assert status == 'OK'
 | 
						|
          assert len(refs) == 1
 | 
						|
          status, msg = imap.fetch(refs[0], 'BODY[TEXT]')
 | 
						|
          assert status == 'OK'
 | 
						|
          assert msg[0][1].strip() == b'Hello world!'
 | 
						|
      '';
 | 
						|
 | 
						|
      testPop = pkgs.writeScriptBin "test-pop" ''
 | 
						|
        #!${pkgs.python3.interpreter}
 | 
						|
        import poplib
 | 
						|
 | 
						|
        pop = poplib.POP3('localhost')
 | 
						|
        try:
 | 
						|
          pop.user('bob')
 | 
						|
          pop.pass_('foobar')
 | 
						|
          assert len(pop.list()[1]) == 1
 | 
						|
          status, fullmail, size = pop.retr(1)
 | 
						|
          assert status.startswith(b'+OK ')
 | 
						|
          body = b"".join(fullmail[fullmail.index(b""):]).strip()
 | 
						|
          assert body == b"I'm running short of ideas!"
 | 
						|
        finally:
 | 
						|
          pop.quit()
 | 
						|
      '';
 | 
						|
 | 
						|
    in [ sendTestMail sendTestMailViaDeliveryAgent testImap testPop ];
 | 
						|
  };
 | 
						|
 | 
						|
  testScript = ''
 | 
						|
    $machine->waitForUnit('postfix.service');
 | 
						|
    $machine->waitForUnit('dovecot2.service');
 | 
						|
    $machine->succeed('send-testmail');
 | 
						|
    $machine->succeed('send-lda');
 | 
						|
    $machine->waitUntilFails('[ "$(postqueue -p)" != "Mail queue is empty" ]');
 | 
						|
    $machine->succeed('test-imap');
 | 
						|
    $machine->succeed('test-pop');
 | 
						|
  '';
 | 
						|
}
 |