test-dsync-proxy-server-cmd.c revision c820b702d1eabfd5b029ac168fe769265e541561
2875N/A/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
2875N/A
2875N/A#include "lib.h"
2875N/A#include "array.h"
2875N/A#include "str.h"
2875N/A#include "strescape.h"
2875N/A#include "istream.h"
2875N/A#include "ostream.h"
2875N/A#include "test-common.h"
2875N/A#include "dsync-proxy-server.h"
2875N/A#include "test-dsync-worker.h"
2875N/A#include "test-dsync-common.h"
2875N/A
2875N/A#define ALL_MAIL_FLAGS "\\Answered \\Flagged \\Deleted \\Seen \\Draft \\Recent"
2875N/A
2875N/Astatic string_t *out;
2875N/Astatic struct dsync_proxy_server *server;
2875N/Astatic struct test_dsync_worker *test_worker;
2875N/Astatic struct dsync_proxy_server_command *cur_cmd;
2875N/Astatic const char *cur_cmd_args[20];
2875N/A
2875N/Astatic void out_clear(void)
3158N/A{
2875N/A o_stream_seek(server->output, 0);
2875N/A str_truncate(out, 0);
2875N/A}
2875N/A
2875N/Astatic int run_more(void)
2875N/A{
2875N/A int ret;
3025N/A
2875N/A ret = cur_cmd->func(server, cur_cmd_args);
2875N/A if (ret == 0)
2875N/A return 0;
2875N/A
2875N/A cur_cmd = NULL;
2875N/A return ret;
2875N/A}
2875N/A
2875N/Astatic int ATTR_SENTINEL
2875N/Arun_cmd(const char *cmd_name, ...)
2875N/A{
2875N/A va_list va;
2875N/A const char *str;
2875N/A unsigned int i = 0;
2875N/A
2875N/A i_assert(cur_cmd == NULL);
3025N/A
2875N/A va_start(va, cmd_name);
2875N/A while ((str = va_arg(va, const char *)) != NULL) {
2875N/A i_assert(i < N_ELEMENTS(cur_cmd_args)+1);
2875N/A cur_cmd_args[i++] = str;
2875N/A }
2875N/A cur_cmd_args[i] = NULL;
2875N/A va_end(va);
2875N/A
2875N/A cur_cmd = dsync_proxy_server_command_find(cmd_name);
2875N/A i_assert(cur_cmd != NULL);
3025N/A return run_more();
3025N/A}
3025N/A
3025N/Astatic void test_dsync_proxy_box_list(void)
3025N/A{
2875N/A struct dsync_mailbox box;
2875N/A
2875N/A test_begin("proxy server box list");
2875N/A
2875N/A test_assert(run_cmd("BOX-LIST", NULL) == 0);
2875N/A
2875N/A /* \noselect mailbox */
2875N/A memset(&box, 0, sizeof(box));
2875N/A box.name = "\t\001\r\nname\t\001\n\r";
2875N/A test_worker->box_iter.next_box = &box;
2875N/A test_assert(run_more() == 0);
2875N/A test_assert(strcmp(str_c(out), t_strconcat(str_tabescape(box.name), "\n", NULL)) == 0);
2875N/A out_clear();
2875N/A
2875N/A /* selectable mailbox */
2875N/A memset(&box, 0, sizeof(box));
2875N/A box.name = "foo/bar";
2875N/A memcpy(box.guid.guid, test_mailbox_guid1, sizeof(box.guid.guid));
2875N/A box.uid_validity = 4275878552;
2875N/A box.uid_next = 4023233417;
2875N/A box.highest_modseq = 18080787909545915012ULL;
2875N/A test_worker->box_iter.next_box = &box;
2875N/A
3014N/A test_assert(run_more() == 0);
3014N/A
3110N/A test_assert(strcmp(str_c(out), "foo/bar\t"
3185N/A TEST_MAILBOX_GUID1"\t"
3185N/A "4275878552\t"
3185N/A "4023233417\t"
3185N/A "18080787909545915012\n") == 0);
3185N/A out_clear();
3185N/A
3185N/A /* last mailbox */
3185N/A test_worker->box_iter.last = TRUE;
3185N/A test_assert(run_more() == 1);
3185N/A test_assert(strcmp(str_c(out), "\t0\n") == 0);
3185N/A out_clear();
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_msg_list(void)
3185N/A{
3185N/A static const char *test_keywords[] = {
3185N/A "kw1", "kw2", NULL
3185N/A };
3185N/A struct dsync_message msg;
3185N/A struct test_dsync_worker_msg test_msg;
3185N/A
3185N/A test_begin("proxy server msg list");
3185N/A
3185N/A test_assert(run_cmd("MSG-LIST", TEST_MAILBOX_GUID1, TEST_MAILBOX_GUID2, NULL) == 0);
3185N/A
3185N/A memset(&msg, 0, sizeof(msg));
3185N/A msg.guid = "\t\001\r\nguid\t\001\n\r";
3185N/A msg.uid = 123;
3185N/A msg.modseq = 98765432101234;
2875N/A msg.save_date = 1234567890;
3185N/A
3185N/A /* no flags */
3185N/A test_msg.msg = msg;
3185N/A test_msg.mailbox_idx = 98;
3185N/A array_append(&test_worker->msg_iter.msgs, &test_msg, 1);
3185N/A test_assert(run_more() == 0);
3185N/A test_assert(strcmp(str_c(out), t_strconcat(
3185N/A "98\t", str_tabescape(msg.guid),
3185N/A "\t123\t98765432101234\t\t1234567890\n", NULL)) == 0);
3185N/A out_clear();
3185N/A
3185N/A /* all flags, some keywords */
3185N/A msg.modseq = 1;
3185N/A msg.save_date = 2;
3185N/A msg.guid = "guid";
3185N/A msg.flags = MAIL_FLAGS_MASK;
3185N/A msg.keywords = test_keywords;
3185N/A test_msg.msg = msg;
3185N/A test_msg.mailbox_idx = 76;
3185N/A array_append(&test_worker->msg_iter.msgs, &test_msg, 1);
3185N/A test_assert(run_more() == 0);
3185N/A test_assert(strcmp(str_c(out), "76\tguid\t123\t1\t"
3185N/A ALL_MAIL_FLAGS" kw1 kw2\t2\n") == 0);
3185N/A out_clear();
3185N/A
3185N/A /* last message */
3185N/A test_worker->msg_iter.last = TRUE;
3185N/A test_assert(run_more() == 1);
3185N/A test_assert(strcmp(str_c(out), "\t0\n") == 0);
3185N/A out_clear();
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_box_create(void)
3185N/A{
3185N/A struct test_dsync_box_event event;
3185N/A
3185N/A test_begin("proxy server box create");
3185N/A
3185N/A test_assert(run_cmd("BOX-CREATE", "noselect", NULL) == 1);
3185N/A test_assert(test_dsync_worker_next_box_event(test_worker, &event));
3185N/A test_assert(event.type == LAST_BOX_TYPE_CREATE);
3185N/A test_assert(strcmp(event.box.name, "noselect") == 0);
3185N/A test_assert(event.box.uid_validity == 0);
3185N/A
3185N/A test_assert(run_cmd("BOX-CREATE", "selectable", TEST_MAILBOX_GUID1,
3185N/A "1234567890", "9876", "28427847284728", NULL) == 1);
3185N/A test_assert(test_dsync_worker_next_box_event(test_worker, &event));
3185N/A test_assert(event.type == LAST_BOX_TYPE_CREATE);
3185N/A test_assert(strcmp(event.box.name, "selectable") == 0);
3185N/A test_assert(memcmp(event.box.guid.guid, test_mailbox_guid1, MAIL_GUID_128_SIZE) == 0);
3185N/A test_assert(event.box.uid_validity == 1234567890);
3185N/A test_assert(event.box.uid_next == 9876);
3185N/A test_assert(event.box.highest_modseq == 28427847284728);
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_box_update(void)
3185N/A{
3185N/A struct test_dsync_box_event event;
3185N/A
3185N/A test_begin("proxy server box update");
3185N/A
3185N/A test_assert(run_cmd("BOX-UPDATE", "updated", TEST_MAILBOX_GUID2,
3185N/A "34343", "22", "2238427847284728", NULL) == 1);
3185N/A test_assert(test_dsync_worker_next_box_event(test_worker, &event));
3185N/A test_assert(event.type == LAST_BOX_TYPE_UPDATE);
3185N/A test_assert(strcmp(event.box.name, "updated") == 0);
3185N/A test_assert(memcmp(event.box.guid.guid, test_mailbox_guid2, MAIL_GUID_128_SIZE) == 0);
3185N/A test_assert(event.box.uid_validity == 34343);
3185N/A test_assert(event.box.uid_next == 22);
3185N/A test_assert(event.box.highest_modseq == 2238427847284728);
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_box_select(void)
3185N/A{
3185N/A test_begin("proxy server box select");
3185N/A
3185N/A test_assert(run_cmd("BOX-SELECT", TEST_MAILBOX_GUID1, NULL) == 1);
3185N/A test_assert(memcmp(test_worker->selected_mailbox.guid, test_mailbox_guid1, MAIL_GUID_128_SIZE) == 0);
3185N/A
3185N/A test_assert(run_cmd("BOX-SELECT", TEST_MAILBOX_GUID2, NULL) == 1);
3185N/A test_assert(memcmp(test_worker->selected_mailbox.guid, test_mailbox_guid2, MAIL_GUID_128_SIZE) == 0);
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_msg_update(void)
3185N/A{
3185N/A struct test_dsync_msg_event event;
3185N/A
3185N/A test_begin("proxy server msg update");
3185N/A
3185N/A test_assert(run_cmd("MSG-UPDATE", "123", "4782782842924",
3185N/A "kw1 "ALL_MAIL_FLAGS" kw2", NULL) == 1);
3185N/A test_assert(test_dsync_worker_next_msg_event(test_worker, &event));
3185N/A test_assert(event.type == LAST_MSG_TYPE_UPDATE);
3185N/A test_assert(event.msg.uid == 123);
3185N/A test_assert(event.msg.modseq == 4782782842924);
3185N/A test_assert(event.msg.flags == MAIL_FLAGS_MASK);
3185N/A test_assert(strcmp(event.msg.keywords[0], "kw1") == 0);
3185N/A test_assert(strcmp(event.msg.keywords[1], "kw2") == 0);
3185N/A test_assert(event.msg.keywords[2] == NULL);
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_msg_uid_change(void)
3185N/A{
3185N/A struct test_dsync_msg_event event;
3185N/A
3185N/A test_begin("proxy server msg uid change");
3185N/A
3185N/A test_assert(run_cmd("MSG-UID-CHANGE", "454", "995", NULL) == 1);
3185N/A test_assert(test_dsync_worker_next_msg_event(test_worker, &event));
3185N/A test_assert(event.type == LAST_MSG_TYPE_UPDATE_UID);
3185N/A test_assert(event.msg.uid == 454);
3185N/A test_assert(event.msg.modseq == 995);
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_msg_expunge(void)
3185N/A{
3185N/A struct test_dsync_msg_event event;
3185N/A
3185N/A test_begin("proxy server msg expunge");
3185N/A
3185N/A test_assert(run_cmd("MSG-EXPUNGE", "8585", NULL) == 1);
3185N/A test_assert(test_dsync_worker_next_msg_event(test_worker, &event));
3185N/A test_assert(event.type == LAST_MSG_TYPE_EXPUNGE);
3185N/A test_assert(event.msg.uid == 8585);
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_msg_copy(void)
3185N/A{
3185N/A struct test_dsync_msg_event msg_event;
3185N/A
3185N/A test_begin("proxy server msg copy");
3185N/A
3185N/A test_assert(run_cmd("MSG-COPY", TEST_MAILBOX_GUID1, "5454",
3185N/A "copyguid", "5678", "74782482882924", "\\Seen foo \\Draft",
3185N/A "8294284", NULL) == 1);
3185N/A test_assert(test_dsync_worker_next_msg_event(test_worker, &msg_event));
3185N/A test_assert(msg_event.type == LAST_MSG_TYPE_COPY);
3185N/A test_assert(memcmp(msg_event.copy_src_mailbox.guid, test_mailbox_guid1, MAIL_GUID_128_SIZE) == 0);
3185N/A test_assert(msg_event.copy_src_uid == 5454);
3185N/A test_assert(strcmp(msg_event.msg.guid, "copyguid") == 0);
3185N/A test_assert(msg_event.msg.uid == 5678);
3185N/A test_assert(msg_event.msg.modseq == 74782482882924);
3185N/A test_assert(msg_event.msg.flags == (MAIL_SEEN | MAIL_DRAFT));
3185N/A test_assert(strcmp(msg_event.msg.keywords[0], "foo") == 0);
3185N/A test_assert(msg_event.msg.keywords[1] == NULL);
3185N/A test_assert(msg_event.msg.save_date == 8294284);
3185N/A
3185N/A test_end();
3185N/A}
3185N/A
3185N/Astatic void test_dsync_proxy_msg_save(void)
3185N/A{
3185N/A static const char *input = "..dotty\n..behavior\nfrom you\n.\nstop";
3185N/A struct test_dsync_msg_event event;
3185N/A const unsigned char *data;
3185N/A size_t size;
3185N/A
3185N/A test_begin("proxy server msg save");
3185N/A
3185N/A server->input = i_stream_create_from_data(input, strlen(input));
3185N/A
3185N/A test_assert(run_cmd("MSG-SAVE", "28492428", "pop3uidl",
3185N/A "saveguid", "874", "33982482882924", "\\Flagged bar \\Answered",
3185N/A "8294284", NULL) == 1);
3185N/A test_assert(test_dsync_worker_next_msg_event(test_worker, &event));
3185N/A test_assert(event.type == LAST_MSG_TYPE_SAVE);
3185N/A test_assert(event.save_data.received_date == 28492428);
3185N/A test_assert(strcmp(event.save_data.pop3_uidl, "pop3uidl") == 0);
2875N/A test_assert(strcmp(event.save_body, ".dotty\n.behavior\nfrom you") == 0);
2875N/A
2875N/A test_assert(strcmp(event.msg.guid, "saveguid") == 0);
2875N/A test_assert(event.msg.uid == 874);
2875N/A test_assert(event.msg.modseq == 33982482882924);
2875N/A test_assert(event.msg.flags == (MAIL_FLAGGED | MAIL_ANSWERED));
2875N/A test_assert(strcmp(event.msg.keywords[0], "bar") == 0);
2875N/A test_assert(event.msg.keywords[1] == NULL);
2875N/A test_assert(event.msg.save_date == 8294284);
2875N/A
2875N/A data = i_stream_get_data(server->input, &size);
2875N/A test_assert(size == 4 && memcmp(data, "stop", 4) == 0);
2875N/A i_stream_destroy(&server->input);
2875N/A
2875N/A test_end();
2875N/A}
2875N/A
2875N/Astatic struct dsync_proxy_server *
2875N/Adsync_proxy_server_init_test(buffer_t *outbuf)
2875N/A{
2875N/A struct dsync_proxy_server *server;
2875N/A
2875N/A server = i_new(struct dsync_proxy_server, 1);
2875N/A server->worker = dsync_worker_init_test();
2875N/A server->fd_in = 0;
2875N/A server->fd_out = 0;
2875N/A
2875N/A server->cmd_pool = pool_alloconly_create("worker server cmd", 1024);
2875N/A server->output = o_stream_create_buffer(outbuf);
2875N/A return server;
2875N/A}
2875N/A
2875N/Aint main(void)
2875N/A{
2875N/A static void (*test_functions[])(void) = {
2875N/A test_dsync_proxy_box_list,
2875N/A test_dsync_proxy_msg_list,
2875N/A test_dsync_proxy_box_create,
2875N/A test_dsync_proxy_box_update,
2875N/A test_dsync_proxy_box_select,
2875N/A test_dsync_proxy_msg_update,
2875N/A test_dsync_proxy_msg_uid_change,
2875N/A test_dsync_proxy_msg_expunge,
2875N/A test_dsync_proxy_msg_copy,
2875N/A test_dsync_proxy_msg_save,
2875N/A NULL
2875N/A };
2875N/A
2875N/A test_init();
2875N/A
2875N/A out = buffer_create_dynamic(default_pool, 1024);
2875N/A server = dsync_proxy_server_init_test(out);
2875N/A test_worker = (struct test_dsync_worker *)server->worker;
2875N/A
2875N/A test_run_funcs(test_functions);
2875N/A return test_deinit();
2875N/A}
2875N/A