test-dsync-mailbox-tree-sync.c revision 088bfb6b26ee72122f2ed8a632c741b19d8821d7
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (c) 2013-2016 Dovecot authors, see the included COPYING file */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic struct mail_namespace inbox_namespace = {
d71cd46ede9c57e3947c86c61306a9caddce242cLukas Slebodnik .prefix_len = sizeof(TEST_NAMESPACE_NAME)-1 + 1
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherchar mail_namespace_get_sep(struct mail_namespace *ns ATTR_UNUSED)
deeadf40db3a1eec64cf030e54afc4cb8612a8d5Lukas Slebodnikvoid mailbox_name_get_sha128(const char *name, guid_128_t guid_128_r)
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher memcpy(guid_128_r, sha, I_MIN(GUID_128_SIZE, sizeof(sha)));
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březinanode_create(struct dsync_mailbox_tree *tree, unsigned int counter,
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina const char *name, unsigned int last_renamed_or_created)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher memcpy(node->mailbox_guid, &counter, sizeof(counter));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->existence = DSYNC_MAILBOX_NODE_EXISTS;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->last_renamed_or_created = last_renamed_or_created;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherrandom_node_create(struct dsync_mailbox_tree *tree, unsigned int counter,
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce return node_create(tree, counter, name, rand() % 10);
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnikstatic void nodes_create(struct dsync_mailbox_tree *tree, unsigned int *counter,
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik const char *const *names)
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozekstatic void nodes_delete(struct dsync_mailbox_tree *tree, unsigned int *counter,
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek const char *const *names)
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnikcreate_random_nodes(struct dsync_mailbox_tree *tree, const char *parent_name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int parent_len, i, nodes_count = 1 + rand() % 3;
d921c1eba437662437847279f251a0a5d8f70127Maxim for (i = 0; i < nodes_count; i++) {
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer random_node_create(tree, *counter, str_c(str));
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer create_random_nodes(tree, str_c(str), depth+1, counter);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzerstatic struct dsync_mailbox_tree *create_random_tree(void)
327127bb7fcc07f882209f029e14026de1b23c94Maxim unsigned int counter = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher create_random_nodes(tree, "", 0, &counter);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void test_tree_nodes_fixup(struct dsync_mailbox_node **pos,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (node = *pos; node != NULL; node = node->next) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* the real code will pick one of the GUIDs.
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher we don't really care which one gets picked, so we'll
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher just change them to the same new one */
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagher memcpy(node->mailbox_guid, newguid_counter,
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke if (node->existence == DSYNC_MAILBOX_NODE_DELETED)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->existence = DSYNC_MAILBOX_NODE_NONEXISTENT;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_tree_nodes_fixup(&node->first_child, newguid_counter);
64ea4127f463798410a2c20e0261c6b15f60257fJakub Hrozek if (node->existence != DSYNC_MAILBOX_NODE_EXISTS &&
772464c842968d6e544118ae1aa7c49a7cda2ad6Stephen Gallagher /* nonexistent node, drop it */
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozekstatic void test_tree_fixup(struct dsync_mailbox_tree *tree)
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer test_tree_nodes_fixup(&tree->root.first_child, &newguid_counter);
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozekstatic void nodes_dump(const struct dsync_mailbox_node *node, unsigned int depth)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("%-*s guid:%.5s uidv:%u %d%d %ld\n", 40-depth, node->name,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher guid_128_to_string(node->mailbox_guid), node->uid_validity,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void trees_dump(struct dsync_mailbox_tree *tree1,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void test_trees_nofree(struct dsync_mailbox_tree *tree1,
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose struct dsync_mailbox_tree *orig_tree1, *orig_tree2;
6b0a7c72bb841d6885a620c68bd51d55109b66c7Jakub Hrozek struct dsync_mailbox_node *dup_node1, *dup_node2;
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik const struct dsync_mailbox_tree_sync_change *change;
40b2be4f4312470044cdef460b02b66003f5c85fJakub Hrozek /* test tree1 -> tree2 */
bf54fbed126ec3d459af40ea370ffadacd31c76dJakub Hrozek dsync_mailbox_tree_build_guid_hash(tree1, &dup_node1, &dup_node2);
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov dsync_mailbox_tree_build_guid_hash(tree2, &dup_node1, &dup_node2);
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina ctx = dsync_mailbox_trees_sync_init(tree1, tree2,
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik if (!dsync_mailbox_trees_equal(tree1, tree2)) {
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik /* test tree2 -> tree1 */
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher dsync_mailbox_tree_build_guid_hash(orig_tree1, &dup_node1, &dup_node2);
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik dsync_mailbox_tree_build_guid_hash(orig_tree2, &dup_node1, &dup_node2);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ctx = dsync_mailbox_trees_sync_init(orig_tree2, orig_tree1,
539b1be3507abdf8ac235b06eeed5011b0b5cde2Ondrej Kos while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if (!dsync_mailbox_trees_equal(orig_tree1, orig_tree2)) {
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek /* make sure both directions produced equal trees */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!dsync_mailbox_trees_equal(tree1, orig_tree1)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghertest_tree_nodes_add_namespace(struct dsync_mailbox_node *node,
b50dffea929ee5cd0c59ba3c4822337cc162ff92Kamil Dudka test_tree_nodes_add_namespace(node->first_child, ns);
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozektest_tree_add_namespace(struct dsync_mailbox_tree *tree,
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek node = dsync_mailbox_tree_get(tree, TEST_NAMESPACE_NAME);
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek for (n = node->first_child; n != NULL; n = n->next)
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek test_tree_nodes_add_namespace(&tree->root, ns);
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozekstatic void test_trees(struct dsync_mailbox_tree *tree1,
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek struct dsync_mailbox_tree *tree1_dup, *tree2_dup;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tree2_dup = dsync_mailbox_tree_dup(tree2);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik /* test without namespace prefix */
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik /* test with namespace prefix */
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik test_tree_add_namespace(tree1_dup, &inbox_namespace);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik test_tree_add_namespace(tree2_dup, &inbox_namespace);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnikstatic void test_dsync_mailbox_tree_sync_creates(void)
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik static const char *common_nodes[] = { "foo", "foo/bar", NULL };
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik static const char *create1_nodes[] = { "bar", "foo/baz", NULL };
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik static const char *create2_nodes[] = { "foo/xyz", "foo/bar/3", NULL };
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik unsigned int counter = 0;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_begin("dsync mailbox tree sync creates");
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_create(tree1, &counter, common_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_create(tree1, &counter, create1_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_create(tree2, &counter, create2_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnikstatic void test_dsync_mailbox_tree_sync_deletes(void)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher static const char *common_nodes[] = { "1", "2", "3", "2/s1", "2/s2", "x/y", NULL };
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher static const char *delete1_nodes[] = { "1", "2", NULL };
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik static const char *delete2_nodes[] = { "2/s1", "x/y", NULL };
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik unsigned int counter = 0;
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik test_begin("dsync mailbox tree sync deletes");
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik nodes_create(tree1, &counter, common_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_delete(tree1, &counter, delete1_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_delete(tree2, &counter, delete2_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnikstatic void test_dsync_mailbox_tree_sync_renames1(void)
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik static const char *common_nodes[] = { "1", "2", "3", "2/s1", "2/s2", "x/y", "3/s3", NULL };
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik unsigned int counter = 0;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_begin("dsync mailbox tree sync renames 1");
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_create(tree1, &counter, common_nodes);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node = dsync_mailbox_tree_get(tree1, "3/s3");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dsync_mailbox_tree_node_attach(node, &tree1->root);
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozekstatic void test_dsync_mailbox_tree_sync_renames2(void)
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek test_begin("dsync mailbox tree sync renames 2");
336879aabae137f9a81304f147fb0d43001654b0Simo Sorcestatic void test_dsync_mailbox_tree_sync_renames3(void)
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnikstatic void test_dsync_mailbox_tree_sync_renames4(void)
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik test_begin("dsync mailbox tree sync renames 4");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnikstatic void test_dsync_mailbox_tree_sync_renames5(void)
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik test_begin("dsync mailbox tree sync renames 5");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void test_dsync_mailbox_tree_sync_renames6(void)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_begin("dsync mailbox tree sync renames 6");
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bosestatic void test_dsync_mailbox_tree_sync_renames7(void)
428db8a58c0c149d5efccc6d788f70916c1d34d7Jakub Hrozek test_begin("dsync mailbox tree sync renames 7");
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov tree1 = dsync_mailbox_tree_init('/', '_');
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagherstatic void test_dsync_mailbox_tree_sync_renames8(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames9(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames10(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames11(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames12(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames13(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames14(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames15(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames16(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames17(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames18(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames19(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames20(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames21(void)
test_end();
static void test_dsync_mailbox_tree_sync_renames22(void)
test_end();
static void test_dsync_mailbox_tree_sync_random(void)
test_end();
int main(void)
static void (*test_functions[])(void) = {