libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit a29d4ffcea6175a61d3715627e48ca9eacd591e4
parent 0b93aa656060d9c368959ac825c5879d422953b7
Author: Heikki Lindholm <holin@iki.fi>
Date:   Mon, 23 Jun 2008 05:49:49 +0000

more fine-grained multithread tests


Diffstat:
Msrc/test/Makefile.am | 27+++++++++++++++++++++++----
Asrc/test/mt_extracttest1.c | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/test/mt_extracttest2.c | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/test/mt_plugintest1.c | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/test/mt_plugintest2.c | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/test/multithreadtest.c | 189-------------------------------------------------------------------------------
6 files changed, 552 insertions(+), 193 deletions(-)

diff --git a/src/test/Makefile.am b/src/test/Makefile.am @@ -14,7 +14,10 @@ check_PROGRAMS = \ keywordlisttest \ plugintest \ multiload \ - multithreadtest + mt_plugintest1 \ + mt_plugintest2 \ + mt_extracttest1 \ + mt_extracttest2 TESTS = $(check_PROGRAMS) @@ -30,8 +33,24 @@ keywordlisttest_SOURCES = \ multiload_SOURCES = \ multiload.c -multithreadtest_SOURCES = \ - multithreadtest.c -multithreadtest_LDFLAGS = \ +mt_plugintest1_SOURCES = \ + mt_plugintest1.c +mt_plugintest1_LDFLAGS = \ -lpthread +mt_plugintest2_SOURCES = \ + mt_plugintest2.c +mt_plugintest2_LDFLAGS = \ + -lpthread + +mt_extracttest1_SOURCES = \ + mt_extracttest1.c +mt_extracttest1_LDFLAGS = \ + -lpthread + +mt_extracttest2_SOURCES = \ + mt_extracttest2.c +mt_extracttest2_LDFLAGS = \ + -lpthread + + diff --git a/src/test/mt_extracttest1.c b/src/test/mt_extracttest1.c @@ -0,0 +1,160 @@ +/** + * @file test/mt_extracttest1.c + * @brief test keyword extraction from multiple threads simultaneously + * @author Heikki Lindholm + */ +#include "platform.h" +#include "extractor.h" +#include <pthread.h> + +struct TaskData +{ + int id; + const char *filename; +}; + +static volatile int done = 0; +static volatile int failed = 0; + +pthread_mutex_t reference_lock = PTHREAD_MUTEX_INITIALIZER; +static EXTRACTOR_KeywordList *reference_list; + +static int +compare_keywords_to_ref (EXTRACTOR_KeywordList * list) +{ + EXTRACTOR_KeywordList *ptr1, *ptr2; + unsigned int cnt; + int *match; + int i; + + cnt = EXTRACTOR_countKeywords (list); + + pthread_mutex_lock (&reference_lock); + + if (cnt != EXTRACTOR_countKeywords (reference_list)) + { + pthread_mutex_unlock (&reference_lock); + return -1; + } + + match = alloca (cnt * sizeof (int)); + memset (match, 0x00, cnt * sizeof (int)); + ptr1 = list; + while (ptr1 != NULL) + { + int found; + found = 0; + ptr2 = reference_list; + i = 0; + while (ptr2 != NULL) + { + if (ptr2->keywordType == ptr1->keywordType && + strcmp (ptr2->keyword, ptr1->keyword) == 0 && match[i] == 0) + { + found = 1; + match[i] = 1; + break; + } + i++; + ptr2 = ptr2->next; + } + if (found == 0) + break; + ptr1 = ptr1->next; + } + + pthread_mutex_unlock (&reference_lock); + for (i = 0; i < cnt; i++) + if (match[i] == 0) + return -1; + + return 0; +} + +static EXTRACTOR_KeywordList * +get_keywords_for_file (const char *filename) +{ + EXTRACTOR_ExtractorList *el; + EXTRACTOR_KeywordList *list; + + el = EXTRACTOR_loadDefaultLibraries (); + if (el == NULL) + { + printf ("ERROR: failed to load plugins!\n"); + return NULL; + } + errno = 0; + list = EXTRACTOR_getKeywords (el, filename); + if (errno != 0) { + printf("ERROR: EXTRACTOR_getKeywords: %s\n", strerror(errno)); + } + /*EXTRACTOR_printKeywords (stderr, list); */ + EXTRACTOR_removeAll (el); + + return list; +} + +static void * +test_plugins (void *arg) +{ + struct TaskData *td = (struct TaskData *)arg; + while (!done) + { + EXTRACTOR_KeywordList *list; + + list = get_keywords_for_file (td->filename); + + if ((list == NULL) || (compare_keywords_to_ref (list) != 0)) + { + printf ("ERROR: thread id %d failed keyword comparison!\n", td->id); + failed = 1; + } + if (list != NULL) + EXTRACTOR_freeKeywords (list); + } + return 0; +} + +static const char *filename = TESTDATADIR "/text2.sxw"; + +#define TEST_SECS 10 + +int +main (int argc, char *argv[]) +{ + int num_tasks = 10; + pthread_t task_list[num_tasks]; + struct TaskData td[num_tasks]; + int ret = 0; + int i; + + printf("testing with '%s' for %d seconds\n", filename, TEST_SECS); + reference_list = get_keywords_for_file (filename); + + for (i = 0; i < num_tasks; i++) + { + td[i].id = i; + td[i].filename = filename; + ret = pthread_create (&task_list[i], NULL, test_plugins, &td[i]); + if (ret != 0) + { + printf ("ERROR: pthread_create failed for thread %d\n", i); + num_tasks = i; + done = 1; + break; + } + } + if (!done) + sleep (TEST_SECS); + done = 1; + for (i = 0; i < num_tasks; i++) + { + if (pthread_join (task_list[i], NULL) != 0) + printf ("WARNING: pthread_join failed for thread %d\n", i); + } + + if (reference_list != NULL) + EXTRACTOR_freeKeywords (reference_list); + + return failed; +} diff --git a/src/test/mt_extracttest2.c b/src/test/mt_extracttest2.c @@ -0,0 +1,190 @@ +/** + * @file test/mt_extracttest2.c + * @brief test keyword extraction from multiple threads simultaneously + * with multiple files and use thumbnail extractors as well + * @author Heikki Lindholm + */ +#include "platform.h" +#include "extractor.h" +#include <pthread.h> + +struct FileData +{ + const char *filename; + int use_thumbnailer; +}; + +struct TaskData +{ + int id; + const struct FileData *file; +}; + +static volatile int done = 0; +static volatile int failed = 0; + +pthread_mutex_t reference_lock = PTHREAD_MUTEX_INITIALIZER; +static EXTRACTOR_KeywordList *reference_list; + +static int +compare_keywords_to_ref (EXTRACTOR_KeywordList * list) +{ + EXTRACTOR_KeywordList *ptr1, *ptr2; + unsigned int cnt; + int *match; + int i; + + cnt = EXTRACTOR_countKeywords (list); + + pthread_mutex_lock (&reference_lock); + + if (cnt != EXTRACTOR_countKeywords (reference_list)) + { + pthread_mutex_unlock (&reference_lock); + return -1; + } + + match = alloca (cnt * sizeof (int)); + memset (match, 0x00, cnt * sizeof (int)); + ptr1 = list; + while (ptr1 != NULL) + { + int found; + found = 0; + ptr2 = reference_list; + i = 0; + while (ptr2 != NULL) + { + if (ptr2->keywordType == ptr1->keywordType && + strcmp (ptr2->keyword, ptr1->keyword) == 0 && match[i] == 0) + { + found = 1; + match[i] = 1; + break; + } + i++; + ptr2 = ptr2->next; + } + if (found == 0) + break; + ptr1 = ptr1->next; + } + + pthread_mutex_unlock (&reference_lock); + for (i = 0; i < cnt; i++) + if (match[i] == 0) + return -1; + + return 0; +} + +static EXTRACTOR_KeywordList * +get_keywords_for_file (const struct FileData *file) +{ + EXTRACTOR_ExtractorList *el; + EXTRACTOR_KeywordList *list; + + if (file->use_thumbnailer) + { + el = EXTRACTOR_addLibrary (NULL, "libextractor_mime"); + el = EXTRACTOR_loadConfigLibraries (el, "-libextractor_thumbnail"); + } + else + { + el = EXTRACTOR_loadDefaultLibraries (); + } + if (el == NULL) + { + printf ("ERROR: failed to load plugins!\n"); + return NULL; + } + errno = 0; + list = EXTRACTOR_getKeywords (el, file->filename); + if (errno != 0) { + printf("ERROR: EXTRACTOR_getKeywords: %s\n", strerror(errno)); + } + /*EXTRACTOR_printKeywords (stderr, list); */ + EXTRACTOR_removeAll (el); + + return list; +} + +static void * +test_plugins (void *arg) +{ + struct TaskData *td = (struct TaskData *)arg; + while (!done) + { + EXTRACTOR_KeywordList *list; + + list = get_keywords_for_file (td->file); + + if ((list == NULL) || (compare_keywords_to_ref (list) != 0)) + { + printf ("ERROR: thread id %d failed keyword comparison!\n", td->id); + failed = 1; + } + if (list != NULL) + EXTRACTOR_freeKeywords (list); + } + return 0; +} + +static const struct FileData files[] = { + { TESTDATADIR "/test.bmp", 0 }, + { TESTDATADIR "/test.jpg", 0 }, + { TESTDATADIR "/test.png", 0 }, + { TESTDATADIR "/test.sxw", 0 }, + { TESTDATADIR "/test.bmp", 1 }, + { TESTDATADIR "/test.png", 1 }, + { NULL, 0 } +}; + +#define TEST_SECS 10 + +int +main (int argc, char *argv[]) +{ + int num_tasks = 10; + pthread_t task_list[num_tasks]; + struct TaskData td[num_tasks]; + int ret = 0; + int i; + int n; + + n = 0; + while ((files[n].filename != NULL) && (!failed)) { + printf("testing with '%s' for %d seconds\n", files[n].filename, TEST_SECS); + reference_list = get_keywords_for_file (&files[n]); + + for (i = 0; i < num_tasks; i++) + { + td[i].id = i; + td[i].file = &files[n]; + ret = pthread_create (&task_list[i], NULL, test_plugins, &td[i]); + if (ret != 0) + { + printf ("ERROR: pthread_create failed for thread %d\n", i); + num_tasks = i; + done = 1; + break; + } + } + if (!done) + sleep (TEST_SECS); + done = 1; + for (i = 0; i < num_tasks; i++) + { + if (pthread_join (task_list[i], NULL) != 0) + printf ("WARNING: pthread_join failed for thread %d\n", i); + } + + done = 0; + if (reference_list != NULL) + EXTRACTOR_freeKeywords (reference_list); + + n++; + } + + return failed; +} diff --git a/src/test/mt_plugintest1.c b/src/test/mt_plugintest1.c @@ -0,0 +1,101 @@ +/** + * @file test/mt-plugintest1.c + * @brief test extractor plugin load/unload from multiple threads + * simultaneously + * @author Heikki Lindholm + */ +#include "platform.h" +#include "extractor.h" +#include <pthread.h> + +struct TaskData +{ + int id; +}; + +static volatile int done = 0; +static volatile int failed = 0; + +static void * +test_plugins (void *arg) +{ + struct TaskData *td = (struct TaskData *) arg; + EXTRACTOR_ExtractorList *el; + int i; + + while (!done) + { + /* do some loading and unloading */ + for (i = 0; i < 10; i++) + { + el = EXTRACTOR_loadDefaultLibraries (); + EXTRACTOR_removeAll (el); + } + + /* do some load/unload tests */ + el = EXTRACTOR_addLibrary (NULL, "libextractor_split"); + el = EXTRACTOR_addLibrary (el, "libextractor_mime"); + el = EXTRACTOR_addLibrary (el, "libextractor_filename"); + el = EXTRACTOR_removeLibrary (el, "libextractor_mime"); + el = EXTRACTOR_removeLibrary (el, "libextractor_split"); + el = EXTRACTOR_removeLibrary (el, "libextractor_filename"); + if (el != NULL) + { + printf ("add-remove test (1) failed in thread %d!\n", td->id); + failed = 1; + } + + el = EXTRACTOR_addLibrary (NULL, "libextractor_split"); + el = EXTRACTOR_addLibrary (el, "libextractor_mime"); + el = EXTRACTOR_addLibrary (el, "libextractor_filename"); + el = EXTRACTOR_removeLibrary (el, "libextractor_mime"); + el = EXTRACTOR_removeLibrary (el, "libextractor_filename"); + el = EXTRACTOR_removeLibrary (el, "libextractor_split"); + if (el != NULL) + { + printf ("add-remove test (2) failed in thread %d!\n", td->id); + failed = 1; + } + + el = EXTRACTOR_loadConfigLibraries (NULL, "libextractor_filename"); + el = EXTRACTOR_loadConfigLibraries (el, "-libextractor_split"); + EXTRACTOR_removeAll (el); + } + return 0; +} + +#define TEST_SECS 10 + +int +main (int argc, char *argv[]) +{ + int num_tasks = 10; + pthread_t task_list[num_tasks]; + struct TaskData td[num_tasks]; + int ret = 0; + int i; + + printf("testing for %d seconds\n", TEST_SECS); + for (i = 0; i < num_tasks; i++) + { + td[i].id = i; + ret = pthread_create (&task_list[i], NULL, test_plugins, &td[i]); + if (ret != 0) + { + printf ("ERROR: pthread_create failed for thread %d\n", i); + num_tasks = i; + done = 1; + break; + } + } + if (!done) + sleep (TEST_SECS); + done = 1; + for (i = 0; i < num_tasks; i++) + { + if (pthread_join (task_list[i], NULL) != 0) + printf ("WARNING: pthread_join failed for thread %d\n", i); + } + + return failed; +} diff --git a/src/test/mt_plugintest2.c b/src/test/mt_plugintest2.c @@ -0,0 +1,78 @@ +/** + * @file test/mt-plugintest1.c + * @brief test extractor plugin load/unload from multiple threads + * simultaneously - thumbnailer plugins test + * @author Heikki Lindholm + */ +#include "platform.h" +#include "extractor.h" +#include <pthread.h> + +struct TaskData +{ + int id; +}; + +static volatile int done = 0; +static volatile int failed = 0; + +static void * +test_plugins (void *arg) +{ + struct TaskData *td = (struct TaskData *) arg; + EXTRACTOR_ExtractorList *el; + int i; + + while (!done) + { + /* do some load/unload tests */ + el = EXTRACTOR_addLibrary (NULL, "libextractor_thumbnailgtk"); + el = EXTRACTOR_addLibrary (el, "libextractor_thumbnailqt"); + el = EXTRACTOR_addLibrary (el, "libextractor_thumbnailffmpeg"); + el = EXTRACTOR_removeLibrary (el, "libextractor_thumbnailffmpeg"); + el = EXTRACTOR_removeLibrary (el, "libextractor_thumbnailqt"); + el = EXTRACTOR_removeLibrary (el, "libextractor_thumbnailgtk"); + if (el != NULL) + { + printf ("add-remove test failed in thread %d!\n", td->id); + failed = 1; + } + } + return 0; +} + +#define TEST_SECS 10 + +int +main (int argc, char *argv[]) +{ + int num_tasks = 10; + pthread_t task_list[num_tasks]; + struct TaskData td[num_tasks]; + int ret = 0; + int i; + + printf("testing for %d seconds\n", TEST_SECS); + for (i = 0; i < num_tasks; i++) + { + td[i].id = i; + ret = pthread_create (&task_list[i], NULL, test_plugins, &td[i]); + if (ret != 0) + { + printf ("ERROR: pthread_create failed for thread %d\n", i); + num_tasks = i; + done = 1; + break; + } + } + if (!done) + sleep (TEST_SECS); + done = 1; + for (i = 0; i < num_tasks; i++) + { + if (pthread_join (task_list[i], NULL) != 0) + printf ("WARNING: pthread_join failed for thread %d\n", i); + } + + return failed; +} diff --git a/src/test/multithreadtest.c b/src/test/multithreadtest.c @@ -1,189 +0,0 @@ -/** - * @file test/multithreadtest.c - * @brief test extractor plugins from multiple threads simultaneously - * @author Heikki Lindholm - */ -#include "platform.h" -#include "extractor.h" -#include <pthread.h> - -struct FileData -{ - const char *filename; - int use_thumbnailer; -}; - -struct TaskData -{ - int id; - const struct FileData *file; -}; - -static volatile int done = 0; -static volatile int failed = 0; - -pthread_mutex_t reference_lock = PTHREAD_MUTEX_INITIALIZER; -static EXTRACTOR_KeywordList *reference_list; - -static int -compare_keywords_to_ref (EXTRACTOR_KeywordList * list) -{ - EXTRACTOR_KeywordList *ptr1, *ptr2; - unsigned int cnt; - int *match; - int i; - - cnt = EXTRACTOR_countKeywords (list); - - pthread_mutex_lock (&reference_lock); - - if (cnt != EXTRACTOR_countKeywords (reference_list)) - { - pthread_mutex_unlock (&reference_lock); - return -1; - } - - match = alloca (cnt * sizeof (int)); - memset (match, 0x00, cnt * sizeof (int)); - ptr1 = list; - while (ptr1 != NULL) - { - int found; - found = 0; - ptr2 = reference_list; - i = 0; - while (ptr2 != NULL) - { - if (ptr2->keywordType == ptr1->keywordType && - strcmp (ptr2->keyword, ptr1->keyword) == 0 && match[i] == 0) - { - found = 1; - match[i] = 1; - break; - } - i++; - ptr2 = ptr2->next; - } - if (found == 0) - break; - ptr1 = ptr1->next; - } - - pthread_mutex_unlock (&reference_lock); - for (i = 0; i < cnt; i++) - if (match[i] == 0) - return -1; - - return 0; -} - -static EXTRACTOR_KeywordList * -get_keywords_for_file (const struct FileData *file) -{ - EXTRACTOR_ExtractorList *el; - EXTRACTOR_KeywordList *list; - - if (file->use_thumbnailer) - { - el = EXTRACTOR_addLibrary (NULL, "libextractor_mime"); - el = EXTRACTOR_loadConfigLibraries (el, "-libextractor_thumbnail"); - } - else - { - el = EXTRACTOR_loadDefaultLibraries (); - } - if (el == NULL) - { - printf ("ERROR: failed to load plugins!\n"); - return NULL; - } - errno = 0; - list = EXTRACTOR_getKeywords (el, file->filename); - if (errno != 0) { - printf("ERROR: EXTRACTOR_getKeywords: %s\n", strerror(errno)); - } - /*EXTRACTOR_printKeywords (stderr, list); */ - EXTRACTOR_removeAll (el); - - return list; -} - -static void * -test_plugins (void *arg) -{ - struct TaskData *td = (struct TaskData *)arg; - while (!done) - { - EXTRACTOR_KeywordList *list; - - list = get_keywords_for_file (td->file); - - if ((list == NULL) || (compare_keywords_to_ref (list) != 0)) - { - printf ("ERROR: thread id %d failed keyword comparison!\n", td->id); - failed = 1; - } - if (list != NULL) - EXTRACTOR_freeKeywords (list); - } - return 0; -} - -static const struct FileData files[] = { - { TESTDATADIR "/test.bmp", 0 }, - { TESTDATADIR "/test.jpg", 0 }, - { TESTDATADIR "/test.png", 0 }, - { TESTDATADIR "/test.sxw", 0 }, - { TESTDATADIR "/test.bmp", 1 }, - { TESTDATADIR "/test.png", 1 }, - { NULL, 0 } -}; - -#define TEST_SECS 10 - -int -main (int argc, char *argv[]) -{ - int num_tasks = 10; - pthread_t task_list[num_tasks]; - struct TaskData td[num_tasks]; - int ret = 0; - int i; - int n; - - n = 0; - while ((files[n].filename != NULL) && (!failed)) { - printf("testing with '%s' for %d seconds\n", files[n].filename, TEST_SECS); - reference_list = get_keywords_for_file (&files[n]); - - for (i = 0; i < num_tasks; i++) - { - td[i].id = i; - td[i].file = &files[n]; - ret = pthread_create (&task_list[i], NULL, test_plugins, &td[i]); - if (ret != 0) - { - printf ("ERROR: pthread_create failed for thread %d\n", i); - num_tasks = i; - done = 1; - break; - } - } - if (!done) - sleep (TEST_SECS); - done = 1; - for (i = 0; i < num_tasks; i++) - { - if (pthread_join (task_list[i], NULL) != 0) - printf ("WARNING: pthread_join failed for thread %d\n", i); - } - - done = 0; - if (reference_list != NULL) - EXTRACTOR_freeKeywords (reference_list); - - n++; - } - - return failed; -}