From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36599) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1etiaP-0006Hb-PK for guix-patches@gnu.org; Wed, 07 Mar 2018 18:35:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1etiaM-0000Wy-HT for guix-patches@gnu.org; Wed, 07 Mar 2018 18:35:05 -0500 Received: from debbugs.gnu.org ([208.118.235.43]:42095) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1etiaM-0000WZ-Ch for guix-patches@gnu.org; Wed, 07 Mar 2018 18:35:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1etiaL-0007B8-Uf for guix-patches@gnu.org; Wed, 07 Mar 2018 18:35:01 -0500 Subject: [bug#30744] [PATCH] tests: mail: Add test for dovecot. Resent-Message-ID: References: <20180307213030.30466-1-go.wigust@gmail.com> <20180307213243.31064-1-go.wigust@gmail.com> From: =?UTF-8?Q?Cl=C3=A9ment?= Lassieur In-reply-to: <20180307213243.31064-1-go.wigust@gmail.com> Date: Thu, 08 Mar 2018 00:34:13 +0100 Message-ID: <87371bsbnu.fsf@lassieur.org> MIME-Version: 1.0 Content-Type: text/plain List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: Oleg Pykhalov Cc: 30744@debbugs.gnu.org Hi Oleg, Oleg Pykhalov writes: > * gnu/tests/mail.scm (%dovecot-os, %test-dovecot): New variables. > (run-dovecot-test): New procedure. > --- > gnu/tests/mail.scm | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 112 insertions(+), 1 deletion(-) Thank you for these patches! > diff --git a/gnu/tests/mail.scm b/gnu/tests/mail.scm > index 312df9b1c..69fe016e7 100644 > --- a/gnu/tests/mail.scm > +++ b/gnu/tests/mail.scm > @@ -29,7 +29,8 @@ > #:use-module (guix store) > #:use-module (ice-9 ftw) > #:export (%test-opensmtpd > - %test-exim)) > + %test-exim > + %test-dovecot)) > > (define %opensmtpd-os > (simple-operating-system > @@ -279,3 +280,113 @@ acl_check_data: > (name "exim") > (description "Send an email to a running an Exim server.") > (value (run-exim-test)))) > + > +(define %dovecot-os > + (simple-operating-system > + (dhcp-client-service) > + (dovecot-service #:config > + (dovecot-configuration > + (disable-plaintext-auth? #f) > + (ssl? "no") > + (auth-mechanisms '("anonymous")) > + (auth-anonymous-username "alice") > + (mail-location > + (string-append "maildir:~/Maildir" > + ":INBOX=~/Maildir/INBOX" > + ":LAYOUT=fs")))))) > + > +(define (run-dovecot-test) > + "Return a test of an OS running Dovecot service." > + (define vm > + (virtual-machine > + (operating-system (marionette-operating-system > + %dovecot-os > + #:imported-modules '((gnu services herd)))) > + (port-forwardings '((8143 . 143))))) > + > + (define test > + (with-imported-modules '((gnu build marionette)) > + #~(begin > + (use-modules (gnu build marionette) > + (ice-9 iconv) > + (ice-9 rdelim) > + (ice-9 regex) > + (rnrs base) > + (rnrs bytevectors) > + (srfi srfi-64)) > + > + (define marionette > + (make-marionette '(#$vm))) > + > + (define* (message-length message #:key (encoding "iso-8859-1")) > + (bytevector-length (string->bytevector message encoding))) > + > + (mkdir #$output) > + (chdir #$output) > + > + (test-begin "dovecot") > + > + ;; Wait for dovecot to be up and running. > + (test-eq "dovecot running" > + 'running! > + (marionette-eval > + '(begin > + (use-modules (gnu services herd)) > + (start-service 'dovecot) > + 'running!) > + marionette)) > + > + (sleep 1) ; give the service time to start talking Here, it would probably be safer to wait for the PID file to arrive. You could use 'wait-for-file' for this, there are examples in other tests. Dovecot's PID file is /var/run/dovecot/master.pid. > + (test-eq "accept an email" > + #t Could you use 'test-assert' here? > + (let ((imap (socket AF_INET SOCK_STREAM 0)) > + (addr (make-socket-address AF_INET INADDR_LOOPBACK 8143)) > + (message "From: test@example.com\n\ > +Subject: Hello Nice to meet you!")) > + (connect imap addr) > + ;; Be greeted. > + (read-line imap) ;OK > + ;; Authenticate > + (write-line "a AUTHENTICATE ANONYMOUS" imap) > + (read-line imap) ;+ > + (write-line "c2lyaGM=" imap) > + (read-line imap) ;OK > + ;; Create a TESTBOX mailbox > + (write-line "a CREATE TESTBOX" imap) > + (read-line imap) ;OK > + ;; Append a message to a TESTBOX mailbox > + (write-line (format #f "a APPEND TESTBOX {~a}" > + (number->string (message-length message))) > + imap) > + (read-line imap) ;+ > + (write-line message imap) > + (read-line imap) ;OK > + ;; Logout > + (write-line "a LOGOUT" imap) > + (close imap) > + #t)) > + > + (test-assert "mail arrived" > + (marionette-eval > + '(begin > + (use-modules (ice-9 ftw) > + (ice-9 match)) > + ;; Get a message ID > + (string->number > + (match (scandir "/home/alice/Maildir/TESTBOX/new/") > + ((_ _ message) Could you write "." ".." here instead of _ _? It makes it easier to understand the code. > + (match (string-split message #\.) > + ((message-id _ _) message-id)))))) Here I think it would be great to compare the arrived message and the sent message to check that they are the same. If they are the same, then the test succeeds. WDYT? > + marionette)) > + > + (test-end) > + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) > + > + (gexp->derivation "dovecot-test" test)) > + > +(define %test-dovecot > + (system-test > + (name "dovecot") > + (description "Connect to a running Dovecot server.") > + (value (run-dovecot-test))))