diff options
author | Mark Michelson <mmichelson@digium.com> | 2012-12-11 16:34:00 +0000 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2012-12-11 16:34:00 +0000 |
commit | 8760e32ae380f65420799c290f7b92d40cd7926c (patch) | |
tree | 21f110cf8fd84476baee7e0fea62f4776db12055 /tests/test_threadpool.c | |
parent | 29fc1227839155658ca899cdfa179673c88e1ee2 (diff) |
Add auto-increment option and accompanying test.
This allows for the threadpool to automatically grow if tasks
are pushed to it and no idle threads are currently available.
git-svn-id: https://origsvn.digium.com/svn/asterisk/team/mmichelson/threadpool@377803 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'tests/test_threadpool.c')
-rw-r--r-- | tests/test_threadpool.c | 88 |
1 files changed, 86 insertions, 2 deletions
diff --git a/tests/test_threadpool.c b/tests/test_threadpool.c index 4fe63e222..38b79b58c 100644 --- a/tests/test_threadpool.c +++ b/tests/test_threadpool.c @@ -220,7 +220,7 @@ static enum ast_test_result_state wait_for_empty_notice(struct ast_test *test, s } if (!tld->empty_notice) { - ast_test_status_update(test, "Test listener never told that threadpool is empty\n"); + ast_test_status_update(test, "Test listener not notified that threadpool is empty\n"); res = AST_TEST_FAIL; } @@ -283,6 +283,7 @@ AST_TEST_DEFINE(threadpool_push) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -336,6 +337,7 @@ AST_TEST_DEFINE(threadpool_thread_creation) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -385,6 +387,7 @@ AST_TEST_DEFINE(threadpool_thread_destruction) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -443,6 +446,7 @@ AST_TEST_DEFINE(threadpool_thread_timeout) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 2, + .auto_increment = 0, }; switch (cmd) { @@ -505,6 +509,7 @@ AST_TEST_DEFINE(threadpool_one_task_one_thread) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -581,6 +586,7 @@ AST_TEST_DEFINE(threadpool_one_thread_one_task) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -645,7 +651,6 @@ end: ao2_cleanup(listener); ast_free(std); return res; - } AST_TEST_DEFINE(threadpool_one_thread_multiple_tasks) @@ -660,6 +665,7 @@ AST_TEST_DEFINE(threadpool_one_thread_multiple_tasks) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -737,7 +743,80 @@ end: ast_free(std2); ast_free(std3); return res; +} + +AST_TEST_DEFINE(threadpool_auto_increment) +{ + struct ast_threadpool *pool = NULL; + struct ast_threadpool_listener *listener = NULL; + struct simple_task_data *std = NULL; + enum ast_test_result_state res = AST_TEST_FAIL; + struct test_listener_data *tld; + struct ast_threadpool_options options = { + .version = AST_THREADPOOL_OPTIONS_VERSION, + .idle_timeout = 0, + .auto_increment = 3, + }; + + switch (cmd) { + case TEST_INIT: + info->name = "auto_increment"; + info->category = "/main/threadpool/"; + info->summary = "Test that the threadpool grows as tasks are added"; + info->description = + "Create an empty threadpool and push a task to it. Once the task is\n" + "pushed, the threadpool should add three threads and be able to\n" + "handle the task. The threads should then go idle\n"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + listener = ast_threadpool_listener_alloc(&test_callbacks); + if (!listener) { + return AST_TEST_FAIL; + } + tld = listener->private_data; + + pool = ast_threadpool_create(info->name, listener, 0, &options); + if (!pool) { + goto end; + } + + std = simple_task_data_alloc(); + if (!std) { + goto end; + } + + ast_threadpool_push(pool, simple_task, std); + + /* Pushing the task should result in the threadpool growing + * by three threads. This will allow the task to actually execute + */ + res = wait_for_completion(test, std); + if (res == AST_TEST_FAIL) { + goto end; + } + + res = wait_for_empty_notice(test, tld); + if (res == AST_TEST_FAIL) { + goto end; + } + + res = wait_until_thread_state(test, tld, 0, 3); + if (res == AST_TEST_FAIL) { + goto end; + } + res = listener_check(test, listener, 1, 1, 1, 0, 3, 1); + +end: + if (pool) { + ast_threadpool_shutdown(pool); + } + ao2_cleanup(listener); + ast_free(std); + return res; } AST_TEST_DEFINE(threadpool_reactivation) @@ -751,6 +830,7 @@ AST_TEST_DEFINE(threadpool_reactivation) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -913,6 +993,7 @@ AST_TEST_DEFINE(threadpool_task_distribution) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -1001,6 +1082,7 @@ AST_TEST_DEFINE(threadpool_more_destruction) struct ast_threadpool_options options = { .version = AST_THREADPOOL_OPTIONS_VERSION, .idle_timeout = 0, + .auto_increment = 0, }; switch (cmd) { @@ -1104,6 +1186,7 @@ static int unload_module(void) ast_test_unregister(threadpool_one_task_one_thread); ast_test_unregister(threadpool_one_thread_one_task); ast_test_unregister(threadpool_one_thread_multiple_tasks); + ast_test_unregister(threadpool_auto_increment); ast_test_unregister(threadpool_reactivation); ast_test_unregister(threadpool_task_distribution); ast_test_unregister(threadpool_more_destruction); @@ -1119,6 +1202,7 @@ static int load_module(void) ast_test_register(threadpool_one_task_one_thread); ast_test_register(threadpool_one_thread_one_task); ast_test_register(threadpool_one_thread_multiple_tasks); + ast_test_register(threadpool_auto_increment); ast_test_register(threadpool_reactivation); ast_test_register(threadpool_task_distribution); ast_test_register(threadpool_more_destruction); |