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