test-mail-index-transaction-update.c revision baf3e87e186453fda13bd21f7cbcb2efc8492e8b
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomimail_index_get_header(struct mail_index_view *view ATTR_UNUSED)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenmail_index_lookup(struct mail_index_view *view ATTR_UNUSED,
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainenvoid mail_index_lookup_keywords(struct mail_index_view *view ATTR_UNUSED,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen ARRAY_TYPE(keyword_indexes) *keyword_idx ATTR_UNUSED)
1df39b899804fd1dbc560f75382364822935c857Timo Sirainenbool mail_index_map_get_ext_idx(struct mail_index_map *map ATTR_UNUSED,
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainenuint32_t mail_index_view_get_messages_count(struct mail_index_view *view ATTR_UNUSED)
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainenvoid mail_index_transaction_lookup_latest_keywords(struct mail_index_transaction *t ATTR_UNUSED,
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainen ARRAY_TYPE(keyword_indexes) *keywords ATTR_UNUSED)
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomimail_index_keywords_create_from_indexes(struct mail_index *index ATTR_UNUSED,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_keywords_unref(struct mail_keywords **keywords ATTR_UNUSED)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void mail_index_transaction_cleanup(struct mail_index_transaction *t)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_append_finish_uids(t, 123, &saved_uids_arr);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen saved_uids = array_get(&saved_uids_arr, &count);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(saved_uids[0].seq1 == 123 && saved_uids[0].seq2 == 124);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen /* test with some uids */
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen mail_index_append_finish_uids(t, 125, &saved_uids_arr);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen saved_uids = array_get(&saved_uids_arr, &count);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(saved_uids[0].seq1 == 129 && saved_uids[0].seq2 == 129);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(saved_uids[1].seq1 == 126 && saved_uids[1].seq2 == 126);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(saved_uids[2].seq1 == 130 && saved_uids[2].seq2 == 131);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen test_assert(saved_uids[3].seq1 == 128 && saved_uids[3].seq2 == 128);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainenstatic void test_mail_index_flag_update_fastpath(void)
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen unsigned int count;
4c20178a7f70bfe43d252e50796013aac1d8c74aTimo Sirainen test_begin("mail index flag update fast paths");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_update_flags_range(t, 13, 14, MODIFY_REPLACE,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 15, 15, MODIFY_REPLACE,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 16, 16, MODIFY_ADD,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[0].add_flags == MAIL_DELETED);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen (MAIL_ANSWERED | MAIL_FLAGGED | MAIL_SEEN | MAIL_DRAFT));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[1].add_flags == MAIL_DELETED);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainenstatic void test_mail_index_flag_update_simple_merges(void)
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen unsigned int count;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_begin("mail index flag update simple merges");
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 6, 8, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 5, 6, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 4, 4, MODIFY_ADD,
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen mail_index_update_flags_range(t, 7, 9, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 10, 10, MODIFY_ADD,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(updates[0].add_flags == MAIL_FLAGGED);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_update_flags_range(t, 12, 12, MODIFY_ADD,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_update_flags_range(t, 11, 11, MODIFY_ADD,
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainenstatic void test_mail_index_flag_update_complex_merges(void)
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen unsigned int count;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_begin("mail index flag update complex merges");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_update_flags_range(t, 6, 8, MODIFY_REPLACE,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 3, 6, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 5, 7, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 6, 6, MODIFY_REPLACE,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 5, 10, MODIFY_REMOVE,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 7, 12, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[0].add_flags == MAIL_FLAGGED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[1].add_flags == (MAIL_DRAFT | MAIL_FLAGGED));
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[1].remove_flags == MAIL_ANSWERED);
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen test_assert(updates[2].add_flags == MAIL_SEEN);
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen test_assert(updates[2].remove_flags == (MAIL_ANSWERED | MAIL_FLAGGED | MAIL_DELETED | MAIL_DRAFT));
0d1b8b6bec79746c5d89d57dd8c1688946bd9237Josef 'Jeff' Sipek test_assert(updates[3].add_flags == (MAIL_SEEN | MAIL_DRAFT | MAIL_DELETED));
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen test_assert(updates[3].remove_flags == (MAIL_ANSWERED | MAIL_FLAGGED));
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen test_assert(updates[4].add_flags == (MAIL_SEEN | MAIL_DELETED));
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen test_assert(updates[4].remove_flags == (MAIL_ANSWERED | MAIL_FLAGGED | MAIL_DRAFT));
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen test_assert(updates[5].add_flags == MAIL_DELETED);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[5].remove_flags == MAIL_ANSWERED);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[6].add_flags == MAIL_DELETED);
42401be443f96c91a20fc976d66ca626fa6e14ecTimo Sirainenflags_array_check(struct mail_index_transaction *t,
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen const enum mail_flags *flags, unsigned int msg_count)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[i-1].uid2 < updates[i].uid1);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[i-1].uid2 + 1 != updates[i].uid1 ||
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen updates[i-1].add_flags != updates[i].add_flags ||
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen updates[i-1].remove_flags != updates[i].remove_flags);
1574df6b0bc965212f1152e480e7a762cdaa8226Timo Sirainen test_assert(flags[seq] == updates[i].add_flags);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstatic void test_mail_index_flag_update_random(void)
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen flags = t_new(enum mail_flags, hdr.messages_count + 1);
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen for (r = 0; r < 1000; r++) {
0d1b8b6bec79746c5d89d57dd8c1688946bd9237Josef 'Jeff' Sipek change = rand() % (MAIL_FLAGS_NONRECENT+1);
8752573c44bcd139ae3ecc6d8e917c2c60bcb89fTimo Sirainen (rand() % (hdr.messages_count - seq1)) + seq1;
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen mail_index_update_flags_range(t, seq1, seq2, modify_type,
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen flags_array_check(t, flags, hdr.messages_count);
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainenstatic void test_mail_index_cancel_flag_updates(void)
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen unsigned int count;
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen mail_index_update_flags_range(t, 5, 7, MODIFY_REPLACE, 0);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(updates[0].uid1 == 5 && updates[0].uid2 == 7);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(mail_index_cancel_flag_updates(t, 5));
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(updates[0].uid1 == 6 && updates[0].uid2 == 7);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(mail_index_cancel_flag_updates(t, 7));
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(updates[0].uid1 == 6 && updates[0].uid2 == 6);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(mail_index_cancel_flag_updates(t, 6));
3a7a0c35c9f827f86fb437e640287f3a467ef692Timo Sirainen mail_index_update_flags_range(t, 5, 7, MODIFY_REPLACE, 0);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(mail_index_cancel_flag_updates(t, 6));
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen test_assert(updates[0].uid1 == 5 && updates[0].uid2 == 5);
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen test_assert(updates[1].uid1 == 7 && updates[1].uid2 == 7);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainenstatic void test_mail_index_flag_update_appends(void)
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen unsigned int count;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 5, 6, MODIFY_REPLACE,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 6, 7, MODIFY_ADD,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 5, 7, MODIFY_REMOVE,
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen test_assert(appends[1].flags == (MAIL_SEEN | MAIL_DRAFT));
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen mail_index_update_flags_range(t, 4, 5, MODIFY_ADD,
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen test_assert(appends[0].flags == (MAIL_SEEN | MAIL_ANSWERED));
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(updates[0].add_flags == MAIL_ANSWERED);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic bool test_flag_update_pos(struct mail_index_transaction *t,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen unsigned int i, j, count;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen for (i = 0; i < idx; i++) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (mail_index_transaction_get_flag_update_pos(t, i, j, seq) != idx) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstatic void test_mail_index_transaction_get_flag_update_pos(void)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen test_begin("mail index transaction get flag update pos");
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen mail_index_update_flags_range(t, 1, 1, MODIFY_REPLACE, 0);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_flags_range(t, 3, 4, MODIFY_REPLACE, 0);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_flags_range(t, 6, 7, MODIFY_REPLACE, 0);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_flags_range(t, 9, 10, MODIFY_REPLACE, 0);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenstatic void test_mail_index_modseq_update(void)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen const struct mail_transaction_modseq_update *ups;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen unsigned int count;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_modseq(t, 4, 0x8234fefa02747429ULL);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_modseq(t, 6, 0x1234567890abcdefULL);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen /* modseq=1 updates are ignored: */
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen const struct mail_transaction_expunge_guid *expunges;
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen unsigned int i, count;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen for (i = 0; i < sizeof(guid2); i++) {
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(memcmp(expunges[0].guid_128, guid4, sizeof(guid4)) == 0);
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(memcmp(expunges[1].guid_128, guid2, sizeof(guid2)) == 0);
093b42b11c1236a687d3da564b26a324e2189ae6Timo Sirainen test_assert(memcmp(expunges[2].guid_128, guid3, sizeof(guid3)) == 0);
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen test_assert(memcmp(expunges[3].guid_128, empty_guid, sizeof(empty_guid)) == 0);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(memcmp(expunges[4].guid_128, empty_guid, sizeof(empty_guid)) == 0);
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen static void (*const test_functions[])(void) = {