Kill some startup warnings and errors and make some messages more helpful in tracking...
[asterisk/asterisk.git] / tests / test_strings.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2010, 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 Dynamic string tests
22  *
23  * \author Mark Michelson <mmichelson@digium.com>
24  *
25  * This module will run some dyanmic string tests.
26  *
27  * \ingroup tests
28  */
29
30 /*** MODULEINFO
31         <depend>TEST_FRAMEWORK</depend>
32  ***/
33
34 #include "asterisk.h"
35
36 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
37
38 #include "asterisk/test.h"
39 #include "asterisk/utils.h"
40 #include "asterisk/strings.h"
41 #include "asterisk/module.h"
42
43 AST_TEST_DEFINE(str_test)
44 {
45         struct ast_str *stack_str;
46         struct ast_str *heap_str;
47         const char short_string1[] = "apple";
48         const char short_string2[] = "banana";
49         char short_string_cat[30];
50         const char long_string1[] = "applebananapeachmangocherrypeargrapeplumlimetangerinepomegranategravel";
51         const char long_string2[] = "passionuglinectarinepineapplekiwilemonpaintthinner";
52         char long_string_cat[200];
53         char string_limit_cat[11];
54         const int string_limit = 5;
55         int current_size;
56         enum ast_test_result_state res = AST_TEST_PASS;
57
58         switch (cmd) {
59         case TEST_INIT:
60                 info->name = "str_test";
61                 info->category = "/main/strings/";
62                 info->summary = "Test dynamic string operations";
63                 info->description = "Test setting and appending stack and heap-allocated strings";
64                 return AST_TEST_NOT_RUN;
65         case TEST_EXECUTE:
66                 break;
67         }
68         snprintf(short_string_cat, sizeof(short_string_cat), "%s%s", short_string1, short_string2);
69         snprintf(long_string_cat, sizeof(long_string_cat), "%s%s", long_string1, long_string2);
70         snprintf(string_limit_cat, string_limit, "%s", long_string1);
71         strncat(string_limit_cat, long_string2, string_limit);
72
73         if (!(stack_str = ast_str_alloca(15))) {
74                 ast_test_status_update(test, "Failed to allocate an ast_str on the stack\n");
75                 return AST_TEST_FAIL;
76         }
77
78         if (!(heap_str = ast_str_create(15))) {
79                 ast_test_status_update(test, "Failed to allocate an ast_str on the heap\n");
80         }
81
82         /* Stack string tests:
83          * Part 1: Basic tests
84          * a. set a small string
85          * b. append a small string
86          * c. clear a string
87          * Part 2: Advanced tests
88          * a. Set a string that is larger than our allocation
89          * b. Append a string that is larger than our allocation
90          */
91
92         /* Part 1a */
93         if (ast_str_set(&stack_str, 0, "%s", short_string1) < 0) {
94                 ast_test_status_update(test, "Error setting stack string\n");
95                 res = AST_TEST_FAIL;
96                 goto cleanup;
97         }
98         if (strcmp(ast_str_buffer(stack_str), short_string1)) {
99                 ast_test_status_update(test, "ast_str_set failed for stack string. Expected '%s' but"
100                                 "instead got %s\n", short_string1, ast_str_buffer(stack_str));
101                 res = AST_TEST_FAIL;
102                 goto cleanup;
103         }
104         /* Part 1b */
105         if (ast_str_append(&stack_str, 0, "%s", short_string2) < 0) {
106                 ast_test_status_update(test, "Error appending to stack string\n");
107                 res = AST_TEST_FAIL;
108                 goto cleanup;
109         }
110         if (strcmp(ast_str_buffer(stack_str), short_string_cat)) {
111                 ast_test_status_update(test, "ast_str_set failed for stack string. Expected '%s'"
112                                 "but instead got %s\n", short_string_cat, ast_str_buffer(stack_str));
113                 res = AST_TEST_FAIL;
114                 goto cleanup;
115         }
116         /* Part 1c */
117         ast_str_reset(stack_str);
118         if (ast_str_strlen(stack_str) != 0) {
119                 ast_test_status_update(test, "ast_str_reset resulted in non-zero length for stack_str\n");
120                 res = AST_TEST_FAIL;
121                 goto cleanup;
122         }
123
124         /* Part 2a */
125         if (ast_str_set(&stack_str, -1, "%s", long_string1) < 0) {
126                 ast_test_status_update(test, "Error setting stack string with long input\n");
127                 res = AST_TEST_FAIL;
128                 goto cleanup;
129         }
130         if (strncmp(ast_str_buffer(stack_str), long_string1, ast_str_strlen(stack_str))) {
131                 ast_test_status_update(test, "Stack string not set to what is expected.\n");
132                 res = AST_TEST_FAIL;
133                 goto cleanup;
134         }
135         /* Part 2b */
136         if (ast_str_append(&stack_str, -1, "%s", long_string2) < 0) {
137                 ast_test_status_update(test, "Error appending long string to full stack string buffer\n");
138                 res = AST_TEST_FAIL;
139                 goto cleanup;
140         }
141         if (strncmp(ast_str_buffer(stack_str), long_string_cat, ast_str_strlen(stack_str))) {
142                 ast_test_status_update(test, "Stack string not set to what is expected.\n");
143                 res = AST_TEST_FAIL;
144                 goto cleanup;
145         }
146
147         /* Heap string tests
148          *
149          * All stack string tests from part 1.
150          * All stack string tests 2a and 2b.
151          * Tests 2a and 2b from stack string tests, passing 0 as max_len
152          * instead of -1. This allows for the buffer to grow.
153          */
154         /* Part 1a */
155         if (ast_str_set(&heap_str, 0, "%s", short_string1) < 0) {
156                 ast_test_status_update(test, "Error setting heap string\n");
157                 res = AST_TEST_FAIL;
158                 goto cleanup;
159         }
160         if (strcmp(ast_str_buffer(heap_str), short_string1)) {
161                 ast_test_status_update(test, "ast_str_set failed for heap string. Expected '%s' but"
162                                 "instead got %s\n", short_string1, ast_str_buffer(heap_str));
163                 res = AST_TEST_FAIL;
164                 goto cleanup;
165         }
166         /* Part 1b */
167         if (ast_str_append(&heap_str, 0, "%s", short_string2) < 0) {
168                 ast_test_status_update(test, "Error appending to heap string\n");
169                 res = AST_TEST_FAIL;
170                 goto cleanup;
171         }
172         if (strcmp(ast_str_buffer(heap_str), short_string_cat)) {
173                 ast_test_status_update(test, "ast_str_set failed for stack string. Expected '%s'"
174                                 "but instead got %s\n", short_string_cat, ast_str_buffer(stack_str));
175                 res = AST_TEST_FAIL;
176                 goto cleanup;
177         }
178         /* Part 1c */
179         ast_str_reset(heap_str);
180         if (ast_str_strlen(heap_str) != 0) {
181                 ast_test_status_update(test, "ast_str_reset resulted in non-zero length for stack_str\n");
182                 res = AST_TEST_FAIL;
183                 goto cleanup;
184         }
185         /* Part 2a with -1 arg */
186         current_size = ast_str_size(heap_str);
187         if (ast_str_set(&heap_str, -1, "%s", long_string1) < 0) {
188                 ast_test_status_update(test, "Error setting heap string with long input\n");
189                 res = AST_TEST_FAIL;
190                 goto cleanup;
191         }
192         if (current_size != ast_str_size(heap_str)) {
193                 ast_test_status_update(test, "Heap string changed size during ast_str_set when it was"
194                                 "instructed not to. Was %d and now is %d\n", current_size, (int) ast_str_size(heap_str));
195                 res = AST_TEST_FAIL;
196                 goto cleanup;
197         }
198         if (strncmp(ast_str_buffer(heap_str), long_string1, ast_str_strlen(heap_str))) {
199                 ast_test_status_update(test, "Heap string not set to what is expected.\n");
200                 res = AST_TEST_FAIL;
201                 goto cleanup;
202         }
203         /* Part 2b with -1 arg */
204         current_size = ast_str_size(heap_str);
205         if (ast_str_append(&heap_str, -1, "%s", long_string2) < 0) {
206                 ast_test_status_update(test, "Error appending long string to full heap string buffer\n");
207                 res = AST_TEST_FAIL;
208                 goto cleanup;
209         }
210         if (current_size != ast_str_size(heap_str)) {
211                 ast_test_status_update(test, "Heap string changed size during ast_str_append when it was"
212                                 "instructed not to. Was %d and now is %d\n", current_size, (int) ast_str_size(heap_str));
213                 res = AST_TEST_FAIL;
214                 goto cleanup;
215         }
216         if (strncmp(ast_str_buffer(heap_str), long_string_cat, ast_str_strlen(heap_str))) {
217                 ast_test_status_update(test, "Heap string not set to what is expected.\n");
218                 res = AST_TEST_FAIL;
219                 goto cleanup;
220         }
221         /* reset string before continuing */
222         ast_str_reset(heap_str);
223         /* Part 2a with 0 arg */
224         if (ast_str_set(&heap_str, 0, "%s", long_string1) < 0) {
225                 ast_test_status_update(test, "Error setting heap string with long input\n");
226                 res = AST_TEST_FAIL;
227                 goto cleanup;
228         }
229         if (strcmp(ast_str_buffer(heap_str), long_string1)) {
230                 ast_test_status_update(test, "Heap string does not contain what was expected. Expected %s"
231                                 "but have %s instead\n", long_string1, ast_str_buffer(heap_str));
232                 res = AST_TEST_FAIL;
233                 goto cleanup;
234         }
235         /* Part 2b with 0 arg */
236         if (ast_str_append(&heap_str, 0, "%s", long_string2) < 0) {
237                 ast_test_status_update(test, "Error setting heap string with long input\n");
238                 res = AST_TEST_FAIL;
239                 goto cleanup;
240         }
241         if (strcmp(ast_str_buffer(heap_str), long_string_cat)) {
242                 ast_test_status_update(test, "Heap string does not contain what was expected. Expected %s"
243                                 "but have %s instead\n", long_string_cat, ast_str_buffer(heap_str));
244                 res = AST_TEST_FAIL;
245                 goto cleanup;
246         }
247
248 cleanup:
249         ast_free(heap_str);
250         return res;
251 }
252
253 static int unload_module(void)
254 {
255         AST_TEST_UNREGISTER(str_test);
256         return 0;
257 }
258
259 static int load_module(void)
260 {
261         AST_TEST_REGISTER(str_test);
262         return AST_MODULE_LOAD_SUCCESS;
263 }
264
265 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Dynamic string test module");