aboutsummaryrefslogtreecommitdiffstats
path: root/tests/pullimap
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2019-11-13 04:16:48 +0100
committerGuilhem Moulin <guilhem@fripost.org>2019-11-13 06:23:57 +0100
commitdac4ab1c9306bf2035bc1547d2ed27ab09850120 (patch)
tree39d04c3d9c92ccf05f109b1123e69af407fe7a6d /tests/pullimap
parent0a2558aabfefd6800fe74c24e5aff2b0d47cc5e2 (diff)
Test suite: add new test for pullimap(1).
This adds a dependency on Dovecot's LMTPd, which will bind to to TCP port 10024 on the loopback interface.
Diffstat (limited to 'tests/pullimap')
l---------tests/pullimap/interimap.remote1
-rw-r--r--tests/pullimap/local.conf1
-rw-r--r--tests/pullimap/pullimap.conf1
l---------tests/pullimap/remote.conf1
-rw-r--r--tests/pullimap/t96
5 files changed, 100 insertions, 0 deletions
diff --git a/tests/pullimap/interimap.remote b/tests/pullimap/interimap.remote
new file mode 120000
index 0000000..daf3741
--- /dev/null
+++ b/tests/pullimap/interimap.remote
@@ -0,0 +1 @@
+../tls/interimap.remote \ No newline at end of file
diff --git a/tests/pullimap/local.conf b/tests/pullimap/local.conf
new file mode 100644
index 0000000..b67641f
--- /dev/null
+++ b/tests/pullimap/local.conf
@@ -0,0 +1 @@
+!include conf.d/lmtpd.conf
diff --git a/tests/pullimap/pullimap.conf b/tests/pullimap/pullimap.conf
new file mode 100644
index 0000000..3f6c2e1
--- /dev/null
+++ b/tests/pullimap/pullimap.conf
@@ -0,0 +1 @@
+deliver-method = lmtp:[127.0.0.1]:10024
diff --git a/tests/pullimap/remote.conf b/tests/pullimap/remote.conf
new file mode 120000
index 0000000..6029749
--- /dev/null
+++ b/tests/pullimap/remote.conf
@@ -0,0 +1 @@
+../tls/remote.conf \ No newline at end of file
diff --git a/tests/pullimap/t b/tests/pullimap/t
new file mode 100644
index 0000000..7ae0c5f
--- /dev/null
+++ b/tests/pullimap/t
@@ -0,0 +1,96 @@
+MAILBOX="INBOX"
+TIMEOUT=60
+N=2048
+
+step_start "\`pullimap --idle\` refuses to create the state file"
+! pullimap --idle "remote" || error
+step_done
+
+# make sure remote UIDs are 11-bytes long
+doveadm -u "remote" mailbox update --min-next-uid 1000000000 "$MAILBOX"
+
+# compare mailboxes; can't compare the RFC 3501 TEXT as LMTP adds a
+# Received: header.
+# TODO unset lmtp_add_received_header once avaisable in Sid:
+# https://doc.dovecot.org/settings/dovecot_core_settings/#lmtp-add-received-header
+list_mails_sha256() {
+ local u="$1" guid uid
+ while read guid uid; do
+ doveadm -u "$u" -f "flow" fetch body mailbox-guid "$guid" uid "$uid" \
+ | sed "1s/body=//" | sha256sum
+ done < <(doveadm -u "$u" search mailbox "$MAILBOX") | sort -f
+}
+check() {
+ diff -u --label="local/mails" --label="remote/mails" \
+ <( list_mails_sha256 "local" ) \
+ <( list_mails_sha256 "remote" ) \
+ || error "mailboxes differ"
+}
+
+
+# Add some messages and sync
+step_start "Fetching messages"
+for ((i = 0; i < 32; i++)); do
+ sample_message | deliver -u "remote" -- -m "$MAILBOX"
+done
+
+pullimap "remote" || error
+check
+
+# same thing, but with some missing messages
+for ((i = 0; i < N; i+=2)); do
+ sample_message | deliver -u "remote" -- -m "$MAILBOX"
+ deliver -u "remote" -- -m "$MAILBOX" </dev/null # even seqnum
+done
+for ((i = 0; i < N; i+=2)); do
+ # expunge every other message
+ doveadm -u "remote" expunge mailbox "$MAILBOX" $((N-i+32))
+ sample_message | deliver -u "remote" -- -m "$MAILBOX"
+done
+
+pullimap "remote" || error
+check
+
+# count unseen remote messages
+doveadm -u "remote" search mailbox "$MAILBOX" unseen >"$TMPDIR/unseen"
+[ ! -s "$TMPDIR/unseen" ] || error "\\Unseen messages left"
+step_done
+
+
+step_start "--idle (${TIMEOUT}s)"
+
+pullimap --idle "remote" & PID=$!
+trap "ptree_abort $PID" EXIT INT TERM
+
+timer=$(( $(date +%s) + TIMEOUT ))
+while [ $(date +%s) -le $timer ]; do
+ n="$(shuf -n1 -i1-5)"
+ for (( i=0; i < n; i++)); do
+ sample_message | deliver -u "remote" -- -m "$MAILBOX"
+ done
+
+ s=$(shuf -n1 -i1-1500)
+ [ $s -ge 1000 ] && s="$(printf "1.%03d" $((s-1000)))" || s="$(printf "0.%03d" $s)"
+ sleep "$s"
+done
+
+sleep 2
+ptree_abort $PID
+trap - EXIT INT TERM
+
+check
+step_done
+
+
+step_start "Purging"
+echo "purge-after = 0" >>"$XDG_CONFIG_HOME/pullimap/config"
+for ((i = 0; i < 32; i++)); do
+ sample_message | deliver -u "remote" -- -m "$MAILBOX"
+done
+pullimap "remote"
+
+doveadm -u "remote" search mailbox "$MAILBOX" all >"$TMPDIR/messages"
+[ ! -s "$TMPDIR/messages" ] || error "messages left"
+step_done
+
+# vim: set filetype=sh :