unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: "Clément Lassieur" <clement@lassieur.org>
To: Oleg Pykhalov <go.wigust@gmail.com>
Cc: 30744@debbugs.gnu.org
Subject: [bug#30744] [PATCH] tests: mail: Add test for dovecot.
Date: Thu, 08 Mar 2018 00:34:13 +0100	[thread overview]
Message-ID: <87371bsbnu.fsf@lassieur.org> (raw)
In-Reply-To: <20180307213243.31064-1-go.wigust@gmail.com>

Hi Oleg,

Oleg Pykhalov <go.wigust@gmail.com> 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))))

  reply	other threads:[~2018-03-07 23:35 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-07 21:30 [bug#30744] [PATCH 1/2] services: dovecot: Copy dovecot.conf to /etc/dovecot Oleg Pykhalov
2018-03-07 21:32 ` [bug#30744] [PATCH] tests: mail: Add test for dovecot Oleg Pykhalov
2018-03-07 23:34   ` Clément Lassieur [this message]
2018-03-08  8:24     ` Oleg Pykhalov
2018-03-08  8:28       ` Oleg Pykhalov
2018-03-08  9:41         ` Clément Lassieur
2018-03-09  9:31           ` Oleg Pykhalov
2018-03-09 10:16             ` Clément Lassieur
2018-03-09 14:30               ` Oleg Pykhalov
2018-03-07 23:34 ` [bug#30744] [PATCH 1/2] services: dovecot: Copy dovecot.conf to /etc/dovecot Clément Lassieur

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87371bsbnu.fsf@lassieur.org \
    --to=clement@lassieur.org \
    --cc=30744@debbugs.gnu.org \
    --cc=go.wigust@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).