aboutsummaryrefslogtreecommitdiffstats
path: root/camel/tests
diff options
context:
space:
mode:
Diffstat (limited to 'camel/tests')
-rw-r--r--camel/tests/folder/Makefile.am6
-rw-r--r--camel/tests/folder/README2
-rw-r--r--camel/tests/folder/test8.c1
-rw-r--r--camel/tests/folder/test9.c176
-rw-r--r--camel/tests/lib/camel-test.c8
-rw-r--r--camel/tests/message/test3.c10
6 files changed, 195 insertions, 8 deletions
diff --git a/camel/tests/folder/Makefile.am b/camel/tests/folder/Makefile.am
index 4401d310f6..f6dd852dd8 100644
--- a/camel/tests/folder/Makefile.am
+++ b/camel/tests/folder/Makefile.am
@@ -16,12 +16,14 @@ check_PROGRAMS = \
test1 test4 test5 \
test2 test6 test7 \
test3 \
- test8
+ test8 \
+ test9
TESTS = test1 test4 test5 \
test2 test6 test7 \
test3 \
- test8
+ test8 \
+ test9
diff --git a/camel/tests/folder/README b/camel/tests/folder/README
index e02308d2d7..4fed421413 100644
--- a/camel/tests/folder/README
+++ b/camel/tests/folder/README
@@ -8,4 +8,4 @@ test6 basic folder operations, IMAP
test7 basic folder operations, NNTP
test8 multithreaded folder torture test, local
-
+test9 filtering
diff --git a/camel/tests/folder/test8.c b/camel/tests/folder/test8.c
index 30552cf782..5665f96f2a 100644
--- a/camel/tests/folder/test8.c
+++ b/camel/tests/folder/test8.c
@@ -107,6 +107,7 @@ worker(void *d)
content = g_strdup_printf("Test message %d contents\n\n", id+i);
test_message_compare_content(camel_medium_get_content_object((CamelMedium *)msg), content, strlen(content));
test_free(content);
+ pull();
push("deleting message, cleanup");
j=(100.0*rand()/(RAND_MAX+1.0));
diff --git a/camel/tests/folder/test9.c b/camel/tests/folder/test9.c
new file mode 100644
index 0000000000..68c761c40d
--- /dev/null
+++ b/camel/tests/folder/test9.c
@@ -0,0 +1,176 @@
+/* folder/index testing */
+
+#include "camel-test.h"
+#include "messages.h"
+#include "folders.h"
+
+#include "camel/camel-exception.h"
+#include "camel/camel-service.h"
+#include "camel/camel-session.h"
+#include "camel/camel-store.h"
+
+#include "camel/camel-folder.h"
+#include "camel/camel-folder-summary.h"
+#include "camel/camel-mime-message.h"
+#include "camel/camel-filter-driver.h"
+#include "camel/camel-stream-fs.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,
+ CamelService *service, char *item,
+ CamelException *ex)
+{
+ return NULL;
+}
+
+struct {
+ char *name;
+ CamelFolder *folder;
+} mailboxes[] = {
+ { "INBOX", NULL },
+ { "folder1", NULL },
+ { "folder2", NULL },
+ { "folder3", NULL },
+ { "folder4", NULL },
+};
+
+struct {
+ char *name, *match, *action;
+} rules[] = {
+ { "empty1", "(match-all (header-contains \"Frobnitz\"))", "(copy-to \"folder1\")" },
+ { "empty2", "(header-contains \"Frobnitz\")", "(copy-to \"folder2\")" },
+ { "count11", "(and (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"subject\"))", "(move-to \"folder3\")" },
+ { "empty3", "(and (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"subject\"))", "(move-to \"folder4\")" },
+ { "count1", "(body-contains \"data50\")", "(copy-to \"folder1\")" },
+ { "stop", "(body-contains \"data2\")", "(stop)" },
+ { "notreached1", "(body-contains \"data2\")", "(move-to \"folder2\")" },
+ { "count1", "(body-contains \"data3\")", "(move-to \"folder2\")" },
+};
+
+
+static CamelFolder *get_folder(CamelFilterDriver *d, const char *uri, void *data)
+{
+ int i;
+
+ for (i=0;i<ARRAY_LEN(mailboxes);i++)
+ if (!strcmp(mailboxes[i].name, uri)) {
+ camel_object_ref((CamelObject *)mailboxes[i].folder);
+ return mailboxes[i].folder;
+ }
+ return NULL;
+}
+
+int main(int argc, char **argv)
+{
+ CamelSession *session;
+ CamelStore *store;
+ CamelException *ex;
+ CamelFolder *folder;
+ CamelMimeMessage *msg;
+ int i, j;
+ CamelStream *mbox;
+ CamelFilterDriver *driver;
+
+ gtk_init(&argc, &argv);
+
+ camel_test_init(argc, argv);
+
+ ex = camel_exception_new();
+
+ /* clear out any camel-test data */
+ system("/bin/rm -rf /tmp/camel-test");
+
+ camel_test_start("Simple filtering of mbox");
+
+ session = camel_session_new("/tmp/camel-test", auth_callback, NULL, NULL);
+
+ /* todo: cross-check everything with folder_info checks as well */
+ /* todo: work out how to do imap/pop/nntp tests */
+
+ push("getting store");
+ store = camel_session_get_store(session, "mbox:///tmp/camel-test/mbox", ex);
+ check_msg(!camel_exception_is_set(ex), "getting store: %s", camel_exception_get_description(ex));
+ check(store != NULL);
+ pull();
+
+ push("Creating output folders");
+ for (i=0;i<ARRAY_LEN(mailboxes);i++) {
+ push("creating %s", mailboxes[i].name);
+ mailboxes[i].folder = folder = camel_store_get_folder(store, mailboxes[i].name, CAMEL_STORE_FOLDER_CREATE, ex);
+ check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
+ check(folder != NULL);
+
+ /* we need an empty folder for this to work */
+ test_folder_counts(folder, 0, 0);
+ pull();
+ }
+ pull();
+
+ /* append a bunch of messages with specific content */
+ push("creating 100 test message mbox");
+ mbox = camel_stream_fs_new_with_name("/tmp/camel-test/inbox", O_WRONLY|O_CREAT|O_EXCL, 0600);
+ for (j=0;j<100;j++) {
+ char *content, *subject;
+
+ push("creating test message");
+ msg = test_message_create_simple();
+ content = g_strdup_printf("data%d content\n", j);
+ test_message_set_content_simple((CamelMimePart *)msg, 0, "text/plain",
+ content, strlen(content));
+ test_free(content);
+ subject = g_strdup_printf("Test%d message%d subject", j, 100-j);
+ camel_mime_message_set_subject(msg, subject);
+
+ camel_mime_message_set_date(msg, j*60*24, 0);
+ pull();
+
+ camel_stream_printf(mbox, "From \n");
+ check(camel_data_wrapper_write_to_stream((CamelDataWrapper *)msg, mbox) != -1);
+#if 0
+ push("appending simple message %d", j);
+ camel_folder_append_message(folder, msg, NULL, ex);
+ check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
+ pull();
+#endif
+ test_free(subject);
+
+ check_unref(msg, 1);
+ }
+ check(camel_stream_close(mbox) != -1);
+ check_unref(mbox, 1);
+ pull();
+
+ push("Building filters");
+ driver = camel_filter_driver_new(get_folder, NULL);
+ for (i=0;i<ARRAY_LEN(rules);i++) {
+ camel_filter_driver_add_rule(driver, rules[i].name, rules[i].match, rules[i].action);
+ }
+ pull();
+
+ push("Executing filters");
+ camel_filter_driver_set_default_folder(driver, mailboxes[0].folder);
+ camel_filter_driver_filter_mbox(driver, "/tmp/camel-test/inbox", "", ex);
+ check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
+
+ /* now need to check the folder counts/etc */
+
+ check_unref(driver, 1);
+ pull();
+
+ for (i=0;i<ARRAY_LEN(mailboxes);i++) {
+ check_unref(mailboxes[i].folder, 1);
+ }
+
+ check_unref(store, 1);
+
+ check_unref(session, 1);
+ camel_exception_free(ex);
+
+ camel_test_end();
+
+ return 0;
+}
diff --git a/camel/tests/lib/camel-test.c b/camel/tests/lib/camel-test.c
index e6a7c29340..a61f949f0a 100644
--- a/camel/tests/lib/camel-test.c
+++ b/camel/tests/lib/camel-test.c
@@ -7,6 +7,7 @@
#ifdef ENABLE_THREADS
#include <pthread.h>
+#include <unistd.h>
#endif
#ifdef ENABLE_THREADS
@@ -74,6 +75,13 @@ static void die(int sig)
indie = 1;
printf("\n\nReceived fatal signal %d\n", sig);
g_hash_table_foreach(info_table, (GHFunc)dump_action, 0);
+
+#ifdef ENABLE_THREADS
+ if (camel_test_verbose > 2) {
+ printf("Attach debugger to pid %d to debug\n", getpid());
+ sleep(1000);
+ }
+#endif
}
_exit(1);
diff --git a/camel/tests/message/test3.c b/camel/tests/message/test3.c
index 78ac7b3042..0a9683d146 100644
--- a/camel/tests/message/test3.c
+++ b/camel/tests/message/test3.c
@@ -30,8 +30,8 @@ int main(int argc, char **argv)
mp = camel_multipart_new();
/* Hrm, this should be able to set its own boundary, no? */
- camel_multipart_set_boundary(mp, "_=,.XYZ Kangaroo Meat is ! ABADF00D");
- check(strcmp(camel_multipart_get_boundary(mp), "_=,.XYZ Kangaroo Meat is ! ABADF00D") == 0);
+ camel_multipart_set_boundary(mp, "_=,.XYZ_Kangaroo_Meat_is_!_ABADF00D");
+ check(strcmp(camel_multipart_get_boundary(mp), "_=,.XYZ_Kangaroo_Meat_is_!_ABADF00D") == 0);
camel_medium_set_content_object((CamelMedium *)msg, (CamelDataWrapper *)mp);
check(camel_multipart_get_number(mp) == 0);
@@ -110,7 +110,7 @@ int main(int argc, char **argv)
check(CAMEL_IS_MULTIPART(mp2));
check(camel_multipart_get_number(mp2) == 3);
- check(strcmp(camel_multipart_get_boundary(mp2), "_=,.XYZ Kangaroo Meat is ! ABADF00D") == 0);
+ check(strcmp(camel_multipart_get_boundary(mp2), "_=,.XYZ_Kangaroo_Meat_is_!_ABADF00D") == 0);
check(mp2->preface == NULL || strlen(mp2->preface) == 0);
/* FIXME */
@@ -137,7 +137,7 @@ int main(int argc, char **argv)
check(CAMEL_IS_MULTIPART(mp2));
check(camel_multipart_get_number(mp2) == 3);
- check(strcmp(camel_multipart_get_boundary(mp2), "_=,.XYZ Kangaroo Meat is ! ABADF00D") == 0);
+ check(strcmp(camel_multipart_get_boundary(mp2), "_=,.XYZ_Kangaroo_Meat_is_!_ABADF00D") == 0);
check(mp2->preface == NULL || strlen(mp2->preface) == 0);
/* FIXME */
@@ -174,7 +174,7 @@ int main(int argc, char **argv)
check(CAMEL_IS_MULTIPART(mp2));
check(camel_multipart_get_number(mp2) == 3);
- check(strcmp(camel_multipart_get_boundary(mp2), "_=,.XYZ Kangaroo Meat is ! ABADF00D") == 0);
+ check(strcmp(camel_multipart_get_boundary(mp2), "_=,.XYZ_Kangaroo_Meat_is_!_ABADF00D") == 0);
check(strcmp(mp2->preface, "pre-text\nLines.") == 0);
check(strcmp(mp2->postface, "post-text, no lines.\nOne line.\n") == 0);
test_message_compare_content(camel_medium_get_content_object(CAMEL_MEDIUM(camel_multipart_get_part(mp2, 0))),