aboutsummaryrefslogtreecommitdiffstats
path: root/tests/07-sync-live-multi/run
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2019-05-26 23:28:04 +0200
committerGuilhem Moulin <guilhem@fripost.org>2019-05-27 00:39:49 +0200
commit8e379c62a48d68cd5ab2a32c6fc9244b1ae94084 (patch)
treedd3656ac60fe10c1e1739a88350f77c2f2a417f9 /tests/07-sync-live-multi/run
parent456946609aa1e64a42578ff1c4962ea939d31da4 (diff)
Add test-suite (requires dovecot-imapd).
Diffstat (limited to 'tests/07-sync-live-multi/run')
-rw-r--r--tests/07-sync-live-multi/run138
1 files changed, 138 insertions, 0 deletions
diff --git a/tests/07-sync-live-multi/run b/tests/07-sync-live-multi/run
new file mode 100644
index 0000000..bf0d2f5
--- /dev/null
+++ b/tests/07-sync-live-multi/run
@@ -0,0 +1,138 @@
+# add references to each interimap instance
+sed -ri 's#^\[local\]$#&\nlist-reference = foo/#' "$XDG_CONFIG_HOME/interimap/config"
+sed -ri 's#^\[local\]$#&\nlist-reference = bar/#' "$XDG_CONFIG_HOME/interimap/config2"
+sed -ri 's#^\[local\]$#&\nlist-reference = baz/#' "$XDG_CONFIG_HOME/interimap/config3"
+
+# create databases
+interimap --config="config"
+interimap --config="config2"
+interimap --config="config3"
+
+# start long-lived interimap processes
+interimap --config="config" --watch=1 & pid=$!
+interimap --config="config2" --watch=1 & pid2=$!
+interimap --config="config3" --watch=1 & pid3=$!
+
+abort() {
+ # kill interimap process and its children
+ pkill -P "$pid" -TERM
+ kill -TERM "$pid"
+ pkill -P "$pid2" -TERM
+ kill -TERM "$pid2"
+ pkill -P "$pid3" -TERM
+ kill -TERM "$pid3"
+ wait
+}
+trap abort EXIT INT TERM
+
+
+# mailbox list (as seen on local) and alphabet
+declare -a mailboxes=( "INBOX" ) alphabet=()
+str="#+-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
+for ((i=0; i < ${#str}; i++)); do
+ alphabet[i]="${str:i:1}"
+done
+
+declare -a targets=( "local" "remote" "remote2" "remote3" )
+
+timer=$(( $(date +%s) + 30 ))
+while [ $(date +%s) -le $timer ]; do
+ # create new mailbox with 10% probability
+ if [ $(shuf -n1 -i0-9) -eq 0 ]; then
+ u="$(shuf -n1 -e -- "${targets[@]}")" # choose target at random
+ case "$u" in
+ local) ns="$(shuf -n1 -e "foo/" "bar/" "baz/")";;
+ remote) ns="foo/";;
+ remote2) ns="bar/";;
+ remote3) ns="baz/";;
+ *) echo "Uh?" >&2; exit 1;;
+ esac
+
+ m=
+ d=$(shuf -n1 -i1-3) # random depth
+ for (( i=0; i < d; i++)); do
+ l=$(shuf -n1 -i1-16)
+ m="${m:+$m/}$(shuf -n "$l" -e -- "${alphabet[@]}" | tr -d '\n')"
+ done
+ mailboxes+=( "$ns$m" )
+ case "$u" in
+ local) m="$ns$m";;
+ remote) m="${m//\//^}";;
+ remote2) m="${m//\//\\}";;
+ remote3) m="${m//\//\?}";;
+ *) echo "Uh?" >&2; exit 1;;
+ esac
+ doveadm -u "$u" mailbox create -- "$m"
+ fi
+
+ # EXPUNGE some messages
+ u="$(shuf -n1 -e -- "${targets[@]}")" # choose target at random
+ n="$(shuf -n1 -i0-3)"
+ while read guid uid; do
+ doveadm -u "$u" expunge mailbox-guid "$guid" uid "$uid"
+ done < <(doveadm -u "$u" search all | shuf -n "$n")
+
+ # mark some existing messages as read (toggle \Seen flag as unlike other
+ # flags it's easier to query and check_mailboxes_status checks it)
+ u="$(shuf -n1 -e -- "${targets[@]}")" # choose target at random
+ n="$(shuf -n1 -i0-9)"
+ while read guid uid; do
+ a="$(shuf -n1 -e add remove replace)"
+ doveadm -u "$u" flags "$a" "\\Seen" mailbox-guid "$guid" uid "$uid"
+ done < <(doveadm -u "$u" search all | shuf -n "$n")
+
+ # select at random a mailbox where to deliver some messages
+ u="$(shuf -n1 -e "local" "remote")" # choose target at random
+ m="$(shuf -n1 -e -- "${mailboxes[@]}")"
+ if [ "$u" = "remote" ]; then
+ case "$m" in
+ foo/*) u="remote"; m="${m#foo/}"; m="${m//\//^}";;
+ bar/*) u="remote2"; m="${m#bar/}"; m="${m//\//\\}";;
+ baz/*) u="remote3"; m="${m#baz/}"; m="${m//\//\?}";;
+ INBOX) u="$(shuf -n1 -e "remote" "remote2" "remote3")";;
+ *) echo "Uh? $m" >&2; exit 1;;
+ esac
+ fi
+
+ # deliver between 1 and 5 messages to the chosen mailbox
+ n="$(shuf -n1 -i1-5)"
+ for (( i=0; i < n; i++)); do
+ sample_message | deliver -u "$u" -- -m "$m"
+ done
+
+ # sleep a little bit
+ sleep "0.$(shuf -n1 -i1-99)"
+done
+
+# wait a little longer so interimap has time to run loop() again and
+# synchronize outstanding changes, then terminate the processes we
+# started above
+sleep 2
+
+abort
+trap - EXIT INT TERM
+
+# check that the mailbox lists match
+diff -u --label="local/mailboxes" --label="remote/mailboxes" \
+ <( doveadm -u "local" mailbox list | sed -n "s,^foo/,,p" | sort ) \
+ <( doveadm -u "remote" mailbox list | tr '^' '/' | sort )
+diff -u --label="local/mailboxes" --label="remote2/mailboxes" \
+ <( doveadm -u "local" mailbox list | sed -n "s,^bar/,,p" | sort ) \
+ <( doveadm -u "remote2" mailbox list | tr '\\' '/' | sort )
+diff -u --label="local/mailboxes" --label="remote3/mailboxes" \
+ <( doveadm -u "local" mailbox list | sed -n "s,^baz/,,p" | sort ) \
+ <( doveadm -u "remote3" mailbox list | tr '?' '/' | sort )
+
+for m in "${mailboxes[@]}"; do
+ case "$m" in
+ foo/*) u="remote"; mb="${m#foo/}"; mr="${mb//\//^}";;
+ bar/*) u="remote2"; mb="${m#bar/}"; mr="${mb//\//\\}";;
+ baz/*) u="remote3"; mb="${m#baz/}"; mr="${mb//\//\?}";;
+ INBOX) continue;;
+ *) echo "Uh? $m" >&2; exit 1;;
+ esac
+ blob="x'$(printf "%s" "$mb" | tr "/" "\\0" | xxd -c256 -ps)'"
+ check_mailbox_status2 "$blob" "$m" "$u" "$mr"
+done
+
+# vim: set filetype=sh :