From dac4ab1c9306bf2035bc1547d2ed27ab09850120 Mon Sep 17 00:00:00 2001
From: Guilhem Moulin <guilhem@fripost.org>
Date: Wed, 13 Nov 2019 04:16:48 +0100
Subject: 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.
---
 tests/pullimap/t | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)
 create mode 100644 tests/pullimap/t

(limited to 'tests/pullimap/t')

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 :
-- 
cgit v1.2.3