nixpkgs/nixos/tests/dovecot.nix
Léo Gaspard 4fddb8b9c3
dovecot module: test dovecot's LDA
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.
2018-04-12 01:35:14 +02:00

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