test-mail-index-transaction-update.c revision baf3e87e186453fda13bd21f7cbcb2efc8492e8b
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "lib.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "array.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "test-common.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "mail-index-private.h"
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen#include "mail-index-transaction-private.h"
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainen
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainen
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomistatic struct mail_index_header hdr;
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomistatic struct mail_index_record rec;
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomi
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomiconst struct mail_index_header *
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomimail_index_get_header(struct mail_index_view *view ATTR_UNUSED)
de92873c366becfaea1554642f89b9169d7955e2Timo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return &hdr;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenconst struct mail_index_record *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenmail_index_lookup(struct mail_index_view *view ATTR_UNUSED,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t seq ATTR_UNUSED)
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainen{
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomi return &rec;
4fe3f07477bae6da3fb8d8fa9bab10ab82ada2bdTimo Sirainen}
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainenvoid mail_index_lookup_keywords(struct mail_index_view *view ATTR_UNUSED,
4865df74dad010a65ab63734b3ca1349ce38dc57Timo Sirainen uint32_t seq ATTR_UNUSED,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen ARRAY_TYPE(keyword_indexes) *keyword_idx ATTR_UNUSED)
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen{
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen array_clear(keyword_idx);
4fe3f07477bae6da3fb8d8fa9bab10ab82ada2bdTimo Sirainen}
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen
1df39b899804fd1dbc560f75382364822935c857Timo Sirainenbool mail_index_map_get_ext_idx(struct mail_index_map *map ATTR_UNUSED,
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen uint32_t ext_id ATTR_UNUSED,
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen uint32_t *idx_r ATTR_UNUSED)
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen{
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen return FALSE;
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen}
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainenuint32_t mail_index_view_get_messages_count(struct mail_index_view *view ATTR_UNUSED)
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen{
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen return hdr.messages_count;
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen}
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainen
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainenvoid mail_index_transaction_lookup_latest_keywords(struct mail_index_transaction *t ATTR_UNUSED,
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainen uint32_t seq ATTR_UNUSED,
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainen ARRAY_TYPE(keyword_indexes) *keywords ATTR_UNUSED)
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainen{
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainen}
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainen
c3a2a487e23a282e59254b82deb9344ed0306bb2Timo Sirainenstruct mail_keywords *
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomimail_index_keywords_create_from_indexes(struct mail_index *index ATTR_UNUSED,
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomi const ARRAY_TYPE(keyword_indexes)
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomi *keyword_indexes ATTR_UNUSED)
cf7857bce68a33cdabe88bb15568e21921eb5ac7Aki Tuomi{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return NULL;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
db623deb12c3566618faba5a35a44ceed83c3dc0Martti Rannanjärvi
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid mail_index_keywords_unref(struct mail_keywords **keywords ATTR_UNUSED)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
db623deb12c3566618faba5a35a44ceed83c3dc0Martti Rannanjärvi}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic struct mail_index_transaction *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenmail_index_transaction_new(void)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_index_transaction *t;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen t = t_new(struct mail_index_transaction, 1);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen t->first_new_seq = hdr.messages_count + 1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return t;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void mail_index_transaction_cleanup(struct mail_index_transaction *t)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
a356c4736fe6041142c6096045bc00c15a80af4eTimo Sirainen if (array_is_created(&t->appends))
a356c4736fe6041142c6096045bc00c15a80af4eTimo Sirainen array_free(&t->appends);
a356c4736fe6041142c6096045bc00c15a80af4eTimo Sirainen if (array_is_created(&t->updates))
a356c4736fe6041142c6096045bc00c15a80af4eTimo Sirainen array_free(&t->updates);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (array_is_created(&t->modseq_updates))
a356c4736fe6041142c6096045bc00c15a80af4eTimo Sirainen array_free(&t->modseq_updates);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (array_is_created(&t->expunges))
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen array_free(&t->expunges);
c4900d31385344bfadaee53a897daeafdb3063d8Timo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void test_mail_index_append(void)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen{
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mail_index_transaction *t;
34a45b80c8ed18861c6e343fe40adbe360fc6badTimo Sirainen const struct mail_index_record *appends;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ARRAY_TYPE(seq_range) saved_uids_arr;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct seq_range *saved_uids;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen uint32_t seq;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen hdr.messages_count = 4;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen t = mail_index_transaction_new();
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_begin("mail index append");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_append(t, 0, &seq);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(t->log_updates);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(seq == 5);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_append(t, 0, &seq);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(seq == 6);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(!t->appends_nonsorted);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen t_array_init(&saved_uids_arr, 128);
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(count == 1);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(saved_uids[0].seq1 == 123 && saved_uids[0].seq2 == 124);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen appends = array_get(&t->appends, &count);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(appends[0].uid == 123);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(appends[0].flags == 0);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(appends[1].uid == 124);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen test_assert(appends[1].flags == 0);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen test_end();
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen mail_index_transaction_cleanup(t);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen /* test with some uids */
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen t = mail_index_transaction_new();
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen test_begin("mail index append with uids");
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen mail_index_append(t, 0, &seq);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen test_assert(seq == 5);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen mail_index_append(t, 126, &seq);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen test_assert(seq == 6);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen test_assert(!t->appends_nonsorted);
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen mail_index_append(t, 124, &seq);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(seq == 7);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen test_assert(t->appends_nonsorted);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen mail_index_append(t, 0, &seq);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(seq == 8);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen mail_index_append(t, 128, &seq);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(seq == 9);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(t->highest_append_uid == 128);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen
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(count == 4);
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 Sirainen
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen appends = array_get(&t->appends, &count);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(count == 5);
e9d302dceba09ceefa0aaddf7eafafd760cd1736Timo Sirainen test_assert(appends[0].uid == 129);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen test_assert(appends[1].uid == 126);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen test_assert(appends[2].uid == 130);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(appends[3].uid == 131);
009217abb57a24a4076092e8e4e165545747839eStephan Bosch test_assert(appends[4].uid == 128);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_end();
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
caae18c876f81e261350e4957471efa453c0ea9fTimo Sirainen mail_index_transaction_cleanup(t);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen}
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainenstatic void test_mail_index_flag_update_fastpath(void)
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen{
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen struct mail_index_transaction *t;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct mail_index_flag_update *updates;
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen unsigned int count;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen hdr.messages_count = 20;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen t = mail_index_transaction_new();
4c20178a7f70bfe43d252e50796013aac1d8c74aTimo Sirainen
4c20178a7f70bfe43d252e50796013aac1d8c74aTimo Sirainen test_begin("mail index flag update fast paths");
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_update_flags_range(t, 13, 14, MODIFY_REPLACE,
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen MAIL_DELETED);
4fe3f07477bae6da3fb8d8fa9bab10ab82ada2bdTimo Sirainen test_assert(t->last_update_idx == 0);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(array_count(&t->updates) == 1);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 15, 15, MODIFY_REPLACE,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen MAIL_DELETED);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(t->last_update_idx == 0);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(array_count(&t->updates) == 1);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 16, 16, MODIFY_ADD,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen MAIL_DELETED);
42401be443f96c91a20fc976d66ca626fa6e14ecTimo Sirainen test_assert(t->last_update_idx == 1);
42401be443f96c91a20fc976d66ca626fa6e14ecTimo Sirainen test_assert(array_count(&t->updates) == 2);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
42401be443f96c91a20fc976d66ca626fa6e14ecTimo Sirainen updates = array_get(&t->updates, &count);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[0].uid1 == 13);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[0].uid2 == 15);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[0].add_flags == MAIL_DELETED);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[0].remove_flags ==
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen (MAIL_ANSWERED | MAIL_FLAGGED | MAIL_SEEN | MAIL_DRAFT));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[1].uid1 == 16);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[1].uid2 == 16);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[1].add_flags == MAIL_DELETED);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[1].remove_flags == 0);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(!t->log_updates);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_end();
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen mail_index_transaction_cleanup(t);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen}
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainenstatic void test_mail_index_flag_update_simple_merges(void)
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen{
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen struct mail_index_transaction *t;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen const struct mail_index_flag_update *updates;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen unsigned int count;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen hdr.messages_count = 20;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen t = mail_index_transaction_new();
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_begin("mail index flag update simple merges");
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 6, 8, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_FLAGGED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(t->last_update_idx == 0);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 5, 6, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_FLAGGED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(t->last_update_idx == 0);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 4, 4, MODIFY_ADD,
0d1b8b6bec79746c5d89d57dd8c1688946bd9237Josef 'Jeff' Sipek MAIL_FLAGGED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(t->last_update_idx == 0);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen mail_index_update_flags_range(t, 7, 9, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_FLAGGED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(t->last_update_idx == 0);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 10, 10, MODIFY_ADD,
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen MAIL_FLAGGED);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen updates = array_get(&t->updates, &count);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(count == 1);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(updates[0].uid1 == 4);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(updates[0].uid2 == 10);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(updates[0].add_flags == MAIL_FLAGGED);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(updates[0].remove_flags == 0);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_update_flags_range(t, 12, 12, MODIFY_ADD,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen MAIL_FLAGGED);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_update_flags_range(t, 11, 11, MODIFY_ADD,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen MAIL_FLAGGED);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen updates = array_get(&t->updates, &count);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(count == 1);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[0].uid1 == 4);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(updates[0].uid2 == 12);
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen test_end();
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen mail_index_transaction_cleanup(t);
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen}
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainenstatic void test_mail_index_flag_update_complex_merges(void)
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen{
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen struct mail_index_transaction *t;
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen const struct mail_index_flag_update *updates;
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen unsigned int count;
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen hdr.messages_count = 20;
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen t = mail_index_transaction_new();
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_begin("mail index flag update complex merges");
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen mail_index_update_flags_range(t, 6, 8, MODIFY_REPLACE,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_SEEN);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 3, 6, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_FLAGGED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 5, 7, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_DRAFT);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 6, 6, MODIFY_REPLACE,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_SEEN | MAIL_ANSWERED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 5, 10, MODIFY_REMOVE,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_ANSWERED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen mail_index_update_flags_range(t, 7, 12, MODIFY_ADD,
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen MAIL_DELETED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen updates = array_get(&t->updates, &count);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen test_assert(count == 7);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen test_assert(updates[0].uid1 == 3);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen test_assert(updates[0].uid2 == 4);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[0].add_flags == MAIL_FLAGGED);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[0].remove_flags == 0);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[1].uid1 == 5);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[1].uid2 == 5);
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[1].add_flags == (MAIL_DRAFT | MAIL_FLAGGED));
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen test_assert(updates[1].remove_flags == MAIL_ANSWERED);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(updates[2].uid1 == 6);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(updates[2].uid2 == 6);
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));
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[3].uid1 == 7);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[3].uid2 == 7);
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].uid1 == 8);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[4].uid2 == 8);
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));
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen test_assert(updates[5].uid1 == 9);
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen test_assert(updates[5].uid2 == 10);
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].uid1 == 11);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[6].uid2 == 12);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[6].add_flags == MAIL_DELETED);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(updates[6].remove_flags == 0);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_end();
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_transaction_cleanup(t);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen}
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
42401be443f96c91a20fc976d66ca626fa6e14ecTimo Sirainenstatic void
42401be443f96c91a20fc976d66ca626fa6e14ecTimo Sirainenflags_array_check(struct mail_index_transaction *t,
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen const enum mail_flags *flags, unsigned int msg_count)
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen{
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen const struct mail_index_flag_update *updates;
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen unsigned int i, count, seq;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (array_is_created(&t->updates))
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen updates = array_get(&t->updates, &count);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen else {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen updates = NULL;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen count = 0;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen for (seq = 1, i = 0; i < count; i++) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (i > 0) {
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);
0d1b8b6bec79746c5d89d57dd8c1688946bd9237Josef 'Jeff' Sipek }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen for (; seq != updates[i].uid1; seq++)
56c69b4b17af0b5a2c71705d5edae746f00780b9Timo Sirainen test_assert(flags[seq] == 0);
1574df6b0bc965212f1152e480e7a762cdaa8226Timo Sirainen for (; seq <= updates[i].uid2; seq++)
1574df6b0bc965212f1152e480e7a762cdaa8226Timo Sirainen test_assert(flags[seq] == updates[i].add_flags);
1574df6b0bc965212f1152e480e7a762cdaa8226Timo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen for (; seq <= msg_count; seq++)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(flags[seq] == 0);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen}
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstatic void test_mail_index_flag_update_random(void)
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen{
0d1b8b6bec79746c5d89d57dd8c1688946bd9237Josef 'Jeff' Sipek struct mail_index_transaction *t;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen unsigned int r, seq1, seq2, seq;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen enum mail_flags *flags, change;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen enum modify_type modify_type;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen hdr.messages_count = 20;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen t = mail_index_transaction_new();
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen test_begin("mail index flag update random");
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen
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);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen seq1 = (rand() % hdr.messages_count) + 1;
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen seq2 = seq1 == hdr.messages_count ? seq1 :
8752573c44bcd139ae3ecc6d8e917c2c60bcb89fTimo Sirainen (rand() % (hdr.messages_count - seq1)) + seq1;
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen switch (rand() % 3) {
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen case 0:
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen modify_type = MODIFY_ADD;
468c28dfb03613ab8d487b5aebc985a969193aceTimo Sirainen for (seq = seq1; seq <= seq2; seq++)
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen flags[seq] |= change;
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen break;
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen case 1:
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen modify_type = MODIFY_REMOVE;
58b8a301b7b36047f10a592751094fbed86d6f0cTimo Sirainen for (seq = seq1; seq <= seq2; seq++)
58b8a301b7b36047f10a592751094fbed86d6f0cTimo Sirainen flags[seq] &= ~change;
58b8a301b7b36047f10a592751094fbed86d6f0cTimo Sirainen break;
377dd19a90436b8f96902af741a3ea130bc3fe75Timo Sirainen case 2:
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen modify_type = MODIFY_REPLACE;
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen for (seq = seq1; seq <= seq2; seq++)
ee3362f3b78827a2c9a7e9ddee83f5a429c06213Timo Sirainen flags[seq] = change;
ee3362f3b78827a2c9a7e9ddee83f5a429c06213Timo Sirainen break;
468c28dfb03613ab8d487b5aebc985a969193aceTimo Sirainen default:
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen i_unreached();
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen }
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen mail_index_update_flags_range(t, seq1, seq2, modify_type,
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen change);
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen flags_array_check(t, flags, hdr.messages_count);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen test_end();
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen mail_index_transaction_cleanup(t);
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen}
7be1a5530fcb414588fbe90eaed65eff83e84737Timo Sirainen
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainenstatic void test_mail_index_cancel_flag_updates(void)
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen{
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen struct mail_index_transaction *t;
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen const struct mail_index_flag_update *updates;
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen unsigned int count;
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen
468c28dfb03613ab8d487b5aebc985a969193aceTimo Sirainen hdr.messages_count = 20;
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen t = mail_index_transaction_new();
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_begin("mail index cancel flag updates");
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen mail_index_update_flags_range(t, 5, 7, MODIFY_REPLACE, 0);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen updates = array_get(&t->updates, &count);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(count == 1);
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));
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(!array_is_created(&t->updates));
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen
3a7a0c35c9f827f86fb437e640287f3a467ef692Timo Sirainen mail_index_update_flags_range(t, 5, 7, MODIFY_REPLACE, 0);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen test_assert(mail_index_cancel_flag_updates(t, 6));
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen updates = array_get(&t->updates, &count);
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen test_assert(count == 2);
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen test_assert(updates[0].uid1 == 5 && updates[0].uid2 == 5);
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen test_assert(updates[1].uid1 == 7 && updates[1].uid2 == 7);
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen test_end();
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen mail_index_transaction_cleanup(t);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen}
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainenstatic void test_mail_index_flag_update_appends(void)
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen{
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen struct mail_index_transaction *t;
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen const struct mail_index_record *appends;
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen const struct mail_index_flag_update *updates;
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen unsigned int count;
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen uint32_t seq;
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen
002f2544421891472dc9aeb79d3abdde6a8ed4c8Timo Sirainen hdr.messages_count = 4;
002f2544421891472dc9aeb79d3abdde6a8ed4c8Timo Sirainen t = mail_index_transaction_new();
c88275be7fcb92b10f412cecdd6c2ceaae17917eTimo Sirainen
c88275be7fcb92b10f412cecdd6c2ceaae17917eTimo Sirainen test_begin("mail index flag update appends");
c88275be7fcb92b10f412cecdd6c2ceaae17917eTimo Sirainen mail_index_append(t, 0, &seq);
c88275be7fcb92b10f412cecdd6c2ceaae17917eTimo Sirainen test_assert(seq == 5);
c88275be7fcb92b10f412cecdd6c2ceaae17917eTimo Sirainen mail_index_append(t, 0, &seq);
002f2544421891472dc9aeb79d3abdde6a8ed4c8Timo Sirainen test_assert(seq == 6);
002f2544421891472dc9aeb79d3abdde6a8ed4c8Timo Sirainen mail_index_append(t, 0, &seq);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(seq == 7);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 5, 6, MODIFY_REPLACE,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen MAIL_SEEN | MAIL_FLAGGED);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 6, 7, MODIFY_ADD,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen MAIL_DRAFT | MAIL_FLAGGED);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_update_flags_range(t, 5, 7, MODIFY_REMOVE,
465fb89a877b778f68734f6cc36db9ce2a4a0a71Timo Sirainen MAIL_FLAGGED);
465fb89a877b778f68734f6cc36db9ce2a4a0a71Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen appends = array_get(&t->appends, &count);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(count == 3);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(appends[0].flags == MAIL_SEEN);
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen test_assert(appends[1].flags == (MAIL_SEEN | MAIL_DRAFT));
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen test_assert(appends[2].flags == MAIL_DRAFT);
1df39b899804fd1dbc560f75382364822935c857Timo Sirainen
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen /* mixed existing/appends */
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen mail_index_update_flags_range(t, 4, 5, MODIFY_ADD,
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen MAIL_ANSWERED);
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen test_assert(appends[0].flags == (MAIL_SEEN | MAIL_ANSWERED));
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen updates = array_get(&t->updates, &count);
f64b5bc9e73bedc63ba3c072c286542c29c69e43Timo Sirainen test_assert(count == 1);
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen test_assert(updates[0].uid1 == 4);
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(updates[0].uid2 == 4);
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(updates[0].add_flags == MAIL_ANSWERED);
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen test_end();
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen mail_index_transaction_cleanup(t);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen}
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainenstatic bool test_flag_update_pos(struct mail_index_transaction *t,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen uint32_t seq, unsigned int idx)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen{
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen unsigned int i, j, count;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen count = array_count(&t->updates);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen for (i = 0; i < idx; i++) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen for (j = idx + 1; j <= count; j++) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen if (mail_index_transaction_get_flag_update_pos(t, i, j, seq) != idx) {
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(FALSE);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen return FALSE;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen }
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen return TRUE;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen}
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstatic void test_mail_index_transaction_get_flag_update_pos(void)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen{
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct mail_index_transaction *t;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen test_begin("mail index transaction get flag update pos");
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen hdr.messages_count = 10;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen t = mail_index_transaction_new();
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);
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen test_assert(test_flag_update_pos(t, 1, 0));
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen test_assert(test_flag_update_pos(t, 2, 1));
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen test_assert(test_flag_update_pos(t, 3, 1));
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen test_assert(test_flag_update_pos(t, 4, 1));
58b8a301b7b36047f10a592751094fbed86d6f0cTimo Sirainen test_assert(test_flag_update_pos(t, 5, 2));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(test_flag_update_pos(t, 6, 2));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(test_flag_update_pos(t, 7, 2));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(test_flag_update_pos(t, 8, 3));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(test_flag_update_pos(t, 9, 3));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(test_flag_update_pos(t, 10, 3));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(test_flag_update_pos(t, 11, 4));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(test_flag_update_pos(t, 12, 4));
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_end();
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_transaction_cleanup(t);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen}
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenstatic void test_mail_index_modseq_update(void)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen{
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen struct mail_index_transaction *t;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen const struct mail_transaction_modseq_update *ups;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen unsigned int count;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_begin("mail index modseq update");
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen hdr.messages_count = 10;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen t = mail_index_transaction_new();
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_modseq(t, 4, 0x8234fefa02747429ULL);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_modseq(t, 6, 0x1234567890abcdefULL);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_modseq(t, 2, 0xfeed);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_modseq(t, 4, 2);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen /* modseq=1 updates are ignored: */
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_modseq(t, 5, 1);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_update_modseq(t, 6, 1);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ups = array_get(&t->modseq_updates, &count);
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen test_assert(count == 4);
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen test_assert(ups[0].uid == 4 &&
027f58ea63a1822bbf13d99ee5572e5f8b9e8d8bTimo Sirainen ups[0].modseq_high32 == 0x8234fefa &&
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen ups[0].modseq_low32 == 0x02747429);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(ups[1].uid == 6 &&
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ups[1].modseq_high32 == 0x12345678 &&
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen ups[1].modseq_low32 == 0x90abcdef);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(ups[2].uid == 2 &&
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen ups[2].modseq_high32 == 0 &&
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen ups[2].modseq_low32 == 0xfeed);
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen test_assert(ups[3].uid == 4 &&
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen ups[3].modseq_high32 == 0 &&
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen ups[3].modseq_low32 == 2);
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen test_end();
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen mail_index_transaction_cleanup(t);
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen}
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainenstatic void test_mail_index_expunge(void)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen{
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen static guid_128_t empty_guid = { 0, };
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen struct mail_index_transaction *t;
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen const struct mail_transaction_expunge_guid *expunges;
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen guid_128_t guid2, guid3, guid4;
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen unsigned int i, count;
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen test_begin("mail index expunge");
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen
83b9d8afc2776ebf61ddb77b85241f2591ef7f7bTimo Sirainen hdr.messages_count = 10;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen t = mail_index_transaction_new();
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen for (i = 0; i < sizeof(guid2); i++) {
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen guid2[i] = i + 1;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen guid3[i] = i ^ 0xff;
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen guid4[i] = i + 0x80;
b0421c7397be2146988ee3afb5dcc491c01206ccTimo Sirainen }
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_expunge_guid(t, 4, guid4);
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen test_assert(!t->expunges_nonsorted);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_expunge_guid(t, 2, guid2);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(t->expunges_nonsorted);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_expunge_guid(t, 3, guid3);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail_index_expunge(t, 1);
e2fdcdb4ee53ab769123e27997713aaea34910e1Timo Sirainen mail_index_expunge(t, 5);
30089b563dd385f9b18835af2c5a47de2b560660Timo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen expunges = array_get(&t->expunges, &count);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen test_assert(count == 5);
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(expunges[0].uid == 4);
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(memcmp(expunges[0].guid_128, guid4, sizeof(guid4)) == 0);
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(expunges[1].uid == 2);
abe29107f5dce932d28a00912d2d75a01021bef1Timo Sirainen test_assert(memcmp(expunges[1].guid_128, guid2, sizeof(guid2)) == 0);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen test_assert(expunges[2].uid == 3);
093b42b11c1236a687d3da564b26a324e2189ae6Timo Sirainen test_assert(memcmp(expunges[2].guid_128, guid3, sizeof(guid3)) == 0);
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen test_assert(expunges[3].uid == 1);
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen test_assert(memcmp(expunges[3].guid_128, empty_guid, sizeof(empty_guid)) == 0);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(expunges[4].uid == 5);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_assert(memcmp(expunges[4].guid_128, empty_guid, sizeof(empty_guid)) == 0);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen test_end();
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen mail_index_transaction_cleanup(t);
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen}
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainenint main(void)
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen{
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen static void (*const test_functions[])(void) = {
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen test_mail_index_append,
093b42b11c1236a687d3da564b26a324e2189ae6Timo Sirainen test_mail_index_flag_update_fastpath,
093b42b11c1236a687d3da564b26a324e2189ae6Timo Sirainen test_mail_index_flag_update_simple_merges,
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen test_mail_index_flag_update_complex_merges,
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen test_mail_index_flag_update_random,
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen test_mail_index_flag_update_appends,
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen test_mail_index_cancel_flag_updates,
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen test_mail_index_transaction_get_flag_update_pos,
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen test_mail_index_modseq_update,
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen test_mail_index_expunge,
ae32667c54480d329eed994b3defab89cd76c077Timo Sirainen NULL
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen };
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen return test_run(test_functions);
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen}
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen