summary refs log blame commit diff
path: root/nixos/tests/dovecot.nix
blob: 156079d1d585d57f1ea9f6326097f5bf5ffd450b (plain) (tree)



















                                                           











                                                                      




















                                                         
                         




                                                                 
                                                       



                    
                                                                      





                                              
                                  




                                                                               
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');
  '';
}