aboutsummaryrefslogtreecommitdiffstats
path: root/tests/07-sync-live/run
blob: 1950e0b03c15ab5dc7d11e4be8694a67d0378523 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# create database
interimap

# start a long-lived interimap process
interimap --watch=1 & pid=$!

abort() {
    # kill interimap process and its children
    pkill -P "$pid" -TERM
    kill -TERM "$pid"
    wait
}
trap abort EXIT INT TERM

# mailbox list and alphabet (exclude &, / and ~, which dovecot treats specially)
declare -a mailboxes=( "INBOX" ) alphabet=()
str="!\"#\$'()+,-0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]_\`abcdefghijklmnopqrstuvwxyz{|}"
for ((i=0; i < ${#str}; i++)); do
    alphabet[i]="${str:i:1}"
done

timer=$(( $(date +%s) + 30 ))
while [ $(date +%s) -le $timer ]; do
    # create new mailbox with 10% probability
    if [ $(shuf -n1 -i0-9) -eq 0 ]; then
        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+=( "$m" )
        u="$(shuf -n1 -e "local" "remote")" # choose target at random
        [ "$u" = "local" ] || m="${m//./^}"
        doveadm -u "$u" mailbox create -- "$m"
    fi

    # EXPUNGE some messages
    u="$(shuf -n1 -e "local" "remote")" # 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 "local" "remote")" # 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[@]}")"
    [ "$u" = "local" ] || m="${m//./^}"

    # 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 process we started
# above
sleep 2

abort
trap - EXIT INT TERM

check_mailbox_list
check_mailboxes_status "${mailboxes[@]}"

# vim: set filetype=sh :