diff options
Diffstat (limited to 'camel/tests/folder')
-rw-r--r-- | camel/tests/folder/Makefile.am | 6 | ||||
-rw-r--r-- | camel/tests/folder/README | 1 | ||||
-rw-r--r-- | camel/tests/folder/test10.c | 115 |
3 files changed, 120 insertions, 2 deletions
diff --git a/camel/tests/folder/Makefile.am b/camel/tests/folder/Makefile.am index c178d5fdb0..e49fd92a87 100644 --- a/camel/tests/folder/Makefile.am +++ b/camel/tests/folder/Makefile.am @@ -19,8 +19,10 @@ LDADD = \ check_PROGRAMS = \ test1 test2 test3 \ test4 test5 test6 \ - test7 test8 test9 + test7 test8 test9 \ + test10 TESTS = test1 test2 test3 \ test4 test5 test6 \ - test7 test8 test9 + test7 test8 test9 \ + test10 diff --git a/camel/tests/folder/README b/camel/tests/folder/README index 4fed421413..3ab64ecd1c 100644 --- a/camel/tests/folder/README +++ b/camel/tests/folder/README @@ -9,3 +9,4 @@ test7 basic folder operations, NNTP test8 multithreaded folder torture test, local test9 filtering +test10 multithreaded folder/store object bag torture test diff --git a/camel/tests/folder/test10.c b/camel/tests/folder/test10.c new file mode 100644 index 0000000000..6ae9d9856d --- /dev/null +++ b/camel/tests/folder/test10.c @@ -0,0 +1,115 @@ +/* threaded folder testing */ + +#include <string.h> + +#include "camel-test.h" +#include "folders.h" +#include "messages.h" +#include "session.h" + +#include <camel/camel-exception.h> +#include <camel/camel-service.h> +#include <camel/camel-store.h> + +#define MAX_LOOP (10000) +#define MAX_THREADS (5) + +#define d(x) + +#ifndef ENABLE_THREADS +int main(int argc, char **argv) +{ + printf("Test %s is only compiled with threads enabled\n", argv[0]); + return 77; +} +#else + +#include <pthread.h> + + +#define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0])) + +static char *local_providers[] = { + "mbox", + "mh", + "maildir" +}; + +static char *path; +static CamelSession *session; +static int testid; + +static void * +worker(void *d) +{ + int i; + CamelException *ex = camel_exception_new(); + CamelStore *store; + CamelFolder *folder; + + for (i=0;i<MAX_LOOP;i++) { + store = camel_session_get_store(session, path, ex); + camel_exception_clear(ex); + folder = camel_store_get_folder(store, "testbox", CAMEL_STORE_FOLDER_CREATE, ex); + camel_exception_clear(ex); + if (testid == 0) { + camel_object_unref(folder); + camel_object_unref(store); + } else { + camel_object_unref(store); + camel_object_unref(folder); + } + } + + camel_exception_free(ex); + + return NULL; +} + +int main(int argc, char **argv) +{ + CamelException *ex; + int i, j; + pthread_t threads[MAX_THREADS]; + + camel_test_init(argc, argv); + + ex = camel_exception_new(); + + /* clear out any camel-test data */ + system("/bin/rm -rf /tmp/camel-test"); + + session = camel_test_session_new ("/tmp/camel-test"); + + for (testid=0;testid<2;testid++) { + if (testid == 0) + camel_test_start("store and folder bag torture test, stacked references"); + else + camel_test_start("store and folder bag torture test, unstacked references"); + + for (j=0;j<ARRAY_LEN(local_providers);j++) { + + camel_test_push("provider %s", local_providers[j]); + path = g_strdup_printf("%s:///tmp/camel-test/%s", local_providers[j], local_providers[j]); + + for (i=0;i<MAX_THREADS;i++) + pthread_create(&threads[i], 0, worker, NULL); + + for (i=0;i<MAX_THREADS;i++) + pthread_join(threads[i], NULL); + + test_free(path); + + camel_test_pull(); + } + + camel_test_end(); + } + + camel_object_unref((CamelObject *)session); + camel_exception_free(ex); + + return 0; +} + +#endif /* ENABLE_THREADS */ |