test-dsync-proxy-server-cmd.c revision 885a3c2287ae3e5827aa580ea06b231de38abb47
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff/* Copyright (c) 2009-2011 Dovecot authors, see the included COPYING file */
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "lib.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "array.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "str.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "strescape.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "istream.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "ostream.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "test-common.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "dsync-proxy-server.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "test-dsync-worker.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#include "test-dsync-common.h"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff#define ALL_MAIL_FLAGS "\\Answered \\Flagged \\Deleted \\Seen \\Draft \\Recent"
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstruct master_service *master_service;
9836787d16b657453784c30809d330f50d9bc6d8Liam P. Whitestatic string_t *out;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic struct dsync_proxy_server *server;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic struct test_dsync_worker *test_worker;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic struct dsync_proxy_server_command *cur_cmd;
fc2e20aa610641335a34aa9b6604c3c4ec0ae7c4Matthew Petroffstatic const char *cur_cmd_args[20];
fc2e20aa610641335a34aa9b6604c3c4ec0ae7c4Matthew Petroff
fc2e20aa610641335a34aa9b6604c3c4ec0ae7c4Matthew Petroffstatic void out_clear(void)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff{
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff o_stream_seek(server->output, 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff str_truncate(out, 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff}
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic int run_more(void)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff{
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen int ret;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff ret = cur_cmd->func(server, cur_cmd_args);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff if (ret == 0)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff return 0;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff cur_cmd = NULL;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff return ret;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff}
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic int ATTR_SENTINEL
fc2e20aa610641335a34aa9b6604c3c4ec0ae7c4Matthew Petroffrun_cmd(const char *cmd_name, ...)
87dacccf64bee38af81afde687844a37b57b5b9aKrzysztof Kosiński{
87dacccf64bee38af81afde687844a37b57b5b9aKrzysztof Kosiński va_list va;
87dacccf64bee38af81afde687844a37b57b5b9aKrzysztof Kosiński const char *str;
87dacccf64bee38af81afde687844a37b57b5b9aKrzysztof Kosiński unsigned int i = 0;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff i_assert(cur_cmd == NULL);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff va_start(va, cmd_name);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff while ((str = va_arg(va, const char *)) != NULL) {
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff i_assert(i < N_ELEMENTS(cur_cmd_args)+1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff cur_cmd_args[i++] = str;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff }
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff cur_cmd_args[i] = NULL;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff va_end(va);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff cur_cmd = dsync_proxy_server_command_find(cmd_name);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff i_assert(cur_cmd != NULL);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff return run_more();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff}
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic void test_dsync_proxy_box_list(void)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff{
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff struct dsync_mailbox box;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_begin("proxy server box list");
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_cmd("BOX-LIST", NULL) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff /* \noselect mailbox */
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff memset(&box, 0, sizeof(box));
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.name = "\t\001\r\nname\t\001\n\r";
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.name_sep = '/';
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.last_change = 992;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.flags = DSYNC_MAILBOX_FLAG_NOSELECT;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_worker->box_iter.next_box = &box;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 0);
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen test_assert(strcmp(str_c(out), t_strconcat(str_tabescape(box.name),
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "\t/\t992\t1\n", NULL)) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff /* selectable mailbox */
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff memset(&box, 0, sizeof(box));
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.name = "foo/bar";
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.name_sep = '/';
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff memcpy(box.mailbox_guid.guid, test_mailbox_guid1, GUID_128_SIZE);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.uid_validity = 4275878552;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.uid_next = 4023233417;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.message_count = 4525;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.highest_modseq = 18080787909545915012ULL;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff box.first_recent_uid = 353;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_worker->box_iter.next_box = &box;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(str_c(out), "foo/bar\t/\t0\t0\t"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff TEST_MAILBOX_GUID1"\t"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "4275878552\t"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "4023233417\t"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "4525\t"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "18080787909545915012\t"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "353\n") == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen /* last mailbox */
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen test_worker->box_iter.last = TRUE;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(str_c(out), "+\n") == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_end();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff}
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic void test_dsync_proxy_subs_list(void)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff{
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff const char *name;
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen struct dsync_worker_subscription subs;
f270813dc37789a47460406e15ffaed615e68648Matthew Petroff struct dsync_worker_unsubscription unsubs;
f270813dc37789a47460406e15ffaed615e68648Matthew Petroff
f270813dc37789a47460406e15ffaed615e68648Matthew Petroff test_begin("proxy server subs list");
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen
f270813dc37789a47460406e15ffaed615e68648Matthew Petroff test_assert(run_cmd("SUBS-LIST", NULL) == 0);
f270813dc37789a47460406e15ffaed615e68648Matthew Petroff
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens /* subscription */
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens name = "\t\001\r\nname\t\001\n\r";
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens subs.vname = name;
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens subs.storage_name = "\tstorage_name\n";
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens subs.last_change = 1234567890;
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens subs.ns_prefix = "\t\001\r\nprefix\t\001\n\r";
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens test_worker->subs_iter.next_subscription = &subs;
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens test_assert(run_more() == 0);
4a9d7e999ef2ac1e50578dc13ce96ad52917325eMartin Owens test_assert(strcmp(str_c(out), t_strconcat(
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff str_tabescape(name), "\t",
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff str_tabescape(subs.storage_name), "\t",
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff str_tabescape(subs.ns_prefix),
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "\t1234567890\n", NULL)) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_worker->subs_iter.last_subs = TRUE;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(str_c(out), "+\n") == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff /* unsubscription */
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff memcpy(unsubs.name_sha1.guid, test_mailbox_guid1,
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff sizeof(unsubs.name_sha1.guid));
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff unsubs.ns_prefix = "\t\001\r\nprefix2\t\001\n\r";
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff unsubs.last_change = 987654321;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_worker->subs_iter.next_unsubscription = &unsubs;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(str_c(out), t_strconcat(TEST_MAILBOX_GUID1, "\t",
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff str_tabescape(unsubs.ns_prefix), "\t987654321\n", NULL)) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_worker->subs_iter.last_unsubs = TRUE;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(str_c(out), "+\n") == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_end();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff}
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic void test_dsync_proxy_msg_list(void)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff{
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff static const char *test_keywords[] = {
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "kw1", "kw2", NULL
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff };
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff struct dsync_message msg;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff struct test_dsync_worker_msg test_msg;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_begin("proxy server msg list");
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_cmd("MSG-LIST", TEST_MAILBOX_GUID1, TEST_MAILBOX_GUID2, NULL) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff memset(&msg, 0, sizeof(msg));
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.guid = "\t\001\r\nguid\t\001\n\r";
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.uid = 123;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.modseq = 98765432101234;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.save_date = 1234567890;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff /* no flags */
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_msg.msg = msg;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_msg.mailbox_idx = 98;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff array_append(&test_worker->msg_iter.msgs, &test_msg, 1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(str_c(out), t_strconcat(
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "98\t", str_tabescape(msg.guid),
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "\t123\t98765432101234\t\t1234567890\n", NULL)) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff /* all flags, some keywords */
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.modseq = 1;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.save_date = 2;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.guid = "guid";
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.flags = MAIL_FLAGS_MASK;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff msg.keywords = test_keywords;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_msg.msg = msg;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_msg.mailbox_idx = 76;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff array_append(&test_worker->msg_iter.msgs, &test_msg, 1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(str_c(out), "76\tguid\t123\t1\t"
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff ALL_MAIL_FLAGS" kw1 kw2\t2\n") == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff /* last message */
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_worker->msg_iter.last = TRUE;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_more() == 1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(str_c(out), "+\n") == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff out_clear();
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_end();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff}
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic void test_dsync_proxy_box_create(void)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff{
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen struct test_dsync_box_event event;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_begin("proxy server box create");
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_cmd("BOX-CREATE", "noselect", "/",
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "553", "1", NULL) == 1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(test_dsync_worker_next_box_event(test_worker, &event));
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.type == LAST_BOX_TYPE_CREATE);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(event.box.name, "noselect") == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.name_sep == '/');
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.last_change == 553);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.flags == DSYNC_MAILBOX_FLAG_NOSELECT);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.uid_validity == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_cmd("BOX-CREATE", "selectable", "?",
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "61", "2", TEST_MAILBOX_GUID2, "1234567890", "9876",
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff "4610", "28427847284728", "853", NULL) == 1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(test_dsync_worker_next_box_event(test_worker, &event));
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.type == LAST_BOX_TYPE_CREATE);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(strcmp(event.box.name, "selectable") == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.name_sep == '?');
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(memcmp(event.box.mailbox_guid.guid, test_mailbox_guid2, GUID_128_SIZE) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.flags == 2);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.uid_validity == 1234567890);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.uid_next == 9876);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.message_count == 4610);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.highest_modseq == 28427847284728);
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen test_assert(event.box.first_recent_uid == 853);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.last_change == 61);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_end();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff}
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic void test_dsync_proxy_box_delete(void)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff{
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen struct test_dsync_box_event event;
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_begin("proxy server box delete");
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen
ed93708e7161e1b556017476a739316746cba604Matthew Petroff test_assert(run_cmd("BOX-DELETE", TEST_MAILBOX_GUID1, "4351", NULL) == 1);
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen test_assert(test_dsync_worker_next_box_event(test_worker, &event));
87b68db8c76e3425a99bb2f05c70d7b25c50b654Johan B. C. Engelen test_assert(event.type == LAST_BOX_TYPE_DELETE);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(memcmp(event.box.mailbox_guid.guid, test_mailbox_guid1, GUID_128_SIZE) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.last_change == 4351);
38443760557a0143129c1e0570fbc649665456e1Matthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(run_cmd("BOX-DELETE", TEST_MAILBOX_GUID2, "653", NULL) == 1);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(test_dsync_worker_next_box_event(test_worker, &event));
ed93708e7161e1b556017476a739316746cba604Matthew Petroff test_assert(event.type == LAST_BOX_TYPE_DELETE);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(memcmp(event.box.mailbox_guid.guid, test_mailbox_guid2, GUID_128_SIZE) == 0);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_assert(event.box.last_change == 653);
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff test_end();
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff}
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroffstatic void test_dsync_proxy_box_rename(void)
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff{
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff struct test_dsync_box_event event;
f85aa920f6540390f429822b45fa2ba3d3146fbeMatthew Petroff
test_begin("proxy server box rename");
test_assert(run_cmd("BOX-RENAME", TEST_MAILBOX_GUID1, "name\t1", "/", NULL) == 1);
test_assert(test_dsync_worker_next_box_event(test_worker, &event));
test_assert(event.type == LAST_BOX_TYPE_RENAME);
test_assert(memcmp(event.box.mailbox_guid.guid, test_mailbox_guid1, GUID_128_SIZE) == 0);
test_assert(strcmp(event.box.name, "name\t1") == 0);
test_assert(event.box.name_sep == '/');
test_assert(run_cmd("BOX-RENAME", TEST_MAILBOX_GUID2, "", "?", NULL) == 1);
test_assert(test_dsync_worker_next_box_event(test_worker, &event));
test_assert(event.type == LAST_BOX_TYPE_RENAME);
test_assert(memcmp(event.box.mailbox_guid.guid, test_mailbox_guid2, GUID_128_SIZE) == 0);
test_assert(strcmp(event.box.name, "") == 0);
test_assert(event.box.name_sep == '?');
test_end();
}
static void test_dsync_proxy_box_update(void)
{
struct test_dsync_box_event event;
test_begin("proxy server box update");
test_assert(run_cmd("BOX-UPDATE", "updated", "/",
"53", "2", TEST_MAILBOX_GUID1, "34343", "22",
"58293", "2238427847284728", "2482", NULL) == 1);
test_assert(test_dsync_worker_next_box_event(test_worker, &event));
test_assert(event.type == LAST_BOX_TYPE_UPDATE);
test_assert(strcmp(event.box.name, "updated") == 0);
test_assert(event.box.name_sep == '/');
test_assert(memcmp(event.box.mailbox_guid.guid, test_mailbox_guid1, GUID_128_SIZE) == 0);
test_assert(event.box.flags == DSYNC_MAILBOX_FLAG_DELETED_MAILBOX);
test_assert(event.box.uid_validity == 34343);
test_assert(event.box.uid_next == 22);
test_assert(event.box.message_count == 58293);
test_assert(event.box.highest_modseq == 2238427847284728);
test_assert(event.box.first_recent_uid == 2482);
test_assert(event.box.last_change == 53);
test_end();
}
static void test_dsync_proxy_box_select(void)
{
test_begin("proxy server box select");
test_assert(run_cmd("BOX-SELECT", TEST_MAILBOX_GUID1, NULL) == 1);
test_assert(memcmp(test_worker->selected_mailbox.guid, test_mailbox_guid1, GUID_128_SIZE) == 0);
test_assert(run_cmd("BOX-SELECT", TEST_MAILBOX_GUID2, NULL) == 1);
test_assert(memcmp(test_worker->selected_mailbox.guid, test_mailbox_guid2, GUID_128_SIZE) == 0);
test_end();
}
static void test_dsync_proxy_msg_update(void)
{
struct test_dsync_msg_event event;
test_begin("proxy server msg update");
test_assert(run_cmd("MSG-UPDATE", "123", "4782782842924",
"kw1 "ALL_MAIL_FLAGS" kw2", NULL) == 1);
test_assert(test_dsync_worker_next_msg_event(test_worker, &event));
test_assert(event.type == LAST_MSG_TYPE_UPDATE);
test_assert(event.msg.uid == 123);
test_assert(event.msg.modseq == 4782782842924);
test_assert(event.msg.flags == MAIL_FLAGS_MASK);
test_assert(strcmp(event.msg.keywords[0], "kw1") == 0);
test_assert(strcmp(event.msg.keywords[1], "kw2") == 0);
test_assert(event.msg.keywords[2] == NULL);
test_end();
}
static void test_dsync_proxy_msg_uid_change(void)
{
struct test_dsync_msg_event event;
test_begin("proxy server msg uid change");
test_assert(run_cmd("MSG-UID-CHANGE", "454", "995", NULL) == 1);
test_assert(test_dsync_worker_next_msg_event(test_worker, &event));
test_assert(event.type == LAST_MSG_TYPE_UPDATE_UID);
test_assert(event.msg.uid == 454);
test_assert(event.msg.modseq == 995);
test_end();
}
static void test_dsync_proxy_msg_expunge(void)
{
struct test_dsync_msg_event event;
test_begin("proxy server msg expunge");
test_assert(run_cmd("MSG-EXPUNGE", "8585", NULL) == 1);
test_assert(test_dsync_worker_next_msg_event(test_worker, &event));
test_assert(event.type == LAST_MSG_TYPE_EXPUNGE);
test_assert(event.msg.uid == 8585);
test_end();
}
static void test_dsync_proxy_msg_copy(void)
{
struct test_dsync_msg_event msg_event;
test_begin("proxy server msg copy");
test_assert(run_cmd("MSG-COPY", TEST_MAILBOX_GUID1, "5454",
"copyguid", "5678", "74782482882924", "\\Seen foo \\Draft",
"8294284", NULL) == 1);
test_assert(test_dsync_worker_next_msg_event(test_worker, &msg_event));
test_assert(msg_event.type == LAST_MSG_TYPE_COPY);
test_assert(memcmp(msg_event.copy_src_mailbox.guid, test_mailbox_guid1, GUID_128_SIZE) == 0);
test_assert(msg_event.copy_src_uid == 5454);
test_assert(strcmp(msg_event.msg.guid, "copyguid") == 0);
test_assert(msg_event.msg.uid == 5678);
test_assert(msg_event.msg.modseq == 74782482882924);
test_assert(msg_event.msg.flags == (MAIL_SEEN | MAIL_DRAFT));
test_assert(strcmp(msg_event.msg.keywords[0], "foo") == 0);
test_assert(msg_event.msg.keywords[1] == NULL);
test_assert(msg_event.msg.save_date == 8294284);
test_end();
}
static void test_dsync_proxy_msg_save(void)
{
static const char *input = "..dotty\n..behavior\nfrom you\n.\nstop";
struct test_dsync_msg_event event;
const unsigned char *data;
size_t size;
test_begin("proxy server msg save");
server->input = i_stream_create_from_data(input, strlen(input));
test_assert(run_cmd("MSG-SAVE", "28492428", "pop3uidl",
"saveguid", "874", "33982482882924", "\\Flagged bar \\Answered",
"8294284", NULL) == 1);
test_assert(test_dsync_worker_next_msg_event(test_worker, &event));
test_assert(event.type == LAST_MSG_TYPE_SAVE);
test_assert(event.save_data.received_date == 28492428);
test_assert(strcmp(event.save_data.pop3_uidl, "pop3uidl") == 0);
test_assert(strcmp(event.save_body, ".dotty\n.behavior\nfrom you") == 0);
test_assert(strcmp(event.msg.guid, "saveguid") == 0);
test_assert(event.msg.uid == 874);
test_assert(event.msg.modseq == 33982482882924);
test_assert(event.msg.flags == (MAIL_FLAGGED | MAIL_ANSWERED));
test_assert(strcmp(event.msg.keywords[0], "bar") == 0);
test_assert(event.msg.keywords[1] == NULL);
test_assert(event.msg.save_date == 8294284);
data = i_stream_get_data(server->input, &size);
test_assert(size == 4 && memcmp(data, "stop", 4) == 0);
i_stream_destroy(&server->input);
test_end();
}
static struct dsync_proxy_server *
dsync_proxy_server_init_test(buffer_t *outbuf)
{
struct dsync_proxy_server *server;
server = i_new(struct dsync_proxy_server, 1);
server->worker = dsync_worker_init_test();
server->fd_in = 0;
server->fd_out = 0;
server->cmd_pool = pool_alloconly_create("worker server cmd", 1024);
server->output = o_stream_create_buffer(outbuf);
return server;
}
int main(void)
{
static void (*test_functions[])(void) = {
test_dsync_proxy_box_list,
test_dsync_proxy_subs_list,
test_dsync_proxy_msg_list,
test_dsync_proxy_box_create,
test_dsync_proxy_box_delete,
test_dsync_proxy_box_rename,
test_dsync_proxy_box_update,
test_dsync_proxy_box_select,
test_dsync_proxy_msg_update,
test_dsync_proxy_msg_uid_change,
test_dsync_proxy_msg_expunge,
test_dsync_proxy_msg_copy,
test_dsync_proxy_msg_save,
NULL
};
test_init();
out = buffer_create_dynamic(default_pool, 1024);
server = dsync_proxy_server_init_test(out);
test_worker = (struct test_dsync_worker *)server->worker;
test_run_funcs(test_functions);
return test_deinit();
}