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" "$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 :