aboutsummaryrefslogtreecommitdiffstats
path: root/tests/pullimap/t
diff options
context:
space:
mode:
Diffstat (limited to 'tests/pullimap/t')
-rw-r--r--tests/pullimap/t96
1 files changed, 96 insertions, 0 deletions
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 :