]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: Add unit test for imap-client-hibernate
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 24 Aug 2020 16:12:21 +0000 (19:12 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 5 Nov 2020 16:09:13 +0000 (18:09 +0200)
src/imap/Makefile.am
src/imap/imap-client-hibernate.c
src/imap/imap-client.h
src/imap/test-imap-client-hibernate.c [new file with mode: 0644]

index 0e4c2ad1f0329a5cedb615b46affe3347d19a778..0a45fd3926c016e24c769b4ad72e0a291511307b 100644 (file)
@@ -4,6 +4,7 @@ pkglibexec_PROGRAMS = imap
 
 AM_CPPFLAGS = \
        -I$(top_srcdir)/src/lib \
+       -I$(top_srcdir)/src/lib-test \
        -I$(top_srcdir)/src/lib-settings \
        -I$(top_srcdir)/src/lib-dict \
        -I$(top_srcdir)/src/lib-master \
@@ -67,7 +68,7 @@ cmds = \
        cmd-x-cancel.c \
        cmd-x-state.c
 
-imap_SOURCES = \
+common_sources = \
        $(cmds) \
        imap-client.c \
        imap-client-hibernate.c \
@@ -86,7 +87,10 @@ imap_SOURCES = \
        imap-status.c \
        imap-state.c \
        imap-sync.c \
-       mail-storage-callbacks.c \
+       mail-storage-callbacks.c
+
+imap_SOURCES = \
+       $(common_sources) \
        main.c
 
 headers = \
@@ -110,3 +114,17 @@ headers = \
 
 pkginc_libdir=$(pkgincludedir)
 pkginc_lib_HEADERS = $(headers)
+
+test_programs = \
+       test-imap-client-hibernate
+noinst_PROGRAMS = $(test_programs)
+
+test_imap_client_hibernate_SOURCES = \
+       test-imap-client-hibernate.c $(common_sources)
+test_imap_client_hibernate_LDADD = $(imap_LDADD)
+test_imap_client_hibernate_DEPENDENCIES = $(imap_DEPENDENCIES)
+
+check-local:
+       for bin in $(test_programs); do \
+         if ! $(RUN_TEST) ./$$bin; then exit 1; fi; \
+       done
index 4ef323453c36efd85c60705be9907f3bf0792c69..64b43bee43e5e563d73cb731027dcbb21ed97c0a 100644 (file)
@@ -42,8 +42,8 @@ imap_hibernate_handshake(int fd, const char *path, const char **error_r)
        return -1;
 }
 
