1
/* Copyright (c) 2009-2012 Dovecot authors, see the included COPYING file */
5
#include "dsync-brain-private.h"
6
#include "test-dsync-worker.h"
7
#include "test-dsync-common.h"
9
struct master_service *master_service;
10
static struct test_dsync_worker *src_test_worker, *dest_test_worker;
12
struct dsync_brain_mailbox_sync *
13
dsync_brain_msg_sync_init(struct dsync_brain *brain,
14
const ARRAY_TYPE(dsync_brain_mailbox) *mailboxes)
16
struct dsync_brain_mailbox_sync *sync;
18
sync = i_new(struct dsync_brain_mailbox_sync, 1);
20
i_array_init(&sync->mailboxes, array_count(mailboxes));
21
array_append_array(&sync->mailboxes, mailboxes);
24
void dsync_brain_msg_sync_more(struct dsync_brain_mailbox_sync *sync ATTR_UNUSED) {}
26
void dsync_brain_msg_sync_deinit(struct dsync_brain_mailbox_sync **_sync)
28
array_free(&(*_sync)->mailboxes);
32
static void mailboxes_set_guids(struct dsync_mailbox *boxes)
34
for (; boxes->name != NULL; boxes++) {
35
dsync_str_sha_to_guid(t_strconcat("box-", boxes->name, NULL),
36
&boxes->mailbox_guid);
37
dsync_str_sha_to_guid(boxes->name, &boxes->name_sha1);
41
static void mailboxes_send_to_worker(struct test_dsync_worker *test_worker,
42
struct dsync_mailbox *boxes)
46
for (i = 0; boxes[i].name != NULL; i++) {
47
test_worker->box_iter.next_box = &boxes[i];
48
test_worker->worker.input_callback(test_worker->worker.input_context);
50
test_worker->box_iter.last = TRUE;
51
test_worker->worker.input_callback(test_worker->worker.input_context);
54
static void subscriptions_send_to_worker(struct test_dsync_worker *test_worker)
56
test_worker->subs_iter.last_subs = TRUE;
57
test_worker->subs_iter.last_unsubs = TRUE;
58
test_worker->worker.input_callback(test_worker->worker.input_context);
62
test_dsync_mailbox_create_equals(const struct dsync_mailbox *cbox,
63
const struct dsync_mailbox *obox)
65
return strcmp(cbox->name, obox->name) == 0 &&
66
memcmp(cbox->mailbox_guid.guid, obox->mailbox_guid.guid,
67
sizeof(cbox->mailbox_guid.guid)) == 0 &&
68
memcmp(cbox->name_sha1.guid, obox->name_sha1.guid,
69
sizeof(cbox->name_sha1.guid)) == 0 &&
70
cbox->uid_validity == obox->uid_validity &&
71
cbox->uid_next == 1 && cbox->highest_modseq == 0;
75
test_dsync_mailbox_delete_equals(const struct dsync_mailbox *dbox,
76
const struct dsync_mailbox *obox)
78
return memcmp(dbox->mailbox_guid.guid, obox->mailbox_guid.guid,
79
sizeof(dbox->mailbox_guid.guid)) == 0 &&
80
dbox->last_change == obox->last_change;
84
test_dsync_mailbox_update(const struct dsync_mailbox *bbox,
85
const struct dsync_mailbox *box)
87
struct test_dsync_box_event src_event, dest_event;
89
test_assert(test_dsync_worker_next_box_event(src_test_worker, &src_event));
90
test_assert(test_dsync_worker_next_box_event(dest_test_worker, &dest_event));
91
test_assert(src_event.type == dest_event.type &&
92
dsync_mailboxes_equal(&src_event.box, &dest_event.box));
94
test_assert(src_event.type == LAST_BOX_TYPE_UPDATE);
95
test_assert(dsync_mailboxes_equal(&src_event.box, box));
96
test_assert(dsync_mailboxes_equal(bbox, box));
100
dsync_brain_mailbox_name_cmp(const struct dsync_brain_mailbox *box1,
101
const struct dsync_brain_mailbox *box2)
103
return strcmp(box1->box.name, box2->box.name);
106
static void test_dsync_brain(void)
108
static struct dsync_mailbox src_boxes[] = {
109
{ "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
110
{ "box2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
111
{ "box3", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
112
{ "box4", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
113
{ "box5", '/', { { 0, } }, { { 0, } }, 1234567890, 5433, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
114
{ "box6", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123124ULL, 3636, 0, ARRAY_INIT },
115
{ "boxx", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
116
{ "boxd1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
117
{ "boxd2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, DSYNC_MAILBOX_FLAG_DELETED_MAILBOX, ARRAY_INIT },
118
{ NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, 0, ARRAY_INIT }
120
static struct dsync_mailbox dest_boxes[] = {
121
{ "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
122
{ "box2", '/', { { 0, } }, { { 0, } }, 1234567891, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
123
{ "box3", '/', { { 0, } }, { { 0, } }, 1234567890, 5433, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
124
{ "box4", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123124ULL, 3636, 0, ARRAY_INIT },
125
{ "box5", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
126
{ "box6", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
127
{ "boxy", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
128
{ "boxd1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, DSYNC_MAILBOX_FLAG_DELETED_MAILBOX, ARRAY_INIT },
129
{ "boxd2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
130
{ NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, 0, ARRAY_INIT }
132
struct dsync_brain *brain;
133
struct dsync_worker *src_worker, *dest_worker;
134
struct test_dsync_box_event box_event;
135
const struct dsync_brain_mailbox *brain_boxes;
136
unsigned int i, count;
138
test_begin("dsync brain");
140
mailboxes_set_guids(src_boxes);
141
mailboxes_set_guids(dest_boxes);
143
src_worker = dsync_worker_init_test();
144
dest_worker = dsync_worker_init_test();
145
src_test_worker = (struct test_dsync_worker *)src_worker;
146
dest_test_worker = (struct test_dsync_worker *)dest_worker;
148
brain = dsync_brain_init(src_worker, dest_worker, NULL,
149
DSYNC_BRAIN_FLAG_LOCAL);
150
dsync_brain_sync(brain);
152
/* have brain read the mailboxes */
153
mailboxes_send_to_worker(src_test_worker, src_boxes);
154
mailboxes_send_to_worker(dest_test_worker, dest_boxes);
156
subscriptions_send_to_worker(src_test_worker);
157
subscriptions_send_to_worker(dest_test_worker);
159
test_assert(brain->state == DSYNC_STATE_SYNC_MSGS);
161
/* check that it created/deleted missing mailboxes */
162
test_assert(test_dsync_worker_next_box_event(dest_test_worker, &box_event));
163
test_assert(box_event.type == LAST_BOX_TYPE_DELETE);
164
test_assert(test_dsync_mailbox_delete_equals(&box_event.box, &dest_boxes[8]));
166
test_assert(test_dsync_worker_next_box_event(src_test_worker, &box_event));
167
test_assert(box_event.type == LAST_BOX_TYPE_DELETE);
168
test_assert(test_dsync_mailbox_delete_equals(&box_event.box, &src_boxes[7]));
170
test_assert(test_dsync_worker_next_box_event(dest_test_worker, &box_event));
171
test_assert(box_event.type == LAST_BOX_TYPE_CREATE);
172
test_assert(test_dsync_mailbox_create_equals(&box_event.box, &src_boxes[6]));
174
test_assert(test_dsync_worker_next_box_event(src_test_worker, &box_event));
175
test_assert(box_event.type == LAST_BOX_TYPE_CREATE);
176
test_assert(test_dsync_mailbox_create_equals(&box_event.box, &dest_boxes[6]));
178
test_assert(!test_dsync_worker_next_box_event(src_test_worker, &box_event));
179
test_assert(!test_dsync_worker_next_box_event(dest_test_worker, &box_event));
181
array_sort(&brain->mailbox_sync->mailboxes,
182
dsync_brain_mailbox_name_cmp);
184
/* check mailbox updates */
186
dsync_brain_sync(brain);
187
test_assert(brain->state == DSYNC_STATE_SYNC_UPDATE_MAILBOXES);
188
dsync_brain_sync(brain);
189
test_assert(brain->state == DSYNC_STATE_SYNC_END);
191
brain_boxes = array_get(&brain->mailbox_sync->mailboxes, &count);
192
test_assert(count == 7);
193
for (i = 0; i < 5; i++) {
194
test_assert(dsync_mailboxes_equal(brain_boxes[i].src, &src_boxes[i+1]));
195
test_assert(dsync_mailboxes_equal(brain_boxes[i].dest, &dest_boxes[i+1]));
197
test_assert(dsync_mailboxes_equal(brain_boxes[5].src, &src_boxes[6]));
198
test_assert(brain_boxes[5].dest == NULL);
199
test_assert(brain_boxes[6].src == NULL);
200
test_assert(dsync_mailboxes_equal(brain_boxes[6].dest, &dest_boxes[6]));
202
test_dsync_mailbox_update(&brain_boxes[0].box, &src_boxes[1]);
203
test_dsync_mailbox_update(&brain_boxes[1].box, &dest_boxes[2]);
204
test_dsync_mailbox_update(&brain_boxes[2].box, &dest_boxes[3]);
205
test_dsync_mailbox_update(&brain_boxes[3].box, &src_boxes[4]);
206
test_dsync_mailbox_update(&brain_boxes[4].box, &src_boxes[5]);
207
test_dsync_mailbox_update(&brain_boxes[5].box, &src_boxes[6]);
208
test_dsync_mailbox_update(&brain_boxes[6].box, &dest_boxes[6]);
210
test_assert(!test_dsync_worker_next_box_event(src_test_worker, &box_event));
211
test_assert(!test_dsync_worker_next_box_event(dest_test_worker, &box_event));
213
dsync_brain_deinit(&brain);
214
dsync_worker_deinit(&src_worker);
215
dsync_worker_deinit(&dest_worker);
220
static void test_dsync_brain_full(void)
222
static struct dsync_mailbox boxes[] = {
223
{ "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 2352, 0, ARRAY_INIT },
224
{ NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, 0, ARRAY_INIT }
226
struct dsync_brain *brain;
227
struct dsync_worker *src_worker, *dest_worker;
228
struct test_dsync_box_event box_event;
229
const struct dsync_brain_mailbox *brain_boxes;
232
test_begin("dsync brain full");
234
mailboxes_set_guids(boxes);
236
src_worker = dsync_worker_init_test();
237
dest_worker = dsync_worker_init_test();
238
src_test_worker = (struct test_dsync_worker *)src_worker;
239
dest_test_worker = (struct test_dsync_worker *)dest_worker;
241
brain = dsync_brain_init(src_worker, dest_worker, NULL,
242
DSYNC_BRAIN_FLAG_FULL_SYNC |
243
DSYNC_BRAIN_FLAG_LOCAL);
244
dsync_brain_sync(brain);
246
/* have brain read the mailboxes */
247
mailboxes_send_to_worker(src_test_worker, boxes);
248
mailboxes_send_to_worker(dest_test_worker, boxes);
250
subscriptions_send_to_worker(src_test_worker);
251
subscriptions_send_to_worker(dest_test_worker);
253
test_assert(brain->state == DSYNC_STATE_SYNC_MSGS);
255
test_assert(!test_dsync_worker_next_box_event(src_test_worker, &box_event));
256
test_assert(!test_dsync_worker_next_box_event(dest_test_worker, &box_event));
258
/* check mailbox updates */
260
dsync_brain_sync(brain);
261
test_assert(brain->state == DSYNC_STATE_SYNC_UPDATE_MAILBOXES);
262
dsync_brain_sync(brain);
263
test_assert(brain->state == DSYNC_STATE_SYNC_END);
265
brain_boxes = array_get(&brain->mailbox_sync->mailboxes, &count);
266
test_assert(count == 1);
267
test_assert(dsync_mailboxes_equal(brain_boxes[0].src, &boxes[0]));
268
test_assert(dsync_mailboxes_equal(brain_boxes[0].dest, &boxes[0]));
269
test_dsync_mailbox_update(&brain_boxes[0].box, &boxes[0]);
271
test_assert(!test_dsync_worker_next_box_event(src_test_worker, &box_event));
272
test_assert(!test_dsync_worker_next_box_event(dest_test_worker, &box_event));
274
dsync_brain_deinit(&brain);
275
dsync_worker_deinit(&src_worker);
276
dsync_worker_deinit(&dest_worker);
283
static void (*test_functions[])(void) = {
285
test_dsync_brain_full,
288
return test_run(test_functions);