From: Timo Sirainen Date: Thu, 6 Oct 2016 09:10:28 +0000 (+0300) Subject: lib-index: Added test-mail-index-modseq unit test X-Git-Tag: 2.3.0.rc1~2946 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7f51e8608944e19e02df8680f379c1a0d7e1a53b;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Added test-mail-index-modseq unit test --- diff --git a/src/lib-index/Makefile.am b/src/lib-index/Makefile.am index 011e7614fc..66509e3eb3 100644 --- a/src/lib-index/Makefile.am +++ b/src/lib-index/Makefile.am @@ -62,6 +62,7 @@ headers = \ test_programs = \ test-mail-index-map \ + test-mail-index-modseq \ test-mail-index-sync-ext \ test-mail-index-transaction-finish \ test-mail-index-transaction-update \ @@ -81,6 +82,10 @@ test_mail_index_map_SOURCES = test-mail-index-map.c test_mail_index_map_LDADD = $(noinst_LTLIBRARIES) $(test_libs) test_mail_index_map_DEPENDENCIES = $(test_deps) +test_mail_index_modseq_SOURCES = test-mail-index-modseq.c +test_mail_index_modseq_LDADD = $(noinst_LTLIBRARIES) $(test_libs) +test_mail_index_modseq_DEPENDENCIES = $(test_deps) + test_mail_index_sync_ext_SOURCES = test-mail-index-sync-ext.c test_mail_index_sync_ext_LDADD = mail-index-sync-ext.lo $(test_libs) test_mail_index_sync_ext_DEPENDENCIES = $(test_deps) diff --git a/src/lib-index/test-mail-index-modseq.c b/src/lib-index/test-mail-index-modseq.c new file mode 100644 index 0000000000..9a211ace34 --- /dev/null +++ b/src/lib-index/test-mail-index-modseq.c @@ -0,0 +1,92 @@ +/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "ioloop.h" +#include "unlink-directory.h" +#include "test-common.h" +#include "mail-index-private.h" +#include "mail-index-modseq.h" +#include "mail-transaction-log-private.h" + +#define TESTDIR_NAME ".dovecot.test" + +static void test_mail_index_modseq_get_next_log_offset(void) +{ + struct { + uint32_t log_seq; + uoff_t log_offset; + } tests[] = { + { 0, 0 }, + { 2, 40 }, + { 2, 148 }, + { 2, 164 }, + { 3, 40 }, + { 3, 56 }, + { 3, 72 }, + { 3, 88 }, + }; + struct mail_index *index; + struct mail_index_view *view, *view2; + struct mail_index_transaction *trans; + uint32_t seq, uid; + const char *error; + + (void)unlink_directory(TESTDIR_NAME, UNLINK_DIRECTORY_FLAG_RMDIR, &error); + if (mkdir(TESTDIR_NAME, 0700) < 0) + i_error("mkdir(%s) failed: %m", TESTDIR_NAME); + + ioloop_time = 1; + + test_begin("mail_transaction_log_file_get_modseq_next_offset()"); + index = mail_index_alloc(TESTDIR_NAME, "test.dovecot.index"); + test_assert(mail_index_open_or_create(index, MAIL_INDEX_OPEN_FLAG_CREATE) == 0); + view = mail_index_view_open(index); + mail_index_modseq_enable(index); + + trans = mail_index_transaction_begin(view, 0); + uid = 1234; + mail_index_update_header(trans, + offsetof(struct mail_index_header, uid_validity), + &uid, sizeof(uid), TRUE); + test_assert(mail_index_transaction_commit(&trans) == 0); + + for (uid = 1; uid <= 3; uid++) { + trans = mail_index_transaction_begin(view, 0); + mail_index_append(trans, uid, &seq); + test_assert(mail_index_transaction_commit(&trans) == 0); + } + test_assert(mail_transaction_log_file_lock(index->log->head) == 0); + test_assert(mail_transaction_log_rotate(index->log, FALSE) == 0); + mail_transaction_log_file_unlock(index->log->head, "rotating"); + for (uid = 4; uid <= 6; uid++) { + trans = mail_index_transaction_begin(view, 0); + mail_index_append(trans, uid, &seq); + test_assert(mail_index_transaction_commit(&trans) == 0); + } + + view2 = mail_index_view_open(index); + for (uint64_t modseq = 1; modseq <= 7; modseq++) { + uint32_t log_seq; + uoff_t log_offset; + + test_assert_idx(mail_index_modseq_get_next_log_offset(view2, modseq, &log_seq, &log_offset) == (tests[modseq].log_seq != 0), modseq); + test_assert_idx(tests[modseq].log_seq == log_seq && tests[modseq].log_offset == log_offset, modseq); + } + + mail_index_view_close(&view); + mail_index_view_close(&view2); + mail_index_close(index); + mail_index_free(&index); + + (void)unlink_directory(TESTDIR_NAME, UNLINK_DIRECTORY_FLAG_RMDIR, &error); + test_end(); +} + +int main(void) +{ + static void (*test_functions[])(void) = { + test_mail_index_modseq_get_next_log_offset, + NULL + }; + return test_run(test_functions); +}