~ubuntu-branches/ubuntu/utopic/sflphone/utopic-proposed

« back to all changes in this revision

Viewing changes to daemon/libs/pjproject-2.0.1/pjsip/src/test/test.c

  • Committer: Package Import Robot
  • Author(s): Mark Purcell
  • Date: 2013-06-30 11:40:56 UTC
  • mfrom: (4.1.18 saucy-proposed)
  • Revision ID: package-import@ubuntu.com-20130630114056-0np50jkyqo6vnmii
Tags: 1.2.3-2
* changeset_r92d62cfc54732bbbcfff2b1d36c096b120b981a5.diff 
  - fixes automatic endian detection 
* Update Vcs: fixes vcs-field-not-canonical

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: test.c 3553 2011-05-05 06:14:19Z nanang $ */
 
2
/*
 
3
 * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
 
4
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
 
5
 *
 
6
 * This program is free software; you can redistribute it and/or modify
 
7
 * it under the terms of the GNU General Public License as published by
 
8
 * the Free Software Foundation; either version 2 of the License, or
 
9
 * (at your option) any later version.
 
10
 *
 
11
 * This program is distributed in the hope that it will be useful,
 
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 * GNU General Public License for more details.
 
15
 *
 
16
 * You should have received a copy of the GNU General Public License
 
17
 * along with this program; if not, write to the Free Software
 
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
19
 */
 
20
 
 
21
 
 
22
#include "test.h"
 
23
#include <pjlib.h>
 
24
#include <pjlib-util.h>
 
25
#include <pjsip.h>
 
26
 
 
27
#define THIS_FILE   "test.c"
 
28
 
 
29
#define DO_TEST(test)   do { \
 