-static void imap_hibernate_write_cmd(struct client *client, string_t *cmd,
-                                    const buffer_t *state, int fd_notify)
+void imap_hibernate_write_cmd(struct client *client, string_t *cmd,
+                             const buffer_t *state, int fd_notify)
 {
        struct mail_user *user = client->user;
        struct stat peer_st;
index f2ffe0d7c9163baba56109eb9328a46b96afcd9d..150ad5d1b8fdf48eac81d2ba7fa2eae5f23908b2 100644 (file)
@@ -343,6 +343,9 @@ void client_continue_pending_input(struct client *client);
 void client_add_missing_io(struct client *client);
 const char *client_stats(struct client *client);
 
+void imap_hibernate_write_cmd(struct client *client, string_t *cmd,
+                             const buffer_t *state, int fd_notify);
+
 void client_input(struct client *client);
 bool client_handle_input(struct client *client);
 int client_output(struct client *client);
diff --git a/src/imap/test-imap-client-hibernate.c b/src/imap/test-imap-client-hibernate.c
new file mode 100644 (file)
index 0000000..ee4a0f0
--- /dev/null
@@ -0,0 +1,99 @@
+/* Copyright (c) 2020 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "test-common.h"
+#include "istream.h"
+#include "ostream.h"
+#include "str.h"
+#include "strescape.h"
+#include "mail-storage-private.h"
+#include "imap-common.h"
+#include "imap-client.h"
+
+#define EVILSTR "\t\r\n\001"
+#define EVILSTR_ESCAPED "\001t\001r\001n\0011"
+
+imap_client_created_func_t *hook_client_created = NULL;
+bool imap_debug = FALSE;
+
+void imap_refresh_proctitle(void) { }
+int client_create_from_input(const struct mail_storage_service_input *input ATTR_UNUSED,
+                            int fd_in ATTR_UNUSED, int fd_out ATTR_UNUSED,
+                            struct client **client_r ATTR_UNUSED,
+                            const char **error_r ATTR_UNUSED) { return -1; }
+
+static void test_imap_client_hibernate(void)
+{
+       buffer_t *state = buffer_create_dynamic(pool_datastack_create(), 0);
+       struct mail_user_settings mail_set = {
+               .mail_log_prefix = EVILSTR"%u",
+       };
+       struct mail_user mail_user = {
+               .set = &mail_set,
+               .conn = {
+                       .local_ip = t_new(struct ip_addr, 1),
+                       .remote_ip = t_new(struct ip_addr, 1),
+               },
+               .username = EVILSTR"testuser",
+               .session_id = EVILSTR"session",
+               .session_create_time = 1234567,
+               .pool = pool_datastack_create(),
+               .uid = 4000,
+               .gid = 4001,
+       };
+       struct imap_settings imap_set = {
+               .imap_idle_notify_interval = 120,
+               .imap_logout_format = "",
+       };
+       struct client_command_context queue = {
+               .tag = EVILSTR"tag",
+               .name = "IDLE",
+       };
+       struct client client = {
+               .user = &mail_user,
+               .set = &imap_set,
+               .fd_in = dev_null_fd,
+               .input = i_stream_create_from_data("", 0),
+               .output = o_stream_create_buffer(state),
+               .command_queue = &queue,
+       };
+       test_begin("imap client hibernate");
+       test_assert(net_addr2ip("127.0.0.1", mail_user.conn.local_ip) == 0);
+       test_assert(net_addr2ip("127.0.0.2", mail_user.conn.remote_ip) == 0);
+
+       string_t *cmd = t_str_new(256);
+       imap_hibernate_write_cmd(&client, cmd, state, -1);
+
+       const char *const *args = t_strsplit(str_c(cmd), "\t");
+       unsigned int i = 0;
+       test_assert_strcmp(args[i++], EVILSTR_ESCAPED"testuser");
+       test_assert_strcmp(args[i++], EVILSTR_ESCAPED"%u");
+       test_assert_strcmp(args[i++], "idle_notify_interval=120");
+       test_assert(strncmp(args[i++], "peer_dev_major=", 15) == 0);
+       test_assert(strncmp(args[i++], "peer_dev_minor=", 15) == 0);
+       test_assert(strncmp(args[i++], "peer_ino=", 9) == 0);
+       test_assert_strcmp(args[i++], "session="EVILSTR_ESCAPED"session");
+       test_assert_strcmp(args[i++], "session_created=1234567");
+       test_assert_strcmp(args[i++], "lip=127.0.0.1");
+       test_assert_strcmp(args[i++], "rip=127.0.0.2");
+       test_assert_strcmp(args[i++], "uid=4000");
+       test_assert_strcmp(args[i++], "gid=4001");
+       test_assert_strcmp(args[i++], "tag="EVILSTR_ESCAPED"tag");
+       test_assert(strncmp(args[i++], "stats=", 6) == 0);
+       test_assert_strcmp(args[i++], "idle-cmd");
+       test_assert(strncmp(args[i++], "state=", 6) == 0);
+       test_assert(args[i] == NULL);
+
+       i_stream_destroy(&client.input);
+       o_stream_destroy(&client.output);
+       test_end();
+}
+
+int main(void)
+{
+       static void (*test_functions[])(void) = {
+               test_imap_client_hibernate,
+               NULL
+       };
+       return test_run(test_functions);
+}