/* 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])) #define CAMEL_TEST_SESSION_TYPE (camel_test_session_get_type ()) #define CAMEL_TEST_SESSION(obj) (CAMEL_CHECK_CAST((obj), CAMEL_TEST_SESSION_TYPE, CamelTestSession)) #define CAMEL_TEST_SESSION_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_TEST_SESSION_TYPE, CamelTestSessionClass)) #define CAMEL_TEST_IS_SESSION(o) (CAMEL_CHECK_TYPE((o), CAMEL_TEST_SESSION_TYPE)) typedef struct _CamelTestSession { CamelSession parent_object; } CamelTestSession; typedef struct _CamelTestSessionClass { CamelSessionClass parent_class; } CamelTestSessionClass; static void init (CamelTestSession *session) { ; } static void class_init (CamelTestSessionClass *camel_test_session_class) { CamelSessionClass *camel_session_class = CAMEL_SESSION_CLASS (camel_test_session_class); /* virtual method override */ } static CamelType camel_test_session_get_type (void) { static CamelType type = CAMEL_INVALID_TYPE; if (type == CAMEL_INVALID_TYPE) { type = camel_type_register ( camel_test_session_get_type (), "CamelTestSession", sizeof (CamelTestSession), sizeof (CamelTestSessionClass), (CamelObjectClassInitFunc) class_init, NULL, (CamelObjectInitFunc) init, NULL); } return type; } static CamelSession * camel_test_session_new (const char *path) { CamelSession *session; session = CAMEL_SESSION (camel_object_new (CAMEL_TEST_SESSION_TYPE)); camel_session_construct (session, path); return session; } 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\")" }, { "ustrcasecmp", "(header-matches \"Subject\" \"Test0 message100 subject\")", "(copy-to \"folder2\")" }, }; /* broken match rules */ struct { char *name, *match, *action; } brokens[] = { { "count1", "(body-contains data50)", "(copy-to \"folder1\")" }, /* non string argument */ { "count1", "(body-contains-stuff \"data3\")", "(move-to-folder \"folder2\")" }, /* invalid function */ { "count1", "(or (body-contains \"data3\") (foo))", "(move-to-folder \"folder2\")" }, /* invalid function */ { "count1", "(or (body-contains \"data3\") (foo)", "(move-to-folder \"folder2\")" }, /* missing ) */ { "count1", "(and body-contains \"data3\") (foo)", "(move-to-folder \"folder2\")" }, /* missing ( */ { "count1", "body-contains \"data3\")", "(move-to-folder \"folder2\")" }, /* missing ( */ { "count1", "body-contains \"data3\"", "(move-to-folder \"folder2\")" }, /* missing ( ) */ { "count1", "(body-contains \"data3\" ())", "(move-to-folder \"folder2\")" }, /* extra () */ { "count1", "()", "(move-to-folder \"folder2\")" }, /* invalid () */ { "count1", "", "(move-to-folder \"folder2\")" }, /* empty */ }; /* broken action rules */ struct { char *name, *match, *action; } brokena[] = { { "a", "(body-contains \"data2\")", "(body-contains \"help\")" }, /* rule in action */ { "a", "(body-contains \"data2\")", "(move-to-folder-name \"folder2\")" }, /* unknown function */ { "a", "(body-contains \"data2\")", "(or (move-to-folder \"folder2\")" }, /* missing ) */ { "a", "(body-contains \"data2\")", "(or move-to-folder \"folder2\"))" }, /* missing ( */ { "a", "(body-contains \"data2\")", "move-to-folder \"folder2\")" }, /* missing ( */ { "a", "(body-contains \"data2\")", "(move-to-folder \"folder2\" ())" }, /* invalid () */ { "a", "(body-contains \"data2\")", "()" }, /* invalid () */ { "a", "(body-contains \"data2\")", "" }, /* empty */ }; static CamelFolder *get_folder(CamelFilterDriver *d, const char *uri, void *data, CamelException *ex) { int i; for (i=0;i