Add unit test for testing ACL functionality.
[asterisk/asterisk.git] / tests / test_app.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2010, Digium, Inc.
5  *
6  * Jeff Peeler <jpeeler@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 App unit test
22  *
23  * \author Jeff Peeler <jpeeler@digium.com>
24  *
25  */
26
27 /*** MODULEINFO
28         <depend>TEST_FRAMEWORK</depend>
29  ***/
30
31 #include "asterisk.h"
32
33 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
34
35 #include "asterisk/utils.h"
36 #include "asterisk/module.h"
37 #include "asterisk/test.h"
38 #include "asterisk/app.h"
39 #include "asterisk/channel.h"
40
41 #define BASE_GROUP "a group"
42
43 AST_TEST_DEFINE(app_group)
44 {
45         struct ast_channel *test_channel1 = NULL;
46         struct ast_channel *test_channel2 = NULL;
47         struct ast_channel *test_channel3 = NULL;
48         struct ast_channel *test_channel4 = NULL;
49
50         static const char group1_full[] = BASE_GROUP "groupgroup";
51         static const char group2_full[] = BASE_GROUP "Groupgroup";
52         static const char regex1[] = "gr"; /* matches everything */
53         static const char regex2[] = "(group){2}$"; /* matches only group1_full */
54         static const char regex3[] = "[:ascii:]"; /* matches everything */
55         static const char regex4[] = "^(NOMATCH)"; /* matches nothing */
56         static const char category1_full[] = BASE_GROUP "@a_category"; /* categories shouldn't have spaces */
57         static const char category2_full[] = BASE_GROUP "@another!Category";
58         static const char regex5[] = "(gory)$"; /* matches both categories */
59         static const char regex6[] = "[A-Z]+"; /* matches only category2_full */
60         static const char regex7[] = "[["; /* not valid syntax, yes an expected warning will be displayed */
61         static enum ast_test_result_state res = AST_TEST_PASS;
62         static const struct group_test_params {
63                 const char *groupmatch;
64                 const char *category;
65                 int expected;
66         } subtests[] = {
67                 { regex1, "", 4 },
68                 { regex2, "", 1 },
69                 { regex3, "", 4 },
70                 { regex4, "", 0 },
71                 { BASE_GROUP, regex5, 2 },
72                 { BASE_GROUP, regex6, 1 },
73                 /* this test is expected to generate a warning message from the invalid regex */
74                 { BASE_GROUP, regex7, 0 }
75         };
76         int i;
77         int returned_count;
78
79         switch (cmd) {
80         case TEST_INIT:
81                 info->name = "app_group";
82                 info->category = "main/app/";
83                 info->summary = "App group unit test";
84                 info->description =
85                         "This tests various app group functionality";
86                 return AST_TEST_NOT_RUN;
87         case TEST_EXECUTE:
88                 break;
89         }
90
91         ast_test_status_update(test, "Creating test channels with the following groups:\n"
92                 "'%s', '%s', '%s', '%s'\n", group1_full, group2_full, category1_full, category2_full);
93
94         if (!(test_channel1 = ast_channel_alloc(0, AST_STATE_DOWN, NULL, NULL, NULL,
95         NULL, NULL, 0, 0, "TestChannel1"))) {
96                 goto exit_group_test;
97         }
98         if (!(test_channel2 = ast_channel_alloc(0, AST_STATE_DOWN, NULL, NULL, NULL,
99         NULL, NULL, 0, 0, "TestChannel2"))) {
100                 goto exit_group_test;
101         }
102         if (!(test_channel3 = ast_channel_alloc(0, AST_STATE_DOWN, NULL, NULL, NULL,
103         NULL, NULL, 0, 0, "TestChannel3"))) {
104                 goto exit_group_test;
105         }
106         if (!(test_channel4 = ast_channel_alloc(0, AST_STATE_DOWN, NULL, NULL, NULL,
107         NULL, NULL, 0, 0, "TestChannel4"))) {
108                 goto exit_group_test;
109         }
110
111         ast_app_group_set_channel(test_channel1, group1_full);
112         ast_app_group_set_channel(test_channel2, group2_full);
113         ast_app_group_set_channel(test_channel3, category1_full);
114         ast_app_group_set_channel(test_channel4, category2_full);
115
116         for (i = 0; i < ARRAY_LEN(subtests); i++) {
117                 ast_assert(subtests[i].groupmatch != NULL || subtests[i].category != NULL);
118                 returned_count = ast_app_group_match_get_count(subtests[i].groupmatch, subtests[i].category);
119
120                 if (subtests[i].expected != returned_count) {
121                         ast_test_status_update(test, "(Subtest %d) Expected %d matches but found %d when examining group:'%s' category:'%s'\n",
122                                 i + 1, subtests[i].expected, returned_count, subtests[i].groupmatch, subtests[i].category);
123                         res = AST_TEST_FAIL;
124                         goto exit_group_test;
125                 } else {
126                         ast_test_status_update(test, "(Subtest %d) Found %d matches as expected when examining group:'%s' category:'%s'\n",
127                                 i + 1, subtests[i].expected, subtests[i].groupmatch, subtests[i].category);
128                 }
129         }
130
131 exit_group_test:
132         if (test_channel1) {
133                 ast_hangup(test_channel1);
134         }
135         if (test_channel2) {
136                 ast_hangup(test_channel2);
137         }
138         if (test_channel3) {
139                 ast_hangup(test_channel3);
140         }
141         if (test_channel4) {
142                 ast_hangup(test_channel4);
143         }
144         return res;
145 }
146
147 static int unload_module(void)
148 {
149         AST_TEST_UNREGISTER(app_group);
150         return 0;
151 }
152
153 static int load_module(void)
154 {
155         AST_TEST_REGISTER(app_group);
156         return AST_MODULE_LOAD_SUCCESS;
157 }
158
159 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "App unit test");