aboutsummaryrefslogtreecommitdiffstats
path: root/tests/07-sync-live-multi/run
blob: 15a27fd8a8d6862c124d16f01a511da74f26d4b2 (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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 || true
    kill -TERM "$pid" || true
    pkill -P "$pid2" -TERM || true
    kill -TERM "$pid2" || true
    pkill -P "$pid3" -TERM || true
    kill -TERM "$pid3" || true
    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 "$(printf "0.%03d" "$(shuf -n1 -i1-999)")"
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 :