aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog67
-rw-r--r--camel/camel-address.c1
-rw-r--r--camel/camel-exception.c17
-rw-r--r--camel/camel-folder-search.c3
-rw-r--r--camel/camel-lock.c2
-rw-r--r--camel/camel-mime-part.c4
-rw-r--r--camel/camel-mime-utils.c31
-rw-r--r--camel/camel-mime-utils.h1
-rw-r--r--camel/camel-session.c1
-rw-r--r--camel/camel-store.c3
-rw-r--r--camel/camel-stream-mem.c6
-rw-r--r--camel/providers/local/camel-local-folder.c13
-rw-r--r--camel/providers/local/camel-local-store.c3
-rw-r--r--camel/providers/local/camel-local-summary.c5
-rw-r--r--camel/providers/local/camel-maildir-summary.c14
-rw-r--r--camel/providers/local/camel-mbox-summary.c15
-rw-r--r--camel/providers/local/camel-mh-summary.c4
-rw-r--r--camel/tests/folder/Makefile.am6
-rw-r--r--camel/tests/folder/test1.c5
-rw-r--r--camel/tests/folder/test2.c13
-rw-r--r--camel/tests/folder/test3.c208
-rw-r--r--camel/tests/lib/messages.c10
-rw-r--r--camel/tests/message/test1.c11
-rw-r--r--camel/tests/message/test2.c2
24 files changed, 326 insertions, 119 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 1d3c75262b..4db4d32274 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,70 @@
+2000-11-29 Not Zed <NotZed@HelixCode.com>
+
+ * tests/message/test2.c (main): Add a missed unref.
+
+ * camel-stream-mem.c (camel_stream_mem_set_buffer): We must set
+ ourselves as the owner of the byte-array.
+ Weird, someone has modified this file (its been reindented), but i
+ can't see any changelogs ...
+
+ * tests/lib/messages.c (content_finalise): Fix memleak in tester,
+ free byte array when our content object is deleted.
+
+ * camel-folder-search.c (camel_folder_search_finalize): Yeah
+ great, so the sexp is a gtk object, not a camel object. Isn't
+ that going to be fun to fix?
+
+ * camel-session.c (camel_session_finalise): Free the storage path.
+
+ * providers/local/camel-local-store.c (camel_local_store_init): If
+ store->folders is setup, free it first, then overwrite. Hmm,
+ this seems a bit crappy to me.
+
+ * camel-store.c (camel_store_init): Dont setup store->folders if
+ its already setup.
+
+ * camel-exception.c (camel_exception_setv): Removed a memleak. no
+ need to strdup after a strdup_printf!!!
+
+ * camel-address.c (camel_address_finalize): Free the address
+ ptrarray, once finished.
+
+ * providers/local/camel-local-folder.c (local_finalize): Make sure
+ we dont leave the folder locked on close.
+ (local_finalize): Free summary/search.
+
+ * providers/local/camel-mh-summary.c (mh_summary_next_uid_string):
+ Small memleak, always free name after using it.
+
+ * camel-mime-part.c (set_content_object): Free txt after setting
+ the header.
+
+ * providers/local/camel-maildir-summary.c (maildir_summary_check):
+ Fix a memleak, close the dir after scanning new.
+ (message_info_free): Added so we can free the filename cached in
+ the messageinfo.
+ (camel_maildir_summary_finalise): Free the hostname.
+
+ * tests/folder/test[12].c (main): Clear out camel-test before
+ starting.
+
+ * providers/local/camel-mbox-summary.c (mbox_summary_sync_quick):
+ Because encode_x_evolution folds the line (sigh, because
+ encode_param does, unlike every other function in
+ camel-mime-utils), unfold the encoded result before comparing.
+ (mbox_summary_sync_quick): Another small memleak, free xevnew once
+ finished with it.
+
+ * camel-mime-utils.c (header_decode_quoted_string): Removed a
+ redundant check for c=0.
+ (header_unfold): New function to un-fold headers.
+
+ * providers/local/camel-local-summary.c
+ (local_summary_encode_x_evolution): some problems with encoding
+ tags, using the wrong output strings.
+ (local_summary_encode_x_evolution): We dont need to append a ;
+ either, param_list_format_append() will do it for us.
+
2000-11-28 JP Rosevear <jpr@helixcode.com>
* camel-lock.c: No longer hard code the enabled lock types
diff --git a/camel/camel-address.c b/camel/camel-address.c
index 392b0a69f9..515e86cc02 100644
--- a/camel/camel-address.c
+++ b/camel/camel-address.c
@@ -43,6 +43,7 @@ static void
camel_address_finalize (CamelObject *obj)
{
camel_address_remove((CamelAddress *)obj, -1);
+ g_ptr_array_free(((CamelAddress *)obj)->addresses, TRUE);
}
CamelType
diff --git a/camel/camel-exception.c b/camel/camel-exception.c
index cf5daff9d3..70b0d6149f 100644
--- a/camel/camel-exception.c
+++ b/camel/camel-exception.c
@@ -179,27 +179,18 @@ camel_exception_setv (CamelException *ex,
va_list args;
gchar *tmp_desc_string;
-
/* if no exception is given, do nothing */
if (!ex) return;
+ if (ex->desc)
+ g_free (ex->desc);
/* create the temporary exception string */
va_start(args, format);
- tmp_desc_string = g_strdup_vprintf (format, args);
+ ex->desc = g_strdup_vprintf (format, args);
va_end (args);
-
-
- /* now set the exception. We don't call
- camel_exception_set because we want to
- avoid a useless strdup () */
+
ex->id = id;
-
- /* remove the previous exception description */
- if (ex->desc)
- g_free (ex->desc);
- ex->desc = g_strdup (tmp_desc_string);
-
}
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index 4d61b5cfa1..8bd1e90b24 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -116,8 +116,9 @@ camel_folder_search_finalize (CamelObject *obj)
CamelFolderSearch *search = (CamelFolderSearch *)obj;
struct _CamelFolderSearchPrivate *p = _PRIVATE(obj);
+ /* yeah, this is a gtk object */
if (search->sexp)
- camel_object_unref((CamelObject *)search->sexp);
+ gtk_object_unref(search->sexp);
g_free(search->last_search);
g_hash_table_foreach(p->mempool_hash, free_mempool, obj);
diff --git a/camel/camel-lock.c b/camel/camel-lock.c
index 8b9b159001..f1a43a3543 100644
--- a/camel/camel-lock.c
+++ b/camel/camel-lock.c
@@ -134,7 +134,7 @@ camel_lock_dot(const char *path, CamelException *ex)
/* check for stale lock, kill it */
if (stat(lock, &st) == 0) {
time_t now = time(0);
- d(printf("There is an existing lock %ld seconds old\n", now-st.st_ctime));
+ (printf("There is an existing lock %ld seconds old\n", now-st.st_ctime));
if (st.st_ctime < now - CAMEL_LOCK_DOT_STALE) {
d(printf("Removing it now\n"));
unlink(lock);
diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c
index 5fb2775ca1..86ac9c0b13 100644
--- a/camel/camel-mime-part.c
+++ b/camel/camel-mime-part.c
@@ -468,8 +468,8 @@ set_content_object (CamelMedium *medium, CamelDataWrapper *content)
char *txt;
txt = header_content_type_format(object_content_field?object_content_field->content_type:NULL);
- camel_medium_set_header (CAMEL_MEDIUM (mime_part),
- "Content-Type", txt);
+ camel_medium_set_header (CAMEL_MEDIUM (mime_part), "Content-Type", txt);
+ g_free(txt);
}
}
diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c
index f1f08e25a0..82162a0239 100644
--- a/camel/camel-mime-utils.c
+++ b/camel/camel-mime-utils.c
@@ -1440,7 +1440,7 @@ header_decode_quoted_string(const char **in)
/* first, calc length */
inptr++;
intmp = inptr;
- while ( (c = *intmp++) && c!= '"' && c != '\0') {
+ while ( (c = *intmp++) && c!= '"') {
if (c=='\\' && *intmp) {
intmp++;
skip++;
@@ -1448,7 +1448,7 @@ header_decode_quoted_string(const char **in)
}
outlen = intmp-inptr-skip;
out = outptr = g_malloc(outlen+1);
- while ( (c = *inptr++) && c!= '"' && c != '\0') {
+ while ( (c = *inptr++) && c!= '"') {
if (c=='\\' && *inptr) {
c = *inptr++;
}
@@ -3044,6 +3044,33 @@ header_fold(const char *in)
return ret;
}
+char *
+header_unfold(const char *in)
+{
+ char *out = g_malloc(strlen(in)+1);
+ const char *inptr = in;
+ char c, *o = out;
+
+ o = out;
+ while ((c = *inptr++)) {
+ if (c == '\n') {
+ if (is_lwsp(*inptr)) {
+ do {
+ inptr++;
+ } while (is_lwsp(*inptr));
+ *o++ = ' ';
+ } else {
+ *o++ = c;
+ }
+ } else {
+ *o++ = c;
+ }
+ }
+ *o = 0;
+
+ return out;
+}
+
#ifdef BUILD_TABLE
/* for debugging tests */
diff --git a/camel/camel-mime-utils.h b/camel/camel-mime-utils.h
index 6f452f1ffa..9bcdb063ac 100644
--- a/camel/camel-mime-utils.h
+++ b/camel/camel-mime-utils.h
@@ -142,6 +142,7 @@ void header_raw_clear(struct _header_raw **list);
/* fold a header */
char *header_fold(const char *in);
+char *header_unfold(const char *in);
/* decode a header which is a simple token */
char *header_token_decode(const char *in);
diff --git a/camel/camel-session.c b/camel/camel-session.c
index ac85005da2..3ca63ca9e9 100644
--- a/camel/camel-session.c
+++ b/camel/camel-session.c
@@ -65,6 +65,7 @@ camel_session_finalise (CamelObject *o)
{
CamelSession *session = (CamelSession *)o;
+ g_free(session->storage_path);
g_hash_table_foreach_remove (session->providers,
camel_session_destroy_provider, NULL);
g_hash_table_destroy (session->providers);
diff --git a/camel/camel-store.c b/camel/camel-store.c
index 7712079af7..362b3fae92 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -90,7 +90,8 @@ camel_store_init (void *o, void *k)
{
CamelStore *store = o;
- store->folders = g_hash_table_new (g_str_hash, g_str_equal);
+ if (store->folders == NULL)
+ store->folders = g_hash_table_new (g_str_hash, g_str_equal);
store->flags = 0;
}
diff --git a/camel/camel-stream-mem.c b/camel/camel-stream-mem.c
index 77941894b7..0c07a2759f 100644
--- a/camel/camel-stream-mem.c
+++ b/camel/camel-stream-mem.c
@@ -127,14 +127,14 @@ void camel_stream_mem_set_byte_array (CamelStreamMem *s, GByteArray *buffer)
s->buffer = buffer;
}
-void camel_stream_mem_set_buffer (CamelStreamMem *s, const char *buffer,
- size_t len)
+void camel_stream_mem_set_buffer (CamelStreamMem *s, const char *buffer, size_t len)
{
GByteArray *ba;
ba = g_byte_array_new ();
- g_byte_array_append (ba, (const guint8 *)buffer, len);
+ g_byte_array_append(ba, (const guint8 *)buffer, len);
camel_stream_mem_set_byte_array(s, ba);
+ s->owner = TRUE;
}
static void
diff --git a/camel/providers/local/camel-local-folder.c b/camel/providers/local/camel-local-folder.c
index 16ca2d8b2e..787b482169 100644
--- a/camel/providers/local/camel-local-folder.c
+++ b/camel/providers/local/camel-local-folder.c
@@ -138,9 +138,22 @@ local_finalize(CamelObject * object)
{
CamelLocalFolder *local_folder = CAMEL_LOCAL_FOLDER(object);
+ if (local_folder->summary) {
+ camel_local_summary_sync(local_folder->summary, FALSE, local_folder->changes, NULL);
+ camel_object_unref((CamelObject *)local_folder->summary);
+ }
+
+ if (local_folder->search) {
+ camel_object_unref((CamelObject *)local_folder->search);
+ }
+
+ /* must free index after summary, since it isn't refcounted */
if (local_folder->index)
ibex_close(local_folder->index);
+ while (local_folder->locked> 0)
+ camel_local_folder_unlock(local_folder);
+
g_free(local_folder->base_path);
g_free(local_folder->folder_path);
g_free(local_folder->summary_path);
diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c
index 748cc45290..9af9df2744 100644
--- a/camel/providers/local/camel-local-store.c
+++ b/camel/providers/local/camel-local-store.c
@@ -77,6 +77,9 @@ camel_local_store_init (gpointer object, gpointer klass)
CamelStore *store = CAMEL_STORE (object);
/* local names are filenames, so they are case-sensitive. */
+ if (store->folders)
+ g_hash_table_destroy(store->folders);
+
store->folders = g_hash_table_new (g_str_hash, g_str_equal);
}
diff --git a/camel/providers/local/camel-local-summary.c b/camel/providers/local/camel-local-summary.c
index 81cde8e808..83b0e6313b 100644
--- a/camel/providers/local/camel-local-summary.c
+++ b/camel/providers/local/camel-local-summary.c
@@ -470,14 +470,13 @@ local_summary_encode_x_evolution(CamelLocalSummary *cls, const CamelMessageInfo
}
if (flag || tag) {
- g_string_append(out, "; ");
val = g_string_new("");
if (flag) {
while (flag) {
g_string_append(val, flag->name);
if (flag->next)
- g_string_append_c(out, ',');
+ g_string_append_c(val, ',');
flag = flag->next;
}
header_set_param(&params, "flags", val->str);
@@ -489,7 +488,7 @@ local_summary_encode_x_evolution(CamelLocalSummary *cls, const CamelMessageInfo
g_string_append_c(val, '=');
g_string_append(val, tag->value);
if (tag->next)
- g_string_append_c(out, ',');
+ g_string_append_c(val, ',');
tag = tag->next;
}
header_set_param(&params, "tags", val->str);
diff --git a/camel/providers/local/camel-maildir-summary.c b/camel/providers/local/camel-maildir-summary.c
index fe88539ca3..0fa9f1c0d9 100644
--- a/camel/providers/local/camel-maildir-summary.c
+++ b/camel/providers/local/camel-maildir-summary.c
@@ -38,6 +38,7 @@
#define CAMEL_MAILDIR_SUMMARY_VERSION (0x2000)
static CamelMessageInfo *message_info_new(CamelFolderSummary *, struct _header_raw *);
+static void message_info_free(CamelFolderSummary *, CamelMessageInfo *mi);
static int maildir_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changeinfo, CamelException *ex);
static int maildir_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInfo *changeinfo, CamelException *ex);
@@ -86,6 +87,7 @@ camel_maildir_summary_class_init (CamelMaildirSummaryClass *class)
/* override methods */
sklass->message_info_new = message_info_new;
+ sklass->message_info_free = message_info_free;
sklass->next_uid_string = maildir_summary_next_uid_string;
lklass->check = maildir_summary_check;
@@ -118,6 +120,7 @@ camel_maildir_summary_finalise(CamelObject *obj)
{
CamelMaildirSummary *o = (CamelMaildirSummary *)obj;
+ g_free(o->priv->hostname);
g_free(o->priv);
}
@@ -253,6 +256,16 @@ static CamelMessageInfo *message_info_new(CamelFolderSummary * s, struct _header
return mi;
}
+static void message_info_free(CamelFolderSummary *s, CamelMessageInfo *mi)
+{
+ CamelMaildirMessageInfo *mdi = (CamelMaildirMessageInfo *)mi;
+
+ g_free(mdi->filename);
+
+ ((CamelFolderSummaryClass *) parent_class)->message_info_free(s, mi);
+}
+
+
static char *maildir_summary_next_uid_string(CamelFolderSummary *s)
{
CamelMaildirSummary *mds = (CamelMaildirSummary *)s;
@@ -476,6 +489,7 @@ maildir_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changes, Ca
g_free(dest);
}
}
+ closedir(dir);
g_free(new);
g_free(cur);
diff --git a/camel/providers/local/camel-mbox-summary.c b/camel/providers/local/camel-mbox-summary.c
index b4c2d151a5..b2a5e13e4a 100644
--- a/camel/providers/local/camel-mbox-summary.c
+++ b/camel/providers/local/camel-mbox-summary.c
@@ -646,7 +646,7 @@ mbox_summary_sync_quick(CamelLocalSummary *cls, gboolean expunge, CamelFolderCha
int i, count;
CamelMboxMessageInfo *info;
int fd = -1;
- char *xevnew;
+ char *xevnew, *xevtmp;
const char *xev;
int len;
off_t lastpos;
@@ -709,12 +709,20 @@ mbox_summary_sync_quick(CamelLocalSummary *cls, gboolean expunge, CamelFolderCha
goto error;
}
xevnew = camel_local_summary_encode_x_evolution(cls, (CamelMessageInfo *)info);
- /* the raw header contains a leading ' ', so count that too */
- if (strlen(xev)-1 != strlen(xevnew)) {
+ /* SIGH: encode_param_list is about the only function which folds headers by itself.
+ This should be fixed somehow differently (either parser doesn't fold headers,
+ or param_list doesn't, or something */
+ xevtmp = header_unfold(xevnew);
+ /* the raw header contains a leading ' ', so (dis)count that too */
+ if (strlen(xev)-1 != strlen(xevtmp)) {
g_free(xevnew);
+ g_free(xevtmp);
g_warning("Hmm, the xev headers shouldn't have changed size, but they did");
goto error;
}
+ g_free(xevtmp);
+
+ /* we write out the xevnew string, assuming its been folded identically to the original too! */
lastpos = lseek(fd, 0, SEEK_CUR);
lseek(fd, xevoffset+strlen("X-Evolution: "), SEEK_SET);
@@ -722,6 +730,7 @@ mbox_summary_sync_quick(CamelLocalSummary *cls, gboolean expunge, CamelFolderCha
len = write(fd, xevnew, strlen(xevnew));
} while (len == -1 && errno == EINTR);
lseek(fd, lastpos, SEEK_SET);
+ g_free(xevnew);
camel_mime_parser_drop_step(mp);
camel_mime_parser_drop_step(mp);
diff --git a/camel/providers/local/camel-mh-summary.c b/camel/providers/local/camel-mh-summary.c
index c28ee1f495..e9fb9f116c 100644
--- a/camel/providers/local/camel-mh-summary.c
+++ b/camel/providers/local/camel-mh-summary.c
@@ -145,7 +145,7 @@ static char *mh_summary_next_uid_string(CamelFolderSummary *s)
CamelLocalSummary *cls = (CamelLocalSummary *)s;
int fd = -1;
guint32 uid;
- char *name = NULL;
+ char *name;
/* if we are working to add an existing file, then use current_uid */
if (mhs->priv->current_uid)
@@ -153,12 +153,12 @@ static char *mh_summary_next_uid_string(CamelFolderSummary *s)
/* else scan for one - and create it too, to make sure */
do {
- g_free(name);
close(fd);
uid = camel_folder_summary_next_uid(s);
name = g_strdup_printf("%s/%u", cls->folder_path, uid);
/* O_EXCL isn't guaranteed, sigh. Oh well, bad luck, mh has problems anyway */
fd = open(name, O_WRONLY|O_CREAT|O_EXCL, 0600);
+ g_free(name);
} while (fd == -1 && errno == EEXIST);
close(fd);
diff --git a/camel/tests/folder/Makefile.am b/camel/tests/folder/Makefile.am
index a036db99e5..aa430fa409 100644
--- a/camel/tests/folder/Makefile.am
+++ b/camel/tests/folder/Makefile.am
@@ -14,10 +14,10 @@ LDADD = \
check_PROGRAMS = \
test1 \
- test2
-# test3
+ test2 \
+ test3
-#TESTS = test1
+TESTS = test1 test2 test3
diff --git a/camel/tests/folder/test1.c b/camel/tests/folder/test1.c
index 020c511a82..9ead130dfd 100644
--- a/camel/tests/folder/test1.c
+++ b/camel/tests/folder/test1.c
@@ -33,9 +33,12 @@ int main(int argc, char **argv)
int i;
char *path;
+ camel_test_init(argc, argv);
+
ex = camel_exception_new();
- camel_test_init(argc, argv);
+ /* clear out any camel-test data */
+ system("/bin/rm -rf /tmp/camel-test");
session = camel_session_new("/tmp/camel-test", auth_callback, NULL, NULL);
diff --git a/camel/tests/folder/test2.c b/camel/tests/folder/test2.c
index c7a1af2c33..06053f76c0 100644
--- a/camel/tests/folder/test2.c
+++ b/camel/tests/folder/test2.c
@@ -43,10 +43,13 @@ int main(int argc, char **argv)
GPtrArray *uids;
const CamelMessageInfo *info;
- ex = camel_exception_new();
-
camel_test_init(argc, argv);
+ /* clear out any camel-test data */
+ system("/bin/rm -rf /tmp/camel-test");
+
+ ex = camel_exception_new();
+
session = camel_session_new("/tmp/camel-test", auth_callback, NULL, NULL);
/* todo: cross-check everything with folder_info checks as well */
@@ -221,7 +224,7 @@ int main(int argc, char **argv)
camel_folder_free_uids(folder, uids);
pull();
- camel_object_unref((CamelObject *)folder);
+ check_unref(folder, 1);
pull(); /* re-opening folder */
push("deleting test folder, with no messages in it");
@@ -229,12 +232,12 @@ int main(int argc, char **argv)
check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
pull();
- camel_object_unref((CamelObject *)store);
+ check_unref(store, 1);
camel_test_end();
}
}
- camel_object_unref((CamelObject *)session);
+ check_unref(session, 1);
camel_exception_free(ex);
return 0;
diff --git a/camel/tests/folder/test3.c b/camel/tests/folder/test3.c
index ecd0a46fe7..e231c4911a 100644
--- a/camel/tests/folder/test3.c
+++ b/camel/tests/folder/test3.c
@@ -13,6 +13,9 @@
#include <camel/camel-folder-summary.h>
#include <camel/camel-mime-message.h>
+#define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0]))
+
+
/* god, who designed this horrid interface */
static char *auth_callback(CamelAuthCallbackMode mode,
char *data, gboolean secret,
@@ -33,12 +36,12 @@ test_folder_search_sub(CamelFolder *folder, const char *expr, int expected)
uids = camel_folder_search_by_expression(folder, expr, ex);
check(uids != NULL);
- check(uids->len == expected);
+ check_msg(uids->len == expected, "search %s expected %d got %d", expr, expected, uids->len);
check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
/* check the uid's are actually unique, too */
hash = g_hash_table_new(g_str_hash, g_str_equal);
- for (i=0;uids->len;i++) {
+ for (i=0;i<uids->len;i++) {
check(g_hash_table_lookup(hash, uids->pdata[i]) == NULL);
g_hash_table_insert(hash, uids->pdata[i], uids->pdata[i]);
}
@@ -54,9 +57,14 @@ test_folder_search(CamelFolder *folder, const char *expr, int expected)
{
char *matchall;
+#if 0
+ /* FIXME: ??? */
+ camel_test_nonfatal("most searches require match-all construct");
push("Testing search: %s", expr);
test_folder_search_sub(folder, expr, expected);
pull();
+ camel_test_fatal();
+#endif
matchall = g_strdup_printf("(match-all %s)", expr);
push("Testing search: %s", matchall);
@@ -65,7 +73,77 @@ test_folder_search(CamelFolder *folder, const char *expr, int expected)
pull();
}
-#define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0]))
+static struct {
+ int counts[3];
+ char *expr;
+} searches[] = {
+ { { 100, 50, 0 }, "(header-contains \"subject\" \"subject\")" },
+ { { 100, 50, 0 }, "(header-contains \"subject\" \"Subject\")" },
+
+ { { 100, 50, 0 }, "(body-contains \"content\")" },
+ { { 100, 50, 0 }, "(body-contains \"Content\")" },
+
+ { { 0, 0, 0 }, "(user-flag \"every7\")" },
+ { { 100/13+1, 50/13+1, 0 }, "(user-flag \"every13\")" },
+ { { 1, 1, 0 }, "(= \"7tag1\" (user-tag \"every7\"))" },
+ { { 100/11+1, 50/11+1, 0 }, "(= \"11tag\" (user-tag \"every11\"))" },
+
+ { { 100/13 + 100/17 + 1, 50/13 + 50/17 + 2, 0 }, "(user-flag \"every13\" \"every17\")" },
+ { { 100/13 + 100/17 + 1, 50/13 + 50/17 + 2, 0 }, "(or (user-flag \"every13\") (user-flag \"every17\"))" },
+ { { 1, 0, 0 }, "(and (user-flag \"every13\") (user-flag \"every17\"))" },
+
+ { { 0, 0, 0 }, "(and (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"Test2\"))" },
+ /* we get 11 here as the header-contains is a substring match */
+ { { 11, 6, 0 }, "(and (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"subject\"))" },
+ { { 1, 1, 0 }, "(and (header-contains \"subject\" \"Test19\") (header-contains \"subject\" \"subject\"))" },
+ { { 0, 0, 0 }, "(and (header-contains \"subject\" \"Test191\") (header-contains \"subject\" \"subject\"))" },
+ { { 1, 1, 0 }, "(and (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"message99\"))" },
+
+ { { 22, 11, 0 }, "(or (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"Test2\"))" },
+ { { 2, 1, 0 }, "(or (header-contains \"subject\" \"Test16\") (header-contains \"subject\" \"Test99\"))" },
+ { { 1, 1, 0 }, "(or (header-contains \"subject\" \"Test123\") (header-contains \"subject\" \"Test99\"))" },
+ { { 100, 50, 0 }, "(or (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"subject\"))" },
+ { { 11, 6, 0 }, "(or (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"message99\"))" },
+
+ /* 72000 is 24*60*100 == half the 'sent date' of the messages */
+ { { 100/2, 50/2, 0 }, "(> 72000 (get-sent-date))" },
+ { { 100/2-1, 50/2, 0 }, "(< 72000 (get-sent-date))" },
+ { { 1, 0, 0 }, "(= 72000 (get-sent-date))" },
+ { { 0, 0, 0 }, "(= 72001 (get-sent-date))" },
+
+ { { (100/2-1)/17+1, (50/2-1)/17+1, 0 }, "(and (user-flag \"every17\") (< 72000 (get-sent-date)))" },
+ { { (100/2-1)/17+1, (50/2-1)/17, 0 }, "(and (user-flag \"every17\") (> 72000 (get-sent-date)))" },
+ { { (100/2-1)/13+1, (50/2-1)/13+1, 0 }, "(and (user-flag \"every13\") (< 72000 (get-sent-date)))" },
+ { { (100/2-1)/13+1, (50/2-1)/13+1, 0 }, "(and (user-flag \"every13\") (> 72000 (get-sent-date)))" },
+
+ { { 100/2+100/2/17, 50/2+50/2/17, 0 }, "(or (user-flag \"every17\") (< 72000 (get-sent-date)))" },
+ { { 100/2+100/2/17+1, 50/2+50/2/17+1, 0 }, "(or (user-flag \"every17\") (> 72000 (get-sent-date)))" },
+ { { 100/2+100/2/13, 50/2+50/2/13+1, 0 }, "(or (user-flag \"every13\") (< 72000 (get-sent-date)))" },
+ { { 100/2+100/2/13+1, 50/2+50/2/13+1, 0 }, "(or (user-flag \"every13\") (> 72000 (get-sent-date)))" },
+};
+
+static void
+run_search(CamelFolder *folder, int m)
+{
+ int i, j = 0;
+
+ check(m == 50 || m == 100 || m == 0);
+
+ /* *shrug* messy, but it'll do */
+ if (m==50)
+ j = 1;
+ else if (m==0)
+ j = 2;
+
+ push("performing searches, expected %d", m);
+ for (i=0;i<ARRAY_LEN(searches);i++) {
+ push("running search %d: %s", i, searches[i].expr);
+ test_folder_search(folder, searches[i].expr, searches[i].counts[j]);
+ pull();
+ }
+ pull();
+}
+
static char *stores[] = {
"mbox:///tmp/camel-test/mbox",
@@ -84,9 +162,13 @@ int main(int argc, char **argv)
int indexed;
GPtrArray *uids;
+ gtk_init(&argc, &argv);
+ camel_test_init(argc, argv);
+
ex = camel_exception_new();
- camel_test_init(argc, argv);
+ /* clear out any camel-test data */
+ system("/bin/rm -rf /tmp/camel-test");
session = camel_session_new("/tmp/camel-test", auth_callback, NULL, NULL);
@@ -137,7 +219,6 @@ int main(int argc, char **argv)
camel_mime_message_set_subject(msg, subject);
camel_mime_message_set_date(msg, j*60*24, 0);
-
pull();
push("appending simple message %d", j);
@@ -175,99 +256,70 @@ int main(int argc, char **argv)
camel_folder_free_uids(folder, uids);
pull();
- /* should try invalid search strings too */
-
- /* try some searches */
- push("performing searches");
- test_folder_search(folder, "(header-contains \"subject\" \"subject\")", 100);
- test_folder_search(folder, "(header-contains \"subject\" \"Subject\")", 100);
-
- test_folder_search(folder, "(body-contains \"content\")", 100);
- test_folder_search(folder, "(body-contains \"Content\")", 100);
-
- test_folder_search(folder, "(user-flag \"every7\")", 0);
- test_folder_search(folder, "(user-flag \"every13\")", 100/13);
- test_folder_search(folder, "(= \"7tag1\" (user-tag \"every7\"))", 1);
- test_folder_search(folder, "(= \"11tag\" (user-tag \"every11\"))", 100/11);
-
- test_folder_search(folder, "(user-flag \"every13\" \"every17\")", 100/13 + 100/17);
- test_folder_search(folder, "(or (user-flag \"every13\") (user-flag \"every17\"))", 100/13 + 100/17);
- test_folder_search(folder, "(and (user-flag \"every13\") (user-flag \"every17\"))", 0);
-
- test_folder_search(folder, "(and (header-contains \"subject\" \"Test1\")"
- "(header-contains \"subject\" \"Test2\"))", 0);
- test_folder_search(folder, "(and (header-contains \"subject\" \"Test1\")"
- "(header-contains \"subject\" \"subject\"))", 1);
- test_folder_search(folder, "(and (header-contains \"subject\" \"Test1\")"
- "(header-contains \"subject\" \"message99\"))", 1);
-
- test_folder_search(folder, "(or (header-contains \"subject\" \"Test1\")"
- "(header-contains \"subject\" \"Test2\"))", 2);
- test_folder_search(folder, "(or (header-contains \"subject\" \"Test1\")"
- "(header-contains \"subject\" \"subject\"))", 100);
- test_folder_search(folder, "(or (header-contains \"subject\" \"Test1\")"
- "(header-contains \"subject\" \"message99\"))", 1);
-
- /* 7200 is 24*60*50 == half the 'sent date' of the messages */
- test_folder_search(folder, "(> 7200 (get-sent-date))", 49);
- test_folder_search(folder, "(< 7200 (get-sent-date))", 49);
- test_folder_search(folder, "(= 7200 (get-sent-date))", 1);
- test_folder_search(folder, "(= 7201 (get-sent-date))", 0);
-
- test_folder_search(folder, "(and (user-flag \"every17\") (< 7200 (get-sent-date)))", 49/17);
- test_folder_search(folder, "(and (user-flag \"every17\") (> 7200 (get-sent-date)))", 49/17-1);
- test_folder_search(folder, "(and (user-flag \"every13\") (< 7200 (get-sent-date)))", 49/13);
- test_folder_search(folder, "(and (user-flag \"every13\") (> 7200 (get-sent-date)))", 49/13-1);
-
- test_folder_search(folder, "(or (user-flag \"every17\") (< 7200 (get-sent-date)))", 49);
- test_folder_search(folder, "(or (user-flag \"every17\") (> 7200 (get-sent-date)))", 49);
- test_folder_search(folder, "(or (user-flag \"every13\") (< 7200 (get-sent-date)))", 49);
- test_folder_search(folder, "(or (user-flag \"every13\") (> 7200 (get-sent-date)))", 49);
-
- push("deleting every 2nd message & expunging");
+ push("Search before sync");
+ run_search(folder, 100);
+ pull();
+
+ push("syncing folder, searching");
+ camel_folder_sync(folder, FALSE, ex);
+ run_search(folder, 100);
+ pull();
+
+ push("syncing wiht expunge, search");
+ camel_folder_sync(folder, TRUE, ex);
+ run_search(folder, 100);
+ pull();
+
+ push("deleting every 2nd message");
uids = camel_folder_get_uids(folder);
check(uids->len == 100);
- for (j=0;j<uids->len;j++) {
+ for (j=0;j<uids->len;j+=2) {
camel_folder_delete_message(folder, uids->pdata[j]);
}
+ camel_folder_free_uids(folder, uids);
+ run_search(folder, 100);
- push("searches after deletions, before sync");
- test_folder_search(folder, "(header-contains \"subject\" \"subject\")", 100);
- test_folder_search(folder, "(body-contains \"content\")", 100);
- pull();
-
+ push("syncing");
camel_folder_sync(folder, FALSE, ex);
-
- push("searches after sync, before expunge");
- test_folder_search(folder, "(header-contains \"subject\" \"subject\")", 100);
- test_folder_search(folder, "(body-contains \"content\")", 100);
+ check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
+ run_search(folder, 100);
pull();
+ push("expunging");
camel_folder_expunge(folder, ex);
check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
- camel_folder_free_uids(folder, uids);
+ run_search(folder, 50);
pull();
- /* more searches */
- push("searches after deletions");
- test_folder_search(folder, "(header-contains \"subject\" \"subject\")", 50);
- test_folder_search(folder, "(body-contains \"content\")", 50);
pull();
- push("deleting remaining messages & expunging");
+ push("closing and re-opening folder");
+ check_unref(folder, 1);
+ folder = camel_store_get_folder(store, "testbox", flags&~(CAMEL_STORE_FOLDER_CREATE), ex);
+ check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
+ check(folder != NULL);
+
+ push("deleting remaining messages");
uids = camel_folder_get_uids(folder);
- check(uids->len == 100);
+ check(uids->len == 50);
for (j=0;j<uids->len;j++) {
camel_folder_delete_message(folder, uids->pdata[j]);
}
+ camel_folder_free_uids(folder, uids);
+ run_search(folder, 50);
+
+ push("syncing");
+ camel_folder_sync(folder, FALSE, ex);
+ check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
+ run_search(folder, 50);
+ pull();
+
+ push("expunging");
camel_folder_expunge(folder, ex);
check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
- camel_folder_free_uids(folder, uids);
+ run_search(folder, 0);
pull();
- push("searches wtih no messages");
- test_folder_search(folder, "(header-contains \"subject\" \"subject\")", 0);
- test_folder_search(folder, "(body-contains \"content\")", 0);
pull();
check_unref(folder, 1);
@@ -278,12 +330,12 @@ int main(int argc, char **argv)
check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
pull();
- camel_object_unref((CamelObject *)store);
+ check_unref(store, 1);
camel_test_end();
}
}
- camel_object_unref((CamelObject *)session);
+ check_unref(session, 1);
camel_exception_free(ex);
return 0;
diff --git a/camel/tests/lib/messages.c b/camel/tests/lib/messages.c
index e2e447d97c..ab5b7528ce 100644
--- a/camel/tests/lib/messages.c
+++ b/camel/tests/lib/messages.c
@@ -33,6 +33,12 @@ test_message_create_simple(void)
return msg;
}
+static void
+content_finalise(CamelObject *folder, void *crap, void *ba)
+{
+ g_byte_array_free(ba, TRUE);
+}
+
void
test_message_set_content_simple(CamelMimePart *part, int how, const char *type, const char *text, int len)
{
@@ -65,7 +71,7 @@ test_message_set_content_simple(CamelMimePart *part, int how, const char *type,
content = (CamelStreamMem *)camel_stream_mem_new();
camel_stream_mem_set_byte_array(content, ba);
- /* ba gets leaked here */
+ camel_object_hook_event((CamelObject *)content, "finalize", content_finalise, ba);
break;
}
@@ -137,9 +143,11 @@ test_message_compare_content(CamelDataWrapper *dw, const char *text, int len)
int
test_message_compare_header(CamelMimeMessage *m1, CamelMimeMessage *m2)
{
+ return 0;
}
int
test_message_compare_messages(CamelMimeMessage *m1, CamelMimeMessage *m2)
{
+ return 0;
}
diff --git a/camel/tests/message/test1.c b/camel/tests/message/test1.c
index 681537d269..3294000550 100644
--- a/camel/tests/message/test1.c
+++ b/camel/tests/message/test1.c
@@ -94,6 +94,15 @@ setup(void)
texts[13].len = 102400;
}
+static void cleanup(void)
+{
+ int i;
+
+ for (i=6;i<14;i++) {
+ g_free(texts[i].text);
+ }
+}
+
int main(int argc, char **argv)
{
CamelMimeMessage *msg, *msg2;
@@ -185,5 +194,7 @@ int main(int argc, char **argv)
}
camel_test_end();
+ cleanup();
+
return 0;
}
diff --git a/camel/tests/message/test2.c b/camel/tests/message/test2.c
index 00bd6aabf2..6baf7b92f4 100644
--- a/camel/tests/message/test2.c
+++ b/camel/tests/message/test2.c
@@ -229,6 +229,7 @@ int main(int argc, char **argv)
check(camel_internet_address_get(addr, 0, &real, &where) == TRUE);
check_msg(string_equal(name, real), "name = '%s' real = '%s'", name, real);
check(strcmp(where, "nobody@nowhere.com") == 0);
+ test_free(name);
check(camel_internet_address_get(addr, 1, &real, &where) == FALSE);
check(camel_address_length(CAMEL_ADDRESS(addr)) == 1);
@@ -248,6 +249,7 @@ int main(int argc, char **argv)
push("Compare addresses");
test_address_compare(addr, addr2);
pull();
+ check_unref(addr2, 1);
test_free(enc);
pull();