test-dsync-mailbox-tree-sync.c revision 088bfb6b26ee72122f2ed8a632c741b19d8821d7
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (c) 2013-2016 Dovecot authors, see the included COPYING file */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher#include "lib.h"
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose#include "sha1.h"
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher#include "str.h"
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose#include "mailbox-list-private.h"
703dc1eb5b050b24235a6640f271d34ea008cf98Jan Engelhardt#include "dsync-mailbox-tree-private.h"
703dc1eb5b050b24235a6640f271d34ea008cf98Jan Engelhardt#include "test-common.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#include <stdio.h>
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#define MAX_DEPTH 4
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose#define TEST_NAMESPACE_NAME "INBOX"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic struct mail_namespace inbox_namespace = {
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher .prefix = TEST_NAMESPACE_NAME"/",
d71cd46ede9c57e3947c86c61306a9caddce242cLukas Slebodnik .prefix_len = sizeof(TEST_NAMESPACE_NAME)-1 + 1
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
002f84aea86371aa079b867c0ec39396b97109d3Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherchar mail_namespace_get_sep(struct mail_namespace *ns ATTR_UNUSED)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return '/';
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek}
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek
deeadf40db3a1eec64cf030e54afc4cb8612a8d5Lukas Slebodnikvoid mailbox_name_get_sha128(const char *name, guid_128_t guid_128_r)
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnik{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned char sha[SHA1_RESULTLEN];
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
f0ea3ed816182fadf77f3e7f7ddb298b287007adLukas Slebodnik sha1_get_digest(name, strlen(name), sha);
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher memcpy(guid_128_r, sha, I_MIN(GUID_128_SIZE, sizeof(sha)));
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher}
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagherstatic struct dsync_mailbox_node *
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březinanode_create(struct dsync_mailbox_tree *tree, unsigned int counter,
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina const char *name, unsigned int last_renamed_or_created)
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina{
c481179da5d5b53ce16d8784c0bd2857ffc2f061Lukas Slebodnik struct dsync_mailbox_node *node;
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher
002f84aea86371aa079b867c0ec39396b97109d3Lukas Slebodnik node = dsync_mailbox_tree_get(tree, name);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher memcpy(node->mailbox_guid, &counter, sizeof(counter));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->uid_validity = counter;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->existence = DSYNC_MAILBOX_NODE_EXISTS;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->last_renamed_or_created = last_renamed_or_created;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return node;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic struct dsync_mailbox_node *
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherrandom_node_create(struct dsync_mailbox_tree *tree, unsigned int counter,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *name)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce return node_create(tree, counter, name, rand() % 10);
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce}
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnikstatic void nodes_create(struct dsync_mailbox_tree *tree, unsigned int *counter,
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik const char *const *names)
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek{
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek for (; *names != NULL; names++) {
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek *counter += 1;
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce node_create(tree, *counter, *names, 0);
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce }
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek}
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozekstatic void nodes_delete(struct dsync_mailbox_tree *tree, unsigned int *counter,
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek const char *const *names)
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek{
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek struct dsync_mailbox_node *node;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek for (; *names != NULL; names++) {
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek *counter += 1;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek node = node_create(tree, *counter, *names, 0);
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek node->existence = DSYNC_MAILBOX_NODE_DELETED;
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek }
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek}
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozekstatic void
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnikcreate_random_nodes(struct dsync_mailbox_tree *tree, const char *parent_name,
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik unsigned int depth, unsigned int *counter)
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int parent_len, i, nodes_count = 1 + rand() % 3;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher string_t *str;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (depth == MAX_DEPTH)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher str = t_str_new(32);
d921c1eba437662437847279f251a0a5d8f70127Maxim if (*parent_name != '\0')
d921c1eba437662437847279f251a0a5d8f70127Maxim str_printfa(str, "%s/", parent_name);
d921c1eba437662437847279f251a0a5d8f70127Maxim parent_len = str_len(str);
d921c1eba437662437847279f251a0a5d8f70127Maxim
d921c1eba437662437847279f251a0a5d8f70127Maxim for (i = 0; i < nodes_count; i++) {
d921c1eba437662437847279f251a0a5d8f70127Maxim *counter += 1;
d921c1eba437662437847279f251a0a5d8f70127Maxim str_truncate(str, parent_len);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer str_printfa(str, "%u.%u", depth, i);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer random_node_create(tree, *counter, str_c(str));
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer create_random_nodes(tree, str_c(str), depth+1, counter);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer }
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer}
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzerstatic struct dsync_mailbox_tree *create_random_tree(void)
327127bb7fcc07f882209f029e14026de1b23c94Maxim{
327127bb7fcc07f882209f029e14026de1b23c94Maxim struct dsync_mailbox_tree *tree;
327127bb7fcc07f882209f029e14026de1b23c94Maxim unsigned int counter = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tree = dsync_mailbox_tree_init('/', '_');
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher create_random_nodes(tree, "", 0, &counter);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return tree;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void test_tree_nodes_fixup(struct dsync_mailbox_node **pos,
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce unsigned int *newguid_counter)
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozek{
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozek struct dsync_mailbox_node *node;
07d82f79d2970a08628ebf71343441ec55faa6faPavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (node = *pos; node != NULL; node = node->next) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (node->sync_delayed_guid_change) {
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,
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Bose sizeof(*newguid_counter));
03713859dffacc7142393e53c73d8d4cf7dee8d5Pavel Březina node->uid_validity = *newguid_counter;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik *newguid_counter += 1;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik }
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 &&
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->first_child == NULL) {
772464c842968d6e544118ae1aa7c49a7cda2ad6Stephen Gallagher /* nonexistent node, drop it */
32381402a4a9afc003782c9e2301fc59c9bda2a9Yassir Elley *pos = node->next;
068dbee9ca7bf5b37330eff91c94ae10f288d09fJakub Hrozek } else {
98ce3c3e85a4bb2e1822bf8ab2a1c2ab9e3dd61dJakub Hrozek pos = &node->next;
be65f065fef1d387281096ef095a2acef39ecc12Jakub Hrozek }
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozek }
f36078af138f052cd9a30360867b0ebd0805af5eJakub Hrozek}
34c78b745eb349eef2b0f13ef2b722632aebe619Jan Cholasta
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozekstatic void test_tree_fixup(struct dsync_mailbox_tree *tree)
e07a94a66985b674c5df11ca466792902164c4e2George McCollister{
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek unsigned int newguid_counter = INT_MAX;
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer test_tree_nodes_fixup(&tree->root.first_child, &newguid_counter);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer}
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose
bc13c352ba9c2877f1e9bc62e55ad60fc000a55dJakub Hrozekstatic void nodes_dump(const struct dsync_mailbox_node *node, unsigned int depth)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (; node != NULL; node = node->next) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < depth; i++) printf(" ");
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 Gallagher node->existence, node->subscribed,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (long)node->last_renamed_or_created);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher nodes_dump(node->first_child, depth+1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void trees_dump(struct dsync_mailbox_tree *tree1,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct dsync_mailbox_tree *tree2)
a5077712fc8c24e8cad08207b7b5a6603bde6a7cJakub Hrozek{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("tree1:\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher nodes_dump(tree1->root.first_child, 1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher printf("tree2:\n");
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher nodes_dump(tree2->root.first_child, 1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void test_trees_nofree(struct dsync_mailbox_tree *tree1,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct dsync_mailbox_tree **_tree2)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek struct dsync_mailbox_tree *tree2 = *_tree2;
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose struct dsync_mailbox_tree *orig_tree1, *orig_tree2;
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke struct dsync_mailbox_tree_sync_ctx *ctx;
6b0a7c72bb841d6885a620c68bd51d55109b66c7Jakub Hrozek struct dsync_mailbox_node *dup_node1, *dup_node2;
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik const struct dsync_mailbox_tree_sync_change *change;
0e1dcef53d9d8465ce97d31ad11be4445a6e7eb8Lukas Slebodnik
c3889e5a101a075defe533d81f5296d5e680f639Lukas Slebodnik orig_tree1 = dsync_mailbox_tree_dup(tree1);
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina orig_tree2 = dsync_mailbox_tree_dup(tree2);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
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 DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY,
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG);
3fc158e59eebbc2f538fe0076a03928d0d4eab9fPavel Březina while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher }
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher dsync_mailbox_trees_sync_deinit(&ctx);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher test_tree_fixup(tree1);
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik test_tree_fixup(tree2);
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik if (!dsync_mailbox_trees_equal(tree1, tree2)) {
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik test_assert(FALSE);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher trees_dump(tree1, tree2);
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik }
9dbdf62243f01f6aee41c2b5f2976c56da47f25dLukas Slebodnik
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 DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY, 0);
539b1be3507abdf8ac235b06eeed5011b0b5cde2Ondrej Kos while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos }
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos dsync_mailbox_trees_sync_deinit(&ctx);
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos test_tree_fixup(orig_tree1);
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos test_tree_fixup(orig_tree2);
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek if (!dsync_mailbox_trees_equal(orig_tree1, orig_tree2)) {
e6e26182d58c05d896f72f2925426658a6dc70b5Jakub Hrozek test_assert(FALSE);
e6e26182d58c05d896f72f2925426658a6dc70b5Jakub Hrozek trees_dump(orig_tree1, orig_tree2);
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher }
e6e26182d58c05d896f72f2925426658a6dc70b5Jakub Hrozek
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek /* make sure both directions produced equal trees */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!dsync_mailbox_trees_equal(tree1, orig_tree1)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_assert(FALSE);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher trees_dump(tree1, orig_tree1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dsync_mailbox_tree_deinit(_tree2);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dsync_mailbox_tree_deinit(&orig_tree1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dsync_mailbox_tree_deinit(&orig_tree2);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghertest_tree_nodes_add_namespace(struct dsync_mailbox_node *node,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_namespace *ns)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (; node != NULL; node = node->next) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->ns = ns;
b50dffea929ee5cd0c59ba3c4822337cc162ff92Kamil Dudka test_tree_nodes_add_namespace(node->first_child, ns);
b50dffea929ee5cd0c59ba3c4822337cc162ff92Kamil Dudka }
b50dffea929ee5cd0c59ba3c4822337cc162ff92Kamil Dudka}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozektest_tree_add_namespace(struct dsync_mailbox_tree *tree,
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek struct mail_namespace *ns)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek struct dsync_mailbox_node *node, *n;
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek node = dsync_mailbox_tree_get(tree, TEST_NAMESPACE_NAME);
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek node->existence = DSYNC_MAILBOX_NODE_EXISTS;
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek i_assert(tree->root.first_child == node);
d9378e64499642e86989158f274372187314d5b2Lukas Slebodnik i_assert(node->first_child == NULL);
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek node->first_child = node->next;
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek for (n = node->first_child; n != NULL; n = n->next)
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek n->parent = node;
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek node->next = NULL;
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek test_tree_nodes_add_namespace(&tree->root, ns);
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek}
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozekstatic void test_trees(struct dsync_mailbox_tree *tree1,
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek struct dsync_mailbox_tree *tree2)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
4d81fe27ced3d2e96866aeaf61661a925cb8edf1Jakub Hrozek struct dsync_mailbox_tree *tree1_dup, *tree2_dup;
8b1f525acd20f36c836e827de3c251088961c5d9Stephen Gallagher
f5b6f977d4144c28e9c66f3f1c9d634d595d1117Marko Myllynen tree1_dup = dsync_mailbox_tree_dup(tree1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher tree2_dup = dsync_mailbox_tree_dup(tree2);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik /* test without namespace prefix */
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik test_trees_nofree(tree1, &tree2);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik dsync_mailbox_tree_deinit(&tree1);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik
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);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_trees_nofree(tree1_dup, &tree2_dup);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik dsync_mailbox_tree_deinit(&tree1_dup);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik}
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnikstatic void test_dsync_mailbox_tree_sync_creates(void)
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik{
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 };
dc4c30bae512c0b45ff925d9e998337f8fe97e94Lukas Slebodnik struct dsync_mailbox_tree *tree1, *tree2;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik unsigned int counter = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_begin("dsync mailbox tree sync creates");
72e60fd4eabcfbcdbfe01e8c38b94052bc6c2067Jakub Hrozek tree1 = dsync_mailbox_tree_init('/', '_');
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_create(tree1, &counter, common_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik tree2 = dsync_mailbox_tree_dup(tree1);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_create(tree1, &counter, create1_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_create(tree2, &counter, create2_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_trees(tree1, tree2);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_end();
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik}
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnikstatic void test_dsync_mailbox_tree_sync_deletes(void)
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik{
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 struct dsync_mailbox_tree *tree1, *tree2;
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik unsigned int counter = 0;
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik test_begin("dsync mailbox tree sync deletes");
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik tree1 = dsync_mailbox_tree_init('/', '_');
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik nodes_create(tree1, &counter, common_nodes);
827dd342494de18099dddd0272c1a85f10703556Lukas Slebodnik tree2 = dsync_mailbox_tree_dup(tree1);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_delete(tree1, &counter, delete1_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_delete(tree2, &counter, delete2_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_trees(tree1, tree2);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_end();
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik}
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnikstatic void test_dsync_mailbox_tree_sync_renames1(void)
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik{
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik static const char *common_nodes[] = { "1", "2", "3", "2/s1", "2/s2", "x/y", "3/s3", NULL };
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik struct dsync_mailbox_tree *tree1, *tree2;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik struct dsync_mailbox_node *node;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik unsigned int counter = 0;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik test_begin("dsync mailbox tree sync renames 1");
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik tree1 = dsync_mailbox_tree_init('/', '_');
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik nodes_create(tree1, &counter, common_nodes);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik tree2 = dsync_mailbox_tree_dup(tree1);
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik node = dsync_mailbox_tree_get(tree1, "1");
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik node->name = "a";
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik node->last_renamed_or_created = 1000;
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik node = dsync_mailbox_tree_get(tree2, "2");
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov node->name = "b";
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov node->last_renamed_or_created = 1000;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node = dsync_mailbox_tree_get(tree1, "3/s3");
3d038d2e0dc7af04ec2f7c85ae325accb39f6237Jakub Hrozek node->name = "z";
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node->last_renamed_or_created = 1000;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dsync_mailbox_tree_node_detach(node);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dsync_mailbox_tree_node_attach(node, &tree1->root);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_trees(tree1, tree2);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_end();
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek}
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozekstatic void test_dsync_mailbox_tree_sync_renames2(void)
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek{
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek struct dsync_mailbox_tree *tree1, *tree2;
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek test_begin("dsync mailbox tree sync renames 2");
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek tree1 = dsync_mailbox_tree_init('/', '_');
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozek tree2 = dsync_mailbox_tree_init('/', '_');
e07a94a66985b674c5df11ca466792902164c4e2George McCollister
e07a94a66985b674c5df11ca466792902164c4e2George McCollister node_create(tree1, 1, "0/1", 1);
e07a94a66985b674c5df11ca466792902164c4e2George McCollister node_create(tree1, 2, "0/1/2", 3);
bf01e8179cbb2be476805340636098deda7e1366Sumit Bose
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose node_create(tree2, 1, "0", 0);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose node_create(tree2, 2, "0/1/2", 0);
0d5bb38364a6976e9c85d6349aa13a04d181a090Sumit Bose
172c07013d1ea99447a780fd36f49d5c3a76981bJakub Hrozek test_trees(tree1, tree2);
9917c138d9a270deb5820915384fbde751190c2aLukas Slebodnik test_end();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce
336879aabae137f9a81304f147fb0d43001654b0Simo Sorcestatic void test_dsync_mailbox_tree_sync_renames3(void)
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce{
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce struct dsync_mailbox_tree *tree1, *tree2;
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce test_begin("dsync mailbox tree sync renames 3");
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce tree1 = dsync_mailbox_tree_init('/', '_');
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce tree2 = dsync_mailbox_tree_init('/', '_');
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce node_create(tree1, 1, "0/2", 1);
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce node_create(tree1, 2, "0/3", 1);
336879aabae137f9a81304f147fb0d43001654b0Simo Sorce
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik node_create(tree2, 1, "0/4/5", 0);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik node_create(tree2, 2, "1", 0);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik test_trees(tree1, tree2);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik test_end();
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik}
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnikstatic void test_dsync_mailbox_tree_sync_renames4(void)
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik{
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik struct dsync_mailbox_tree *tree1, *tree2;
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik test_begin("dsync mailbox tree sync renames 4");
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik tree1 = dsync_mailbox_tree_init('/', '_');
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik tree2 = dsync_mailbox_tree_init('/', '_');
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik node_create(tree1, 1, "0/b", 0);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik node_create(tree1, 2, "c", 2);
aac071824f6c98003f30d49ab440c15b4b53692cLukas Slebodnik
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik node_create(tree2, 2, "0/a", 0);
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik test_trees(tree1, tree2);
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik test_end();
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik}
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnikstatic void test_dsync_mailbox_tree_sync_renames5(void)
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik{
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik struct dsync_mailbox_tree *tree1, *tree2;
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik test_begin("dsync mailbox tree sync renames 5");
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik tree1 = dsync_mailbox_tree_init('/', '_');
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik tree2 = dsync_mailbox_tree_init('/', '_');
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik node_create(tree1, 1, "b", 0);
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik node_create(tree1, 2, "c", 2);
356eef72675cde4dc5627c1e2f1a01846ec6eb1dLukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node_create(tree2, 2, "0/a", 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_trees(tree1, tree2);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_end();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void test_dsync_mailbox_tree_sync_renames6(void)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct dsync_mailbox_tree *tree1, *tree2;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_begin("dsync mailbox tree sync renames 6");
1c7f25390572025baa6783ede14523e22fc73043Lukas Slebodnik tree1 = dsync_mailbox_tree_init('/', '_');
40b2be4f4312470044cdef460b02b66003f5c85fJakub Hrozek tree2 = dsync_mailbox_tree_init('/', '_');
40b2be4f4312470044cdef460b02b66003f5c85fJakub Hrozek
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher node_create(tree1, 1, "0/1", 0);
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov node_create(tree1, 2, "0/2", 1);
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher node_create(tree2, 1, "0", 1);
8c294c1cd4d721818a59684cf7f2b36123f79163Stephen Gallagher node_create(tree2, 2, "0/3", 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_trees(tree1, tree2);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_end();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bosestatic void test_dsync_mailbox_tree_sync_renames7(void)
a8d887323f83984679a7d9b827a70146656bb7b2Sumit Bose{
96c73559adfbdac96720008fc022cb1d540b53c3Jakub Hrozek struct dsync_mailbox_tree *tree1, *tree2;
9542512d7be40f2000298c86d3d2b728f4f0f65aStephen Gallagher
428db8a58c0c149d5efccc6d788f70916c1d34d7Jakub Hrozek test_begin("dsync mailbox tree sync renames 7");
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov tree1 = dsync_mailbox_tree_init('/', '_');
70e59ed31c5a9c9ed02d9065ddf92be87c887efbJakub Hrozek tree2 = dsync_mailbox_tree_init('/', '_');
a6098862048d4bb469130b9ff21be3020d6f2c54Sumit Bose
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose node_create(tree1, 1, "0/2", 0);
2a9af1f71887f02935e2fb6ad5023afba5b6d43eSumit Bose node_create(tree2, 1, "1/2", 0);
f3c85d900c4663854cc7bbae7d9f77867ed1f69bSumit Bose
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina test_trees(tree1, tree2);
a7e27c11866a48742bb70564b88e15bf15e9367dPavel Březina test_end();
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagher}
1a59af8245f183f22d87d067a90197d8e2ea958dJakub Hrozek
f1ce53a3b5656361557f80f61dfd42a371230c65Stephen Gallagherstatic void test_dsync_mailbox_tree_sync_renames8(void)
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 8");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "0/1", 0);
node_create(tree1, 2, "0/2", 1);
node_create(tree2, 1, "0", 1);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames9(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 9");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "0/1/2", 0);
node_create(tree1, 2, "0/3", 1);
node_create(tree2, 1, "0", 1);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames10(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 10");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "0/1", 0);
node_create(tree1, 3, "0/2/3", 0);
node_create(tree2, 1, "0", 1);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames11(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 11");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "0/1", 2);
node_create(tree1, 0, "0/1/2", 0);
node_create(tree2, 1, "0", 1);
node_create(tree2, 0, "0/1/2", 0);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames12(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 12");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "0/2", 0);
node_create(tree1, 2, "1", 0);
node_create(tree1, 3, "1/4", 0);
node_create(tree1, 4, "1/4/5", 1);
node_create(tree2, 1, "1", 2);
node_create(tree2, 2, "1/4", 3);
node_create(tree2, 3, "1/4/6", 4);
node_create(tree2, 4, "1/3", 0);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames13(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 13");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 4, "0.0/1.0/2.1", 0);
node_create(tree1, 5, "0.1", 2);
node_create(tree1, 6, "0.1/1.0", 2);
node_create(tree1, 7, "0.1/1.0/2.0", 8);
node_create(tree2, 5, "0.1/1.0", 5);
node_create(tree2, 6, "0.1/1.0/2.0", 8);
node_create(tree2, 7, "0.1/1.1", 1);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames14(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 14");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "1", 0);
node_create(tree1, 2, "1/2", 0);
node_create(tree1, 3, "1/2/4", 1);
node_create(tree2, 1, "1/2", 3);
node_create(tree2, 2, "1/2/5", 4);
node_create(tree2, 3, "1/2/4", 0);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames15(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 15");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "1", 0);
node_create(tree2, 2, "1", 1);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames16(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 16");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "1/2", 4);
node_create(tree1, 2, "1", 2);
node_create(tree2, 1, "2", 1);
node_create(tree2, 2, "1/2", 3);
node_create(tree2, 3, "1", 5);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames17(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 17");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "1", 1);
node_create(tree2, 1, "1/2", 0);
node_create(tree2, 2, "1", 2);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames18(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 18");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 2, "a", 5);
node_create(tree1, 4, "a/c", 2);
node_create(tree1, 5, "b", 6);
node_create(tree2, 1, "a", 7);
node_create(tree2, 2, "b", 3);
node_create(tree2, 3, "b/c", 4);
node_create(tree2, 4, "d", 1);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames19(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 19");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "0/2/1", 1);
node_create(tree1, 2, "0/4", 3);
node_create(tree1, 3, "0/2", 2);
node_create(tree2, 1, "1", 0);
node_create(tree2, 2, "1/3", 4);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames20(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 20");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "1", 0);
node_create(tree1, 2, "0", 0);
node_create(tree1, 3, "0/2", 0);
/* rename 0 -> 1/0 */
node_create(tree2, 1, "1", 0);
node_create(tree2, 2, "1/0", 1);
node_create(tree2, 3, "1/0/2", 0);
test_trees_nofree(tree1, &tree2);
test_assert(tree1->root.first_child != NULL &&
tree1->root.first_child->next == NULL);
dsync_mailbox_tree_deinit(&tree1);
test_end();
}
static void test_dsync_mailbox_tree_sync_renames21(void)
{
#if 0
/* FIXME: we can't currently test this without crashing */
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 21");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 1, "INBOX", 0);
node_create(tree1, 2, "foo", 0);
/* swap INBOX and foo - the INBOX name is important since it's
treated specially */
node_create(tree2, 1, "foo", 0);
node_create(tree2, 2, "INBOX", 1);
test_trees(tree1, tree2);
test_end();
#endif
}
static void test_dsync_mailbox_tree_sync_renames22(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync renames 22");
tree1 = dsync_mailbox_tree_init('/', '_');
tree2 = dsync_mailbox_tree_init('/', '_');
node_create(tree1, 3, "p/a", 0);
node_create(tree1, 0, "p/2", 0);
node_create(tree1, 5, "p/2/h", 0);
node_create(tree2, 4, "p/1/z", 0);
node_create(tree2, 1, "p/2", 0);
node_create(tree2, 2, "p/2/a", 0);
node_create(tree2, 5, "p/2/y", 0);
node_create(tree2, 3, "p/3", 0);
test_trees(tree1, tree2);
test_end();
}
static void test_dsync_mailbox_tree_sync_random(void)
{
struct dsync_mailbox_tree *tree1, *tree2;
test_begin("dsync mailbox tree sync random");
tree1 = create_random_tree();
tree2 = create_random_tree();
test_trees(tree1, tree2);
test_end();
}
int main(void)
{
static void (*test_functions[])(void) = {
test_dsync_mailbox_tree_sync_creates,
test_dsync_mailbox_tree_sync_deletes,
test_dsync_mailbox_tree_sync_renames1,
test_dsync_mailbox_tree_sync_renames2,
test_dsync_mailbox_tree_sync_renames3,
test_dsync_mailbox_tree_sync_renames4,
test_dsync_mailbox_tree_sync_renames5,
test_dsync_mailbox_tree_sync_renames6,
test_dsync_mailbox_tree_sync_renames7,
test_dsync_mailbox_tree_sync_renames8,
test_dsync_mailbox_tree_sync_renames9,
test_dsync_mailbox_tree_sync_renames10,
test_dsync_mailbox_tree_sync_renames11,
test_dsync_mailbox_tree_sync_renames12,
test_dsync_mailbox_tree_sync_renames13,
test_dsync_mailbox_tree_sync_renames14,
test_dsync_mailbox_tree_sync_renames15,
test_dsync_mailbox_tree_sync_renames16,
test_dsync_mailbox_tree_sync_renames17,
test_dsync_mailbox_tree_sync_renames18,
test_dsync_mailbox_tree_sync_renames19,
test_dsync_mailbox_tree_sync_renames20,
test_dsync_mailbox_tree_sync_renames21,
test_dsync_mailbox_tree_sync_renames22,
test_dsync_mailbox_tree_sync_random,
NULL
};
return test_run(test_functions);
}