* add some mu-msg-gmime unit tests

This commit is contained in:
Dirk-Jan C. Binnema 2010-08-18 00:18:42 +03:00
parent 537dd1b3a1
commit 52e6fa5f32
6 changed files with 199 additions and 31 deletions

1
TODO
View File

@ -24,6 +24,7 @@
- [X] fix rhel5 installation issue
- [X] don't require gio
- [X] summary
- [ ] attachment handling
- [ ] review docs
- [ ] xml,json,sexp output

View File

@ -23,4 +23,6 @@ test: all $(TEST_PROGS)
test "$$subdir" = "." || \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $$? ; \
done
.PHONY: test
.PHONY: test gprof

View File

@ -772,6 +772,24 @@ mu_msg_gmime_get_summary (MuMsgGMime *msg, size_t max_lines)
}
void
mu_msg_gmime_attach_foreach (MuMsgGMime* msg, MuMsgGMimeAttachForeachFunc func,
gpointer user_data)
{
/* FIXME */
}
gboolean
mu_msg_gmime_save_attachment (MuMsgGMime *msg, unsigned num,
const char *targetdir)
{
return TRUE; /* FIXME */
}
const char*
mu_msg_gmime_get_field_string (MuMsgGMime *msg, const MuMsgField* field)
{
@ -844,8 +862,8 @@ fill_contact (MuMsgContact *contact, InternetAddress *addr,
static int
address_list_foreach (InternetAddressList *addrlist,
MuMsgContactType ctype,
MuMsgGMimeContactsCallback cb,
void *ptr)
MuMsgGMimeContactsForeachFunc func,
gpointer user_data)
{
int i,rv;
@ -862,7 +880,7 @@ address_list_foreach (InternetAddressList *addrlist,
continue;
}
rv = (cb)(&contact, ptr);
rv = (func)(&contact, user_data);
if (rv != 0)
break;
}
@ -872,8 +890,8 @@ address_list_foreach (InternetAddressList *addrlist,
static int
mu_msg_gmime_get_contacts_from (MuMsgGMime *msg, MuMsgGMimeContactsCallback cb,
void *ptr)
mu_msg_gmime_get_contacts_from (MuMsgGMime *msg, MuMsgGMimeContactsForeachFunc func,
gpointer user_data)
{
InternetAddressList *list;
int rv;
@ -886,7 +904,7 @@ mu_msg_gmime_get_contacts_from (MuMsgGMime *msg, MuMsgGMimeContactsCallback cb,
list = internet_address_list_parse_string (
g_mime_message_get_sender (msg->_mime_msg));
rv = address_list_foreach (list, MU_MSG_CONTACT_TYPE_FROM, cb, ptr);
rv = address_list_foreach (list, MU_MSG_CONTACT_TYPE_FROM, func, user_data);
if (list)
g_object_unref (G_OBJECT(list));
@ -895,9 +913,9 @@ mu_msg_gmime_get_contacts_from (MuMsgGMime *msg, MuMsgGMimeContactsCallback cb,
}
int
mu_msg_gmime_get_contacts_foreach (MuMsgGMime *msg, MuMsgGMimeContactsCallback cb,
void *ptr)
void
mu_msg_gmime_contacts_foreach (MuMsgGMime *msg, MuMsgGMimeContactsForeachFunc func,
gpointer user_data)
{
int i, rv;
struct {
@ -909,23 +927,21 @@ mu_msg_gmime_get_contacts_foreach (MuMsgGMime *msg, MuMsgGMimeContactsCallback c
{GMIME_RECIPIENT_TYPE_BCC, MU_MSG_CONTACT_TYPE_BCC},
};
g_return_val_if_fail (cb && msg, -1);
g_return_if_fail (func && msg);
/* first, get the from address */
rv = mu_msg_gmime_get_contacts_from (msg, cb, ptr);
rv = mu_msg_gmime_get_contacts_from (msg, func, user_data);
if (rv != 0)
return rv; /* callback told us to stop */
return; /* callback told us to stop */
for (i = 0, rv = 0; i != G_N_ELEMENTS(ctypes); ++i) {
InternetAddressList *addrlist;
addrlist = g_mime_message_get_recipients (msg->_mime_msg,
ctypes[i]._gmime_type);
rv = address_list_foreach (addrlist, ctypes[i]._type,cb, ptr);
rv = address_list_foreach (addrlist, ctypes[i]._type, func, user_data);
if (rv != 0)
break;
}
return rv;
}

View File

@ -112,6 +112,46 @@ const char* mu_msg_gmime_get_body_html (MuMsgGMime *msg);
*/
const char* mu_msg_gmime_get_summary (MuMsgGMime *msg, size_t max_lines);
struct _MuMsgGMimeAttach {
unsigned index; /* index of the attachment (names may not be unique) */
const char* name; /* name of the attachment */
size_t size; /* size in bytes, or 0 if not available */
const char* mime_type; /* the mime type */
};
typedef struct _MuMsgGMimeAttach MuMsgGMimeAttach;
typedef gboolean (*MuMsgGMimeAttachForeachFunc) (MuMsgGMimeAttach *att, gpointer data);
/**
* call a user function for each attachment found in the message. the
* function will be calle d for each attachment and as long a the
* user-function returns TRUE
*
* @param msg a valid MuMsgGMime
* @param the function to call (callback)
* @param user_data a user pointer which will be passed to the callback function
*
* @return a list of attachment
*/
void mu_msg_gmime_attach_foreach (MuMsgGMime* msg,
MuMsgGMimeAttachForeachFunc func,
gpointer user_data);
/**
* save a specific attachment to some targetdir
*
* @param msg a valid MuMsgGMime instance
* @param index index of the attachment you want to save
* @param targetdir filesystem directory to save the attachment
*
* @return TRUE if saving succeeded, FALSE otherwise
*/
gboolean mu_msg_gmime_save_attachment (MuMsgGMime *msg, unsigned num,
const char *targetdir);
/**
* get the sender (From:) of this message
*
@ -199,9 +239,7 @@ const char* mu_msg_gmime_get_msgid (MuMsgGMime *msg);
* is no such header. the returned string should *not* be modified or freed.
*/
const char* mu_msg_gmime_get_header (MuMsgGMime *msg,
const char* header);
const char* header);
/**
* get the message date/time (the Date: field) as time_t, using UTC
@ -278,25 +316,21 @@ MuMsgPriority mu_msg_gmime_get_priority (MuMsgGMime *msg);
*/
time_t mu_msg_gmime_get_timestamp (MuMsgGMime *msg);
typedef int (*MuMsgGMimeContactsCallback) (MuMsgContact*, void *ptr);
typedef gboolean (*MuMsgGMimeContactsForeachFunc) (MuMsgContact* contact,
gpointer user_data);
/**
* call a function for each of the contacts in a message
*
* @param msg a valid MuMsgGMime* instance
* @param cb a callback function to call for each contact; when
* the callback returns non-0, the function stops, and this last
* callback return value is returned
* @param ptr a user-provide pointer that will be passed to the callback
* @param func a callback function to call for each contact; when
* the callback does not return TRUE, it won't be called again
* @param user_data a user-provide pointer that will be passed to the callback
*
* @return 0 if the callback was called for each recipient, -1 if there
* was an error and any other != 0 number the callback returned
*/
int mu_msg_gmime_get_contacts_foreach (MuMsgGMime *msg,
MuMsgGMimeContactsCallback cb,
void *ptr);
void mu_msg_gmime_contacts_foreach (MuMsgGMime *msg,
MuMsgGMimeContactsForeachFunc func,
gpointer user_data);
G_END_DECLS
#endif /*__MU_MSG_GIME_H__*/

View File

@ -44,6 +44,11 @@ TEST_PROGS += test-mu-query
test_mu_query_SOURCES= test-mu-query.c dummy.cc
test_mu_query_LDADD= libtestmucommon.la
TEST_PROGS += test-mu-msg-gmime
test_mu_msg_gmime_SOURCES= test-mu-msg-gmime.c
test_mu_msg_gmime_LDADD= libtestmucommon.la
libtestmucommon_la_SOURCES= \
test-mu-common.c \
test-mu-common.h

View File

@ -0,0 +1,110 @@
/*
** Copyright (C) 2008-2010 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
**
** This program is free software; you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the
** Free Software Foundation; either version 3, or (at your option) any
** later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software Foundation,
** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif /*HAVE_CONFIG_H*/
#include <glib.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <locale.h>
#include "test-mu-common.h"
#include "src/mu-msg-gmime.h"
static gchar*
get_mailpath (unsigned idx)
{
const char* mailfile;
switch (idx) {
case 1: mailfile = "cur/1220863042.12663_1.mindcrime!2,S"; break;
case 2: mailfile = "cur/1220863087.12663_19.mindcrime!2,S"; break;
default: mailfile = NULL;
}
if (mailfile)
return g_strdup_printf ("%s/%s", MU_TESTMAILDIR, mailfile);
else
return NULL;
}
static void
test_mu_msg_gmime_01 (void)
{
char *mfile;
MuMsgGMime *msg;
mu_msg_gmime_init ();
mfile = get_mailpath (1);
msg = mu_msg_gmime_new (mfile, NULL);
g_assert_cmpstr (mu_msg_gmime_get_to(msg),
==, "gcc-help@gcc.gnu.org");
g_assert_cmpstr (mu_msg_gmime_get_subject(msg),
==, "gcc include search order");
g_assert_cmpstr (mu_msg_gmime_get_from(msg),
==, "anon@example.com");
g_assert_cmpstr (mu_msg_gmime_get_msgid(msg),
==, "3BE9E6535E3029448670913581E7A1A20D852173@"
"emss35m06.us.lmco.com");
g_assert_cmpuint (mu_msg_gmime_get_priority(msg), /* 'klub' */
==, MU_MSG_PRIORITY_NORMAL);
g_assert_cmpuint (mu_msg_gmime_get_date(msg),
==, 1217530645);
mu_msg_gmime_destroy (msg);
g_free (mfile);
mu_msg_gmime_uninit ();
}
static gboolean
ignore_error (const char* log_domain, GLogLevelFlags log_level, const gchar* msg,
gpointer user_data)
{
return FALSE; /* don't abort */
}
static void
shutup (void) {}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
/* mu_msg_str_date */
g_test_add_func ("/mu-msg-gmime/mu-msg-gmime",
test_mu_msg_gmime_01);
g_log_set_handler (NULL,
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION,
(GLogFunc)shutup, NULL);
return g_test_run ();
}