Add a basic taskprocessor test.
[asterisk/asterisk.git] / tests / test_taskprocessor.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2012, Digium, Inc.
5  *
6  * Mark Michelson <mmichelson@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*!
20  * \file
21  * \brief taskprocessor unit tests
22  *
23  * \author Mark Michelson <mmichelson@digium.com>
24  *
25  */
26
27 /*** MODULEINFO
28         <depend>TEST_FRAMEWORK</depend>
29         <support_level>core</support_level>
30  ***/
31
32 #include "asterisk.h"
33
34 #include "asterisk/test.h"
35 #include "asterisk/taskprocessor.h"
36 #include "asterisk/module.h"
37
38 struct task_data {
39         ast_cond_t cond;
40         ast_mutex_t lock;
41         int task_complete;
42 };
43
44 static int task(void *data)
45 {
46         struct task_data *task_data = data;
47         SCOPED_MUTEX(lock, &task_data->lock);
48         task_data->task_complete = 1;
49         ast_cond_signal(&task_data->cond);
50         return 0;
51 }
52
53 AST_TEST_DEFINE(default_taskprocessor)
54 {
55         struct ast_taskprocessor *tps;
56         struct task_data task_data;
57         enum ast_test_result_state res = AST_TEST_PASS;
58
59         switch (cmd) {
60         case TEST_INIT:
61                 info->name = "default_taskprocessor";
62                 info->category = "/main/taskprocessor/";
63                 info->summary = "Test of default taskproccesor";
64                 info->description =
65                         "Ensures that queued tasks are executed.";
66                 return AST_TEST_NOT_RUN;
67         case TEST_EXECUTE:
68                 break;
69         }
70
71         tps = ast_taskprocessor_get("test", TPS_REF_DEFAULT);
72
73         if (!tps) {
74                 ast_test_status_update(test, "Unable to create test taskprocessor\n");
75                 return AST_TEST_FAIL;
76         }
77
78         ast_cond_init(&task_data.cond, NULL);
79         ast_mutex_init(&task_data.lock);
80         task_data.task_complete = 0;
81
82         ast_taskprocessor_push(tps, task, &task_data);
83         ast_mutex_lock(&task_data.lock);
84         while (!task_data.task_complete) {
85                 ast_cond_wait(&task_data.cond, &task_data.lock);
86         }
87
88         if (!task_data.task_complete) {
89                 ast_test_status_update(test, "Queued task did not execute!\n");
90                 res = AST_TEST_FAIL;
91                 goto test_end;
92         }
93
94 test_end:
95         tps = ast_taskprocessor_unreference(tps);
96         ast_mutex_destroy(&task_data.lock);
97         ast_cond_destroy(&task_data.cond);
98         return res;
99 }
100
101 static int unload_module(void)
102 {
103         ast_test_unregister(default_taskprocessor);
104         return 0;
105 }
106
107 static int load_module(void)
108 {
109         ast_test_register(default_taskprocessor);
110         return AST_MODULE_LOAD_SUCCESS;
111 }
112
113 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "taskprocessor test module");