Add unit test for testing ACL functionality.
[asterisk/asterisk.git] / tests / test_event.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2010, Digium, Inc.
5  *
6  * Russell Bryant <russell@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 Tests for the ast_event API
22  *
23  * \author Russell Bryant <russell@digium.com>
24  *
25  * \ingroup tests
26  */
27
28 /*** MODULEINFO
29         <depend>TEST_FRAMEWORK</depend>
30  ***/
31
32 #include "asterisk.h"
33
34 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
35
36 #include "asterisk/module.h"
37 #include "asterisk/utils.h"
38 #include "asterisk/test.h"
39 #include "asterisk/event.h"
40
41 static int check_event(struct ast_event *event, struct ast_test *test,
42                 enum ast_event_type expected_type, const char *str,
43                 uint32_t uint)
44 {
45         enum ast_event_type type;
46         const void *foo;
47
48         /* Check #1: Ensure event type is set properly. */
49         type = ast_event_get_type(event);
50         if (ast_event_get_type(event) != type) {
51                 ast_test_status_update(test, "Expected event type: '%d', got '%d'\n",
52                                 expected_type, type);
53                 return -1;
54         }
55
56         /* Check #2: Check for automatically included EID */
57         if (memcmp(&ast_eid_default, ast_event_get_ie_raw(event, AST_EVENT_IE_EID), sizeof(ast_eid_default))) {
58                 ast_test_status_update(test, "Failed to get EID\n");
59                 return -1;
60         }
61
62         /* Check #3: Check for the string IE */
63         if (strcmp(str, ast_event_get_ie_str(event, AST_EVENT_IE_MAILBOX))) {
64                 ast_test_status_update(test, "Failed to get string IE.\n");
65                 return -1;
66         }
67
68         /* Check #4: Check for the uint IE */
69         if (uint != ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS)) {
70                 ast_test_status_update(test, "Failed to get uint IE.\n");
71                 return -1;
72         }
73
74         /* Check #5: Check if a check for a str IE that isn't there works */
75         if ((foo = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE))) {
76                 ast_test_status_update(test, "DEVICE IE check returned non-NULL %p\n", foo);
77                 return -1;
78         }
79
80         /* Check #6: Check if a check for a uint IE that isn't there returns 0 */
81         if (ast_event_get_ie_uint(event, AST_EVENT_IE_OLDMSGS)) {
82                 ast_test_status_update(test, "OLDMSGS IE should be 0\n");
83                 return -1;
84         }
85
86         ast_test_status_update(test, "Event looks good.\n");
87
88         return 0;
89 }
90
91 AST_TEST_DEFINE(event_new_test)
92 {
93         enum ast_test_result_state res = AST_TEST_PASS;
94         struct ast_event *event = NULL;
95
96         static const enum ast_event_type type = AST_EVENT_CUSTOM;
97         static const char str[] = "SIP/alligatormittens";
98         static const uint32_t uint = 0xb00bface;
99
100         switch (cmd) {
101         case TEST_INIT:
102                 info->name = "ast_event_new_test";
103                 info->category = "main/event/";
104                 info->summary = "Test event creation";
105                 info->description =
106                         "This test exercises the API calls that allow allocation "
107                         "of an ast_event.";
108                 return AST_TEST_NOT_RUN;
109         case TEST_EXECUTE:
110                 break;
111         }
112
113         /*
114          * Test 2 methods of event creation:
115          *
116          * 1) Dynamic via appending each IE individually.
117          * 2) Statically, with all IEs in ast_event_new().
118          */
119
120         ast_test_status_update(test, "First, test dynamic event creation...\n");
121
122         if (!(event = ast_event_new(type, AST_EVENT_IE_END))) {
123                 ast_test_status_update(test, "Failed to allocate ast_event object.\n");
124                 res = AST_TEST_FAIL;
125                 goto return_cleanup;
126         }
127
128         if (ast_event_append_ie_str(&event, AST_EVENT_IE_MAILBOX, str)) {
129                 ast_test_status_update(test, "Failed to append str IE\n");
130                 res = AST_TEST_FAIL;
131                 goto return_cleanup;
132         }
133
134         if (ast_event_append_ie_uint(&event, AST_EVENT_IE_NEWMSGS, uint)) {
135                 ast_test_status_update(test, "Failed to append uint IE\n");
136                 res = AST_TEST_FAIL;
137                 goto return_cleanup;
138         }
139
140         if (ast_event_append_eid(&event)) {
141                 ast_test_status_update(test, "Failed to append EID\n");
142                 res = AST_TEST_FAIL;
143                 goto return_cleanup;
144         }
145
146         if (check_event(event, test, type, str, uint)) {
147                 ast_test_status_update(test, "Dynamically generated event broken\n");
148                 res = AST_TEST_FAIL;
149                 goto return_cleanup;
150         }
151
152         ast_event_destroy(event);
153         event = NULL;
154
155         event = ast_event_new(type,
156                         AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, str,
157                         AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, uint,
158                         AST_EVENT_IE_END);
159
160         if (!event) {
161                 ast_test_status_update(test, "Failed to allocate ast_event object.\n");
162                 res = AST_TEST_FAIL;
163                 goto return_cleanup;
164         }
165
166         if (check_event(event, test, type, str, uint)) {
167                 ast_test_status_update(test, "Statically generated event broken\n");
168                 res = AST_TEST_FAIL;
169                 goto return_cleanup;
170         }
171
172 return_cleanup:
173         if (event) {
174                 ast_event_destroy(event);
175                 event = NULL;
176         }
177
178         return res;
179 }
180
181 static int unload_module(void)
182 {
183         AST_TEST_UNREGISTER(event_new_test);
184         return 0;
185 }
186
187 static int load_module(void)
188 {
189         AST_TEST_REGISTER(event_new_test);
190         return AST_MODULE_LOAD_SUCCESS;
191 }
192
193 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "ast_event API Tests");