30
                            PJ_LOG(3, (THIS_FILE, "Running %s...", #test));  \
 
31
                            rc = test; \
 
32
                            PJ_LOG(3, (THIS_FILE,  \
 
33
                                       "%s(%d)",  \
 
34
                                       (rc ? "..ERROR" : "..success"), rc)); \
 
35
                            if (rc!=0) goto on_return; \
 
36
                        } while (0)
 
37
 
 
38
#define DO_TSX_TEST(test, param) \
 
39
                        do { \
 
40
                            PJ_LOG(3, (THIS_FILE, "Running %s(%s)...", #test, (param)->tp_type));  \
 
41
                            rc = test(param); \
 
42
                            PJ_LOG(3, (THIS_FILE,  \
 
43
                                       "%s(%d)",  \
 
44
                                       (rc ? "..ERROR" : "..success"), rc)); \
 
45
                            if (rc!=0) goto on_return; \
 
46
                        } while (0)
 
47
 
 
48
 
 
49
pjsip_endpoint *endpt;
 
50
int log_level = 3;
 
51
int param_log_decor = PJ_LOG_HAS_NEWLINE | PJ_LOG_HAS_TIME |
 
52
                      PJ_LOG_HAS_MICRO_SEC;
 
53
 
 
54
static pj_oshandle_t fd_report;
 
55
const char *system_name = "Unknown";
 
56
static char buf[1024];
 
57
 
 
58
void app_perror(const char *msg, pj_status_t rc)
 
59
{
 
60
    char errbuf[256];
 
61
 
 
62
    PJ_CHECK_STACK();
 
63
 
 
64
    pj_strerror(rc, errbuf, sizeof(errbuf));
 
65
    PJ_LOG(3,(THIS_FILE, "%s: [pj_status_t=%d] %s", msg, rc, errbuf));
 
66
 
 
67
}
 
68
 
 
69
void flush_events(unsigned duration)
 
70
{
 
71
    pj_time_val stop_time;
 
72
 
 
73
    pj_gettimeofday(&stop_time);
 
74
    stop_time.msec += duration;
 
75
    pj_time_val_normalize(&stop_time);
 
76
 
 
77
    /* Process all events for the specified duration. */
 
78
    for (;;) {
 
79
        pj_time_val timeout = {0, 1}, now;
 
80
 
 
81
        pjsip_endpt_handle_events(endpt, &timeout);
 
82
 
 
83
        pj_gettimeofday(&now);
 
84
        if (PJ_TIME_VAL_GTE(now, stop_time))
 
85
            break;
 
86
    }
 
87
}
 
88
 
 
89
pj_status_t register_static_modules(pj_size_t *count, pjsip_module **modules)
 
90
{
 
91
    PJ_UNUSED_ARG(modules);
 
92
 
 
93
    *count = 0;
 
94
    return PJ_SUCCESS;
 
95
}
 
96
 
 
97
static pj_status_t init_report(void)
 
98
{
 
99
    char tmp[80];
 
100
    pj_time_val timestamp;
 
101
    pj_parsed_time date_time;
 
102
    pj_ssize_t len;
 
103
    pj_status_t status;
 
104
 
 
105
    pj_ansi_sprintf(tmp, "pjsip-static-bench-%s-%s.htm", PJ_OS_NAME, PJ_CC_NAME);
 
106
 
 
107
    status = pj_file_open(NULL, tmp, PJ_O_WRONLY, &fd_report);
 
108
    if (status != PJ_SUCCESS)
 
109
        return status;
 
110
 
 
111
    /* Title */
 
112
    len = pj_ansi_sprintf(buf, "<HTML>\n"
 
113
                               " <HEAD>\n"
 
114
                               "  <TITLE>PJSIP %s (%s) - Static Benchmark</TITLE>\n"
 
115
                               " </HEAD>\n"
 
116
                               "<BODY>\n"
 
117
                               "\n",
 
118
                               PJ_VERSION,
 
119
                               (PJ_DEBUG ? "Debug" : "Release"));
 
120
    pj_file_write(fd_report, buf, &len);
 
121
 
 
122
 
 
123
    /* Title */
 
124
    len = pj_ansi_sprintf(buf, "<H1>PJSIP %s (%s) - Static Benchmark</H1>\n",
 
125
                               PJ_VERSION,
 
126
                               (PJ_DEBUG ? "Debug" : "Release"));
 
127
    pj_file_write(fd_report, buf, &len);
 
128
 
 
129
    len = pj_ansi_sprintf(buf, "<P>Below is the benchmark result generated "
 
130
                               "by <b>test-pjsip</b> program. The program "
 
131
                               "is single-threaded only.</P>\n");
 
132
    pj_file_write(fd_report, buf, &len);
 
133
 
 
134
 
 
135
    /* Write table heading */
 
136
    len = pj_ansi_sprintf(buf, "<TABLE border=\"1\" cellpadding=\"4\">\n"
 
137
                               "  <TR><TD bgColor=\"aqua\" align=\"center\">Variable</TD>\n"
 
138
                               "      <TD bgColor=\"aqua\" align=\"center\">Value</TD>\n"
 
139
                               "      <TD bgColor=\"aqua\" align=\"center\">Description</TD>\n"
 
140
                               "  </TR>\n");
 
141
    pj_file_write(fd_report, buf, &len);
 
142
 
 
143
 
 
144
    /* Write version */
 
145
    report_sval("version", PJ_VERSION, "", "PJLIB/PJSIP version");
 
146
 
 
147
 
 
148
    /* Debug or release */
 
149
    report_sval("build-type", (PJ_DEBUG ? "Debug" : "Release"), "", "Build type");
 
150
 
 
151
 
 
152
    /* Write timestamp */
 
153
    pj_gettimeofday(&timestamp);
 
154
    report_ival("timestamp", timestamp.sec, "", "System timestamp of the test");
 
155
 
 
156
 
 
157
    /* Write time of day */
 
158
    pj_time_decode(&timestamp, &date_time);
 
159
    len = pj_ansi_sprintf(tmp, "%04d-%02d-%02d %02d:%02d:%02d",
 
160
                               date_time.year, date_time.mon+1, date_time.day,
 
161
                               date_time.hour, date_time.min, date_time.sec);
 
162
    report_sval("date-time", tmp, "", "Date/time of the test");
 
163
 
 
164
 
 
165
    /* Write System */
 
166
    report_sval("system", system_name, "", "System description");
 
167
 
 
168
 
 
169
    /* Write OS type */
 
170
    report_sval("os-family", PJ_OS_NAME, "", "Operating system family");
 
171
 
 
172
 
 
173
    /* Write CC name */
 
174
    len = pj_ansi_sprintf(tmp, "%s-%d.%d.%d", PJ_CC_NAME,
 
175
                          PJ_CC_VER_1, PJ_CC_VER_2, PJ_CC_VER_2);
 
176
    report_sval("cc-name", tmp, "", "Compiler name and version");
 
177
 
 
178
 
 
179
    return PJ_SUCCESS;
 
180
}
 
181
 
 
182
void report_sval(const char *name, const char* value, const char *valname,
 
183
                 const char *desc)
 
184
{
 
185
    pj_ssize_t len;
 
186
 
 
187
    len = pj_ansi_sprintf(buf, "  <TR><TD><TT>%s</TT></TD>\n"
 
188
                               "      <TD align=\"right\"><B>%s %s</B></TD>\n"
 
189
                               "      <TD>%s</TD>\n"
 
190
                               "  </TR>\n",
 
191
                               name, value, valname, desc);
 
192
    pj_file_write(fd_report, buf, &len);
 
193
}
 
194
 
 
195
 
 
196
void report_ival(const char *name, int value, const char *valname,
 
197
                 const char *desc)
 
198
{
 
199
    pj_ssize_t len;
 
200
 
 
201
    len = pj_ansi_sprintf(buf, "  <TR><TD><TT>%s</TT></TD>\n"
 
202
                               "      <TD align=\"right\"><B>%d %s</B></TD>\n"
 
203
                               "      <TD>%s</TD>\n"
 
204
                               "  </TR>\n",
 
205
                               name, value, valname, desc);
 
206
    pj_file_write(fd_report, buf, &len);
 
207
 
 
208
}
 
209
 
 
210
static void close_report(void)
 
211
{
 
212
    pj_ssize_t len;
 
213
 
 
214
    if (fd_report) {
 
215
        len = pj_ansi_sprintf(buf, "</TABLE>\n</BODY>\n</HTML>\n");
 
216
        pj_file_write(fd_report, buf, &len);
 
217
 
 
218
        pj_file_close(fd_report);
 
219
    }
 
220
}
 
221
 
 
222
 
 
223
int test_main(void)
 
224
{
 
225
    pj_status_t rc;
 
226
    pj_caching_pool caching_pool;
 
227
    const char *filename;
 
228
    unsigned tsx_test_cnt=0;
 
229
    struct tsx_test_param tsx_test[10];
 
230
    pj_status_t status;
 
231
#if INCLUDE_TSX_TEST
 
232
    unsigned i;
 
233
    pjsip_transport *tp;
 
234
#if PJ_HAS_TCP
 
235
    pjsip_tpfactory *tpfactory;
 
236
#endif  /* PJ_HAS_TCP */
 
237
#endif  /* INCLUDE_TSX_TEST */
 
238
    int line;
 
239
 
 
240
    pj_log_set_level(log_level);
 
241
    pj_log_set_decor(param_log_decor);
 
242
 
 
243
    if ((rc=pj_init()) != PJ_SUCCESS) {
 
244
        app_perror("pj_init", rc);
 
245
        return rc;
 
246
    }
 
247
 
 
248
    if ((rc=pjlib_util_init()) != PJ_SUCCESS) {
 
249
        app_perror("pj_init", rc);
 
250
        return rc;
 
251
    }
 
252
 
 
253
    status = init_report();
 
254
    if (status != PJ_SUCCESS)
 
255
        return status;
 
256
 
 
257
    pj_dump_config();
 
258
 
 
259
    pj_caching_pool_init( &caching_pool, &pj_pool_factory_default_policy,
 
260
                          PJSIP_TEST_MEM_SIZE );
 
261
 
 
262
    rc = pjsip_endpt_create(&caching_pool.factory, "endpt", &endpt);
 
263
    if (rc != PJ_SUCCESS) {
 
264
        app_perror("pjsip_endpt_create", rc);
 
265
        pj_caching_pool_destroy(&caching_pool);
 
266
        return rc;
 
267
    }
 
268
 
 
269
    PJ_LOG(3,(THIS_FILE,""));
 
270
 
 
271
    /* Init logger module. */
 
272
    init_msg_logger();
 
273
    msg_logger_set_enabled(1);
 
274
 
 
275
    /* Start transaction layer module. */
 
276
    rc = pjsip_tsx_layer_init_module(endpt);
 
277
    if (rc != PJ_SUCCESS) {
 
278
        app_perror("   Error initializing transaction module", rc);
 
279
        goto on_return;
 
280
    }
 
281
 
 
282
    /* Create loop transport. */
 
283
    rc = pjsip_loop_start(endpt, NULL);
 
284
    if (rc != PJ_SUCCESS) {
 
285
        app_perror("   error: unable to create datagram loop transport",
 
286
                   rc);
 
287
        goto on_return;
 
288
    }
 
289
    tsx_test[tsx_test_cnt].port = 5060;
 
290
    tsx_test[tsx_test_cnt].tp_type = "loop-dgram";
 
291
    tsx_test[tsx_test_cnt].type = PJSIP_TRANSPORT_LOOP_DGRAM;
 
292
    ++tsx_test_cnt;
 
293
 
 
294
 
 
295
#if INCLUDE_URI_TEST
 
296
    DO_TEST(uri_test());
 
297
#endif
 
298
 
 
299
#if INCLUDE_MSG_TEST
 
300
    DO_TEST(msg_test());
 
301
    DO_TEST(msg_err_test());
 
302
#endif
 
303
 
 
304
#if INCLUDE_MULTIPART_TEST
 
305
    DO_TEST(multipart_test());
 
306
#endif
 
307
 
 
308
#if INCLUDE_TXDATA_TEST
 
309
    DO_TEST(txdata_test());
 
310
#endif
 
311
 
 
312
#if INCLUDE_TSX_BENCH
 
313
    DO_TEST(tsx_bench());
 
314
#endif
 
315
 
 
316
#if INCLUDE_UDP_TEST
 
317
    DO_TEST(transport_udp_test());
 
318
#endif
 
319
 
 
320
#if INCLUDE_LOOP_TEST
 
321
    DO_TEST(transport_loop_test());
 
322
#endif
 
323
 
 
324
#if INCLUDE_TCP_TEST
 
325
    DO_TEST(transport_tcp_test());
 
326
#endif
 
327
 
 
328
#if INCLUDE_RESOLVE_TEST
 
329
    DO_TEST(resolve_test());
 
330
#endif
 
331
 
 
332
 
 
333
#if INCLUDE_TSX_TEST
 
334
    status = pjsip_udp_transport_start(endpt, NULL, NULL, 1,  &tp);
 
335
    if (status == PJ_SUCCESS) {
 
336
        tsx_test[tsx_test_cnt].port = tp->local_name.port;
 
337
        tsx_test[tsx_test_cnt].tp_type = "udp";
 
338
        tsx_test[tsx_test_cnt].type = PJSIP_TRANSPORT_UDP;
 
339
        ++tsx_test_cnt;
 
340
    }
 
341
 
 
342
#if PJ_HAS_TCP
 
343
    status = pjsip_tcp_transport_start(endpt, NULL, 1, &tpfactory);
 
344
    if (status == PJ_SUCCESS) {
 
345
        tsx_test[tsx_test_cnt].port = tpfactory->addr_name.port;
 
346
        tsx_test[tsx_test_cnt].tp_type = "tcp";
 
347
        tsx_test[tsx_test_cnt].type = PJSIP_TRANSPORT_TCP;
 
348
        ++tsx_test_cnt;
 
349
    } else {
 
350
        app_perror("Unable to create TCP", status);
 
351
        rc = -4;
 
352
        goto on_return;
 
353
    }
 
354
#endif
 
355
 
 
356
 
 
357
    for (i=0; i<tsx_test_cnt; ++i) {
 
358
        DO_TSX_TEST(tsx_basic_test, &tsx_test[i]);
 
359
        DO_TSX_TEST(tsx_uac_test, &tsx_test[i]);
 
360
        DO_TSX_TEST(tsx_uas_test, &tsx_test[i]);
 
361
    }
 
362
#endif
 
363
 
 
364
#if INCLUDE_INV_OA_TEST
 
365
    DO_TEST(inv_offer_answer_test());
 
366
#endif
 
367
 
 
368
#if INCLUDE_REGC_TEST
 
369
    DO_TEST(regc_test());
 
370
#endif
 
371
 
 
372
 
 
373
on_return:
 
374
    flush_events(500);
 
375
 
 
376
    /* Dumping memory pool usage */
 
377
    PJ_LOG(3,(THIS_FILE, "Peak memory size=%u MB",
 
378
                         caching_pool.peak_used_size / 1000000));
 
379
 
 
380
    pjsip_endpt_destroy(endpt);
 
381
    pj_caching_pool_destroy(&caching_pool);
 
382
 
 
383
    PJ_LOG(3,(THIS_FILE, ""));
 
384
 
 
385
    pj_thread_get_stack_info(pj_thread_this(), &filename, &line);
 
386
    PJ_LOG(3,(THIS_FILE, "Stack max usage: %u, deepest: %s:%u",
 
387
                      pj_thread_get_stack_max_usage(pj_thread_this()),
 
388
                      filename, line));
 
389
    if (rc == 0)
 
390
        PJ_LOG(3,(THIS_FILE, "Looks like everything is okay!.."));
 
391
    else
 
392
        PJ_LOG(3,(THIS_FILE, "Test completed with error(s)"));
 
393
 
 
394
    report_ival("test-status", rc, "", "Overall test status/result (0==success)");
 
395
    close_report();
 
396
    return rc;
 
397
}