#include "asterisk.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "asterisk/channel.h"
#include "asterisk/options.h"
#include "asterisk/module.h"
#include "asterisk/logger.h"
#include "asterisk/lock.h"
#include "asterisk/app.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
Include dependency graph for app_test.c:
Go to the source code of this file.
Functions | |
AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Interface Test Application") | |
static int | load_module (void) |
static int | measurenoise (struct ast_channel *chan, int ms, char *who) |
static int | sendnoise (struct ast_channel *chan, int ms) |
static int | testclient_exec (struct ast_channel *chan, void *data) |
static int | testserver_exec (struct ast_channel *chan, void *data) |
static int | unload_module (void) |
Variables | |
static char * | testc_app = "TestClient" |
static char * | testc_descrip |
static char * | testc_synopsis = "Execute Interface Test Client" |
static char * | tests_app = "TestServer" |
static char * | tests_descrip |
static char * | tests_synopsis = "Execute Interface Test Server" |
Definition in file app_test.c.
AST_MODULE_INFO_STANDARD | ( | ASTERISK_GPL_KEY | , | |
"Interface Test Application" | ||||
) |
static int load_module | ( | void | ) | [static] |
Definition at line 504 of file app_test.c.
References ast_register_application(), testclient_exec(), and testserver_exec().
00505 { 00506 int res; 00507 00508 res = ast_register_application(testc_app, testclient_exec, testc_synopsis, testc_descrip); 00509 res |= ast_register_application(tests_app, testserver_exec, tests_synopsis, tests_descrip); 00510 00511 return res; 00512 }
static int measurenoise | ( | struct ast_channel * | chan, | |
int | ms, | |||
char * | who | |||
) | [static] |
Definition at line 64 of file app_test.c.
References AST_FORMAT_SLINEAR, AST_FRAME_VOICE, ast_frfree, ast_log(), ast_read(), ast_set_read_format(), ast_waitfor(), f, LOG_DEBUG, LOG_NOTICE, and ast_channel::readformat.
Referenced by testclient_exec(), and testserver_exec().
00065 { 00066 int res=0; 00067 int mssofar; 00068 int noise=0; 00069 int samples=0; 00070 int x; 00071 short *foo; 00072 struct timeval start; 00073 struct ast_frame *f; 00074 int rformat; 00075 rformat = chan->readformat; 00076 if (ast_set_read_format(chan, AST_FORMAT_SLINEAR)) { 00077 ast_log(LOG_NOTICE, "Unable to set to linear mode!\n"); 00078 return -1; 00079 } 00080 start = ast_tvnow(); 00081 for(;;) { 00082 mssofar = ast_tvdiff_ms(ast_tvnow(), start); 00083 if (mssofar > ms) 00084 break; 00085 res = ast_waitfor(chan, ms - mssofar); 00086 if (res < 1) 00087 break; 00088 f = ast_read(chan); 00089 if (!f) { 00090 res = -1; 00091 break; 00092 } 00093 if ((f->frametype == AST_FRAME_VOICE) && (f->subclass == AST_FORMAT_SLINEAR)) { 00094 foo = (short *)f->data; 00095 for (x=0;x<f->samples;x++) { 00096 noise += abs(foo[x]); 00097 samples++; 00098 } 00099 } 00100 ast_frfree(f); 00101 } 00102 00103 if (rformat) { 00104 if (ast_set_read_format(chan, rformat)) { 00105 ast_log(LOG_NOTICE, "Unable to restore original format!\n"); 00106 return -1; 00107 } 00108 } 00109 if (res < 0) 00110 return res; 00111 if (!samples) { 00112 ast_log(LOG_NOTICE, "No samples were received from the other side!\n"); 00113 return -1; 00114 } 00115 ast_log(LOG_DEBUG, "%s: Noise: %d, samples: %d, avg: %d\n", who, noise, samples, noise / samples); 00116 return (noise / samples); 00117 }
static int sendnoise | ( | struct ast_channel * | chan, | |
int | ms | |||
) | [static] |
Definition at line 119 of file app_test.c.
References ast_tonepair_start(), ast_tonepair_stop(), and ast_waitfordigit().
Referenced by testclient_exec(), and testserver_exec().
00120 { 00121 int res; 00122 res = ast_tonepair_start(chan, 1537, 2195, ms, 8192); 00123 if (!res) { 00124 res = ast_waitfordigit(chan, ms); 00125 ast_tonepair_stop(chan); 00126 } 00127 return res; 00128 }
static int testclient_exec | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
Definition at line 130 of file app_test.c.
References ast_channel::_state, ast_answer(), ast_app_getdata(), ast_config_AST_LOG_DIR, ast_dtmf_stream(), ast_log(), ast_module_user_add, ast_module_user_remove, ast_safe_sleep(), AST_STATE_UP, ast_strlen_zero(), ast_waitfordigit(), ast_module_user::chan, f, LOG_DEBUG, LOG_NOTICE, LOG_WARNING, measurenoise(), option_debug, and sendnoise().
Referenced by load_module().
00131 { 00132 struct ast_module_user *u; 00133 int res = 0; 00134 char *testid=data; 00135 char fn[80]; 00136 char serverver[80]; 00137 FILE *f; 00138 00139 /* Check for test id */ 00140 if (ast_strlen_zero(testid)) { 00141 ast_log(LOG_WARNING, "TestClient requires an argument - the test id\n"); 00142 return -1; 00143 } 00144 00145 u = ast_module_user_add(chan); 00146 00147 if (chan->_state != AST_STATE_UP) 00148 res = ast_answer(chan); 00149 00150 /* Wait a few just to be sure things get started */ 00151 res = ast_safe_sleep(chan, 3000); 00152 /* Transmit client version */ 00153 if (!res) 00154 res = ast_dtmf_stream(chan, NULL, "8378*1#", 0); 00155 if (option_debug) 00156 ast_log(LOG_DEBUG, "Transmit client version\n"); 00157 00158 /* Read server version */ 00159 if (option_debug) 00160 ast_log(LOG_DEBUG, "Read server version\n"); 00161 if (!res) 00162 res = ast_app_getdata(chan, NULL, serverver, sizeof(serverver) - 1, 0); 00163 if (res > 0) 00164 res = 0; 00165 if (option_debug) 00166 ast_log(LOG_DEBUG, "server version: %s\n", serverver); 00167 00168 if (res > 0) 00169 res = 0; 00170 00171 if (!res) 00172 res = ast_safe_sleep(chan, 1000); 00173 /* Send test id */ 00174 if (!res) 00175 res = ast_dtmf_stream(chan, NULL, testid, 0); 00176 if (!res) 00177 res = ast_dtmf_stream(chan, NULL, "#", 0); 00178 if (option_debug) 00179 ast_log(LOG_DEBUG, "send test identifier: %s\n", testid); 00180 00181 if ((res >=0) && (!ast_strlen_zero(testid))) { 00182 /* Make the directory to hold the test results in case it's not there */ 00183 snprintf(fn, sizeof(fn), "%s/testresults", ast_config_AST_LOG_DIR); 00184 mkdir(fn, 0777); 00185 snprintf(fn, sizeof(fn), "%s/testresults/%s-client.txt", ast_config_AST_LOG_DIR, testid); 00186 if ((f = fopen(fn, "w+"))) { 00187 setlinebuf(f); 00188 fprintf(f, "CLIENTCHAN: %s\n", chan->name); 00189 fprintf(f, "CLIENTTEST ID: %s\n", testid); 00190 fprintf(f, "ANSWER: PASS\n"); 00191 res = 0; 00192 00193 if (!res) { 00194 /* Step 1: Wait for "1" */ 00195 if (option_debug) 00196 ast_log(LOG_DEBUG, "TestClient: 2. Wait DTMF 1\n"); 00197 res = ast_waitfordigit(chan, 3000); 00198 fprintf(f, "WAIT DTMF 1: %s\n", (res != '1') ? "FAIL" : "PASS"); 00199 if (res == '1') 00200 res = 0; 00201 else 00202 res = -1; 00203 } 00204 if (!res) 00205 res = ast_safe_sleep(chan, 1000); 00206 if (!res) { 00207 /* Step 2: Send "2" */ 00208 if (option_debug) 00209 ast_log(LOG_DEBUG, "TestClient: 2. Send DTMF 2\n"); 00210 res = ast_dtmf_stream(chan, NULL, "2", 0); 00211 fprintf(f, "SEND DTMF 2: %s\n", (res < 0) ? "FAIL" : "PASS"); 00212 if (res > 0) 00213 res = 0; 00214 } 00215 if (!res) { 00216 /* Step 3: Wait one second */ 00217 if (option_debug) 00218 ast_log(LOG_DEBUG, "TestClient: 3. Wait one second\n"); 00219 res = ast_safe_sleep(chan, 1000); 00220 fprintf(f, "WAIT 1 SEC: %s\n", (res < 0) ? "FAIL" : "PASS"); 00221 if (res > 0) 00222 res = 0; 00223 } 00224 if (!res) { 00225 /* Step 4: Measure noise */ 00226 if (option_debug) 00227 ast_log(LOG_DEBUG, "TestClient: 4. Measure noise\n"); 00228 res = measurenoise(chan, 5000, "TestClient"); 00229 fprintf(f, "MEASURENOISE: %s (%d)\n", (res < 0) ? "FAIL" : "PASS", res); 00230 if (res > 0) 00231 res = 0; 00232 } 00233 if (!res) { 00234 /* Step 5: Wait for "4" */ 00235 if (option_debug) 00236 ast_log(LOG_DEBUG, "TestClient: 5. Wait DTMF 4\n"); 00237 res = ast_waitfordigit(chan, 3000); 00238 fprintf(f, "WAIT DTMF 4: %s\n", (res != '4') ? "FAIL" : "PASS"); 00239 if (res == '4') 00240 res = 0; 00241 else 00242 res = -1; 00243 } 00244 if (!res) { 00245 /* Step 6: Transmit tone noise */ 00246 if (option_debug) 00247 ast_log(LOG_DEBUG, "TestClient: 6. Transmit tone\n"); 00248 res = sendnoise(chan, 6000); 00249 fprintf(f, "SENDTONE: %s\n", (res < 0) ? "FAIL" : "PASS"); 00250 } 00251 if (!res || (res == '5')) { 00252 /* Step 7: Wait for "5" */ 00253 if (option_debug) 00254 ast_log(LOG_DEBUG, "TestClient: 7. Wait DTMF 5\n"); 00255 if (!res) 00256 res = ast_waitfordigit(chan, 3000); 00257 fprintf(f, "WAIT DTMF 5: %s\n", (res != '5') ? "FAIL" : "PASS"); 00258 if (res == '5') 00259 res = 0; 00260 else 00261 res = -1; 00262 } 00263 if (!res) { 00264 /* Step 8: Wait one second */ 00265 if (option_debug) 00266 ast_log(LOG_DEBUG, "TestClient: 8. Wait one second\n"); 00267 res = ast_safe_sleep(chan, 1000); 00268 fprintf(f, "WAIT 1 SEC: %s\n", (res < 0) ? "FAIL" : "PASS"); 00269 if (res > 0) 00270 res = 0; 00271 } 00272 if (!res) { 00273 /* Step 9: Measure noise */ 00274 if (option_debug) 00275 ast_log(LOG_DEBUG, "TestClient: 6. Measure tone\n"); 00276 res = measurenoise(chan, 4000, "TestClient"); 00277 fprintf(f, "MEASURETONE: %s (%d)\n", (res < 0) ? "FAIL" : "PASS", res); 00278 if (res > 0) 00279 res = 0; 00280 } 00281 if (!res) { 00282 /* Step 10: Send "7" */ 00283 if (option_debug) 00284 ast_log(LOG_DEBUG, "TestClient: 7. Send DTMF 7\n"); 00285 res = ast_dtmf_stream(chan, NULL, "7", 0); 00286 fprintf(f, "SEND DTMF 7: %s\n", (res < 0) ? "FAIL" : "PASS"); 00287 if (res > 0) 00288 res =0; 00289 } 00290 if (!res) { 00291 /* Step 11: Wait for "8" */ 00292 if (option_debug) 00293 ast_log(LOG_DEBUG, "TestClient: 11. Wait DTMF 8\n"); 00294 res = ast_waitfordigit(chan, 3000); 00295 fprintf(f, "WAIT DTMF 8: %s\n", (res != '8') ? "FAIL" : "PASS"); 00296 if (res == '8') 00297 res = 0; 00298 else 00299 res = -1; 00300 00301 sleep(1); 00302 } 00303 if (option_debug && !res ) { 00304 /* Step 12: Hangup! */ 00305 ast_log(LOG_DEBUG, "TestClient: 12. Hangup\n"); 00306 } 00307 00308 if (option_debug) 00309 ast_log(LOG_DEBUG, "-- TEST COMPLETE--\n"); 00310 fprintf(f, "-- END TEST--\n"); 00311 fclose(f); 00312 res = -1; 00313 } else 00314 res = -1; 00315 } else { 00316 ast_log(LOG_NOTICE, "Did not read a test ID on '%s'\n", chan->name); 00317 res = -1; 00318 } 00319 ast_module_user_remove(u); 00320 return res; 00321 }
static int testserver_exec | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
Definition at line 323 of file app_test.c.
References ast_channel::_state, ast_answer(), ast_app_getdata(), ast_config_AST_LOG_DIR, ast_dtmf_stream(), ast_log(), ast_module_user_add, ast_module_user_remove, ast_safe_sleep(), AST_STATE_UP, ast_strlen_zero(), ast_waitfordigit(), ast_module_user::chan, f, LOG_DEBUG, LOG_NOTICE, measurenoise(), option_debug, and sendnoise().
Referenced by load_module().
00324 { 00325 struct ast_module_user *u; 00326 int res = 0; 00327 char testid[80]=""; 00328 char fn[80]; 00329 FILE *f; 00330 u = ast_module_user_add(chan); 00331 if (chan->_state != AST_STATE_UP) 00332 res = ast_answer(chan); 00333 /* Read version */ 00334 if (option_debug) 00335 ast_log(LOG_DEBUG, "Read client version\n"); 00336 if (!res) 00337 res = ast_app_getdata(chan, NULL, testid, sizeof(testid) - 1, 0); 00338 if (res > 0) 00339 res = 0; 00340 if (option_debug) { 00341 ast_log(LOG_DEBUG, "client version: %s\n", testid); 00342 ast_log(LOG_DEBUG, "Transmit server version\n"); 00343 } 00344 res = ast_safe_sleep(chan, 1000); 00345 if (!res) 00346 res = ast_dtmf_stream(chan, NULL, "8378*1#", 0); 00347 if (res > 0) 00348 res = 0; 00349 00350 if (!res) 00351 res = ast_app_getdata(chan, NULL, testid, sizeof(testid) - 1, 0); 00352 if (option_debug) 00353 ast_log(LOG_DEBUG, "read test identifier: %s\n", testid); 00354 /* Check for sneakyness */ 00355 if (strchr(testid, '/')) 00356 res = -1; 00357 if ((res >=0) && (!ast_strlen_zero(testid))) { 00358 /* Got a Test ID! Whoo hoo! */ 00359 /* Make the directory to hold the test results in case it's not there */ 00360 snprintf(fn, sizeof(fn), "%s/testresults", ast_config_AST_LOG_DIR); 00361 mkdir(fn, 0777); 00362 snprintf(fn, sizeof(fn), "%s/testresults/%s-server.txt", ast_config_AST_LOG_DIR, testid); 00363 if ((f = fopen(fn, "w+"))) { 00364 setlinebuf(f); 00365 fprintf(f, "SERVERCHAN: %s\n", chan->name); 00366 fprintf(f, "SERVERTEST ID: %s\n", testid); 00367 fprintf(f, "ANSWER: PASS\n"); 00368 ast_log(LOG_DEBUG, "Processing Test ID '%s'\n", testid); 00369 res = ast_safe_sleep(chan, 1000); 00370 if (!res) { 00371 /* Step 1: Send "1" */ 00372 if (option_debug) 00373 ast_log(LOG_DEBUG, "TestServer: 1. Send DTMF 1\n"); 00374 res = ast_dtmf_stream(chan, NULL, "1", 0); 00375 fprintf(f, "SEND DTMF 1: %s\n", (res < 0) ? "FAIL" : "PASS"); 00376 if (res > 0) 00377 res = 0; 00378 } 00379 if (!res) { 00380 /* Step 2: Wait for "2" */ 00381 if (option_debug) 00382 ast_log(LOG_DEBUG, "TestServer: 2. Wait DTMF 2\n"); 00383 res = ast_waitfordigit(chan, 3000); 00384 fprintf(f, "WAIT DTMF 2: %s\n", (res != '2') ? "FAIL" : "PASS"); 00385 if (res == '2') 00386 res = 0; 00387 else 00388 res = -1; 00389 } 00390 if (!res) { 00391 /* Step 3: Measure noise */ 00392 if (option_debug) 00393 ast_log(LOG_DEBUG, "TestServer: 3. Measure noise\n"); 00394 res = measurenoise(chan, 6000, "TestServer"); 00395 fprintf(f, "MEASURENOISE: %s (%d)\n", (res < 0) ? "FAIL" : "PASS", res); 00396 if (res > 0) 00397 res = 0; 00398 } 00399 if (!res) { 00400 /* Step 4: Send "4" */ 00401 if (option_debug) 00402 ast_log(LOG_DEBUG, "TestServer: 4. Send DTMF 4\n"); 00403 res = ast_dtmf_stream(chan, NULL, "4", 0); 00404 fprintf(f, "SEND DTMF 4: %s\n", (res < 0) ? "FAIL" : "PASS"); 00405 if (res > 0) 00406 res = 0; 00407 } 00408 00409 if (!res) { 00410 /* Step 5: Wait one second */ 00411 if (option_debug) 00412 ast_log(LOG_DEBUG, "TestServer: 5. Wait one second\n"); 00413 res = ast_safe_sleep(chan, 1000); 00414 fprintf(f, "WAIT 1 SEC: %s\n", (res < 0) ? "FAIL" : "PASS"); 00415 if (res > 0) 00416 res = 0; 00417 } 00418 00419 if (!res) { 00420 /* Step 6: Measure noise */ 00421 if (option_debug) 00422 ast_log(LOG_DEBUG, "TestServer: 6. Measure tone\n"); 00423 res = measurenoise(chan, 4000, "TestServer"); 00424 fprintf(f, "MEASURETONE: %s (%d)\n", (res < 0) ? "FAIL" : "PASS", res); 00425 if (res > 0) 00426 res = 0; 00427 } 00428 00429 if (!res) { 00430 /* Step 7: Send "5" */ 00431 if (option_debug) 00432 ast_log(LOG_DEBUG, "TestServer: 7. Send DTMF 5\n"); 00433 res = ast_dtmf_stream(chan, NULL, "5", 0); 00434 fprintf(f, "SEND DTMF 5: %s\n", (res < 0) ? "FAIL" : "PASS"); 00435 if (res > 0) 00436 res = 0; 00437 } 00438 00439 if (!res) { 00440 /* Step 8: Transmit tone noise */ 00441 if (option_debug) 00442 ast_log(LOG_DEBUG, "TestServer: 8. Transmit tone\n"); 00443 res = sendnoise(chan, 6000); 00444 fprintf(f, "SENDTONE: %s\n", (res < 0) ? "FAIL" : "PASS"); 00445 } 00446 00447 if (!res || (res == '7')) { 00448 /* Step 9: Wait for "7" */ 00449 if (option_debug) 00450 ast_log(LOG_DEBUG, "TestServer: 9. Wait DTMF 7\n"); 00451 if (!res) 00452 res = ast_waitfordigit(chan, 3000); 00453 fprintf(f, "WAIT DTMF 7: %s\n", (res != '7') ? "FAIL" : "PASS"); 00454 if (res == '7') 00455 res = 0; 00456 else 00457 res = -1; 00458 } 00459 if (!res) 00460 res = ast_safe_sleep(chan, 1000); 00461 if (!res) { 00462 /* Step 10: Send "8" */ 00463 if (option_debug) 00464 ast_log(LOG_DEBUG, "TestServer: 10. Send DTMF 8\n"); 00465 res = ast_dtmf_stream(chan, NULL, "8", 0); 00466 fprintf(f, "SEND DTMF 8: %s\n", (res < 0) ? "FAIL" : "PASS"); 00467 if (res > 0) 00468 res = 0; 00469 } 00470 if (!res) { 00471 /* Step 11: Wait for hangup to arrive! */ 00472 if (option_debug) 00473 ast_log(LOG_DEBUG, "TestServer: 11. Waiting for hangup\n"); 00474 res = ast_safe_sleep(chan, 10000); 00475 fprintf(f, "WAIT HANGUP: %s\n", (res < 0) ? "PASS" : "FAIL"); 00476 } 00477 00478 ast_log(LOG_NOTICE, "-- TEST COMPLETE--\n"); 00479 fprintf(f, "-- END TEST--\n"); 00480 fclose(f); 00481 res = -1; 00482 } else 00483 res = -1; 00484 } else { 00485 ast_log(LOG_NOTICE, "Did not read a test ID on '%s'\n", chan->name); 00486 res = -1; 00487 } 00488 ast_module_user_remove(u); 00489 return res; 00490 }
static int unload_module | ( | void | ) | [static] |
Definition at line 492 of file app_test.c.
References ast_module_user_hangup_all, and ast_unregister_application().
00493 { 00494 int res; 00495 00496 res = ast_unregister_application(testc_app); 00497 res |= ast_unregister_application(tests_app); 00498 00499 ast_module_user_hangup_all(); 00500 00501 return res; 00502 }
char* testc_app = "TestClient" [static] |
Definition at line 61 of file app_test.c.
char* testc_descrip [static] |
Initial value:
"TestClient(testid): Executes test client with given testid.\n" "Results stored in /var/log/asterisk/testreports/<testid>-client.txt"
Definition at line 57 of file app_test.c.
char* testc_synopsis = "Execute Interface Test Client" [static] |
Definition at line 62 of file app_test.c.
char* tests_app = "TestServer" [static] |
Definition at line 54 of file app_test.c.
char* tests_descrip [static] |
Initial value:
"TestServer(): Perform test server function and write call report.\n" "Results stored in /var/log/asterisk/testreports/<testid>-server.txt"
Definition at line 51 of file app_test.c.
char* tests_synopsis = "Execute Interface Test Server" [static] |
Definition at line 55 of file app_test.c.