Skip to content

Commit d6b892f

Browse files
committed
Fixing failure in transport_loop_test(), first in loop_resolve_error(), presumably because there are other loop transport around when the test is run. Solution are: 1) make the test exclusive for now, 2) fix the cleanup of loop transport in other tests. Then there is failure in transport_rt_test(), because it gets loop transport from other test that is being shutdown. Sneakily add pjsip_tpmgr_get_transport_count_by_type() that's useful for debugging.
1 parent 0246ac9 commit d6b892f

File tree

12 files changed

+205
-66
lines changed

12 files changed

+205
-66
lines changed

pjlib/src/pjlib-test/fifobuf.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,6 @@ static int fifobuf_misc_test()
137137
void *buffer;
138138
int i;
139139

140-
i = fifobuf_size_test();
141-
if (i != 0)
142-
return i;
143-
144140
pool = pj_pool_create(mem, NULL, SIZE+256, 0, NULL);
145141
PJ_TEST_NOT_NULL(pool, NULL, return -10);
146142

pjsip/include/pjsip/sip_transport.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,6 +1302,19 @@ PJ_DECL(pj_status_t) pjsip_tpmgr_find_local_addr2(pjsip_tpmgr *tpmgr,
13021302
PJ_DECL(unsigned) pjsip_tpmgr_get_transport_count(pjsip_tpmgr *mgr);
13031303

13041304

1305+
/**
1306+
* Return number of transports of the specified type currently registered to
1307+
* the transport manager.
1308+
*
1309+
* @param mgr The transport manager.
1310+
* @param type Transport type (can be from pjsip_transport_type_e enum)
1311+
*
1312+
* @return Number of transports.
1313+
*/
1314+
PJ_DECL(unsigned) pjsip_tpmgr_get_transport_count_by_type(pjsip_tpmgr *mgr,
1315+
int type);
1316+
1317+
13051318
/**
13061319
* Destroy a transport manager. Normally application doesn't need to call
13071320
* this function directly, since a transport manager will be created and

pjsip/src/pjsip/sip_transport.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1897,6 +1897,12 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_find_local_addr( pjsip_tpmgr *tpmgr,
18971897
* manager.
18981898
*/
18991899
PJ_DEF(unsigned) pjsip_tpmgr_get_transport_count(pjsip_tpmgr *mgr)
1900+
{
1901+
return pjsip_tpmgr_get_transport_count_by_type(mgr, -1);
1902+
}
1903+
1904+
PJ_DEF(unsigned) pjsip_tpmgr_get_transport_count_by_type(pjsip_tpmgr *mgr,
1905+
int type)
19001906
{
19011907
pj_hash_iterator_t itr_val;
19021908
pj_hash_iterator_t *itr;
@@ -1907,7 +1913,15 @@ PJ_DEF(unsigned) pjsip_tpmgr_get_transport_count(pjsip_tpmgr *mgr)
19071913
itr = pj_hash_first(mgr->table, &itr_val);
19081914
while (itr) {
19091915
transport *tp_entry = (transport *)pj_hash_this(mgr->table, itr);
1910-
nr_of_transports += (int)pj_list_size(tp_entry);
1916+
if (type<0) {
1917+
nr_of_transports += (int)pj_list_size(tp_entry);
1918+
} else {
1919+
transport *node = tp_entry->next;
1920+
for (; node!=tp_entry; node=node->next) {
1921+
if (tp_entry->tp->key.type==type)
1922+
++nr_of_transports;
1923+
}
1924+
}
19111925
itr = pj_hash_next(mgr->table, itr);
19121926
}
19131927

pjsip/src/test/dns_test.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,11 @@ static int test_resolve(const char *title,
331331
int port,
332332
pjsip_server_addresses *ref)
333333
{
334+
enum {
335+
TIMEOUT_SECS = 60
336+
};
334337
pjsip_host_info dest;
338+
pj_time_val timeout;
335339
struct result result;
336340

337341
PJ_LOG(3,(THIS_FILE, " test_resolve(): %s", title));
@@ -343,14 +347,22 @@ static int test_resolve(const char *title,
343347

344348
result.status = 0x12345678;
345349

350+
pj_gettimeofday(&timeout);
351+
timeout.sec += TIMEOUT_SECS;
352+
346353
pjsip_endpt_resolve(endpt, pool, &dest, &result, &cb);
347354

348355
while (result.status == 0x12345678) {
349356
int i = 0;
350357
pj_time_val timeout = { 1, 0 };
358+
pj_time_val now;
359+
351360
pjsip_endpt_handle_events(endpt, &timeout);
352361
if (i == 1)
353362
pj_dns_resolver_dump(pjsip_endpt_get_resolver(endpt), PJ_TRUE);
363+
364+
pj_gettimeofday(&now);
365+
PJ_TEST_TRUE(PJ_TIME_VAL_LT(now, timeout), NULL, return 12345678);
354366
}
355367

356368
if (result.status != PJ_SUCCESS) {

pjsip/src/test/test.c

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,40 @@ void flush_events(unsigned duration)
6868
}
6969
}
7070

71+
/* Wait until there is no loop transport instance */
72+
pjsip_transport *wait_loop_transport_clear(int secs)
73+
{
74+
pj_time_val timeout;
75+
76+
pj_gettimeofday(&timeout);
77+
timeout.sec += secs;
78+
79+
for (;;) {
80+
pj_sockaddr_in addr;
81+
pjsip_transport *loop = NULL;
82+
pj_time_val now;
83+
pj_status_t status;
84+
85+
loop = NULL;
86+
pj_bzero(&addr, sizeof(addr));
87+
status = pjsip_endpt_acquire_transport(endpt,
88+
PJSIP_TRANSPORT_LOOP_DGRAM,
89+
&addr, sizeof(addr), NULL,
90+
&loop);
91+
if (status!=PJ_SUCCESS)
92+
return NULL;
93+
94+
pj_gettimeofday(&now);
95+
if (PJ_TIME_VAL_GTE(now, timeout)) {
96+
return loop;
97+
}
98+
99+
pjsip_transport_dec_ref(loop);
100+
loop = NULL;
101+
flush_events(500);
102+
}
103+
}
104+
71105
pj_status_t register_static_modules(pj_size_t *count, pjsip_module **modules)
72106
{
73107
PJ_UNUSED_ARG(modules);
@@ -329,14 +363,19 @@ int test_main(int argc, char *argv[])
329363
UT_ADD_TEST(&test_app.ut_app, transport_udp_test, 0);
330364
#endif
331365

332-
#if INCLUDE_LOOP_TEST
333-
UT_ADD_TEST(&test_app.ut_app, transport_loop_test, 0);
334-
#endif
335-
336366
#if INCLUDE_TCP_TEST
337367
UT_ADD_TEST(&test_app.ut_app, transport_tcp_test, 0);
338368
#endif
339369

370+
/* Loop test needs to be exclusive, because there must NOT be any other
371+
* loop transport otherwise some test will fail (e.g. sending will
372+
* fallback to that transport)
373+
*/
374+
#if INCLUDE_LOOP_TEST
375+
UT_ADD_TEST(&test_app.ut_app, transport_loop_test,
376+
PJ_TEST_EXCLUSIVE | PJ_TEST_KEEP_LAST);
377+
#endif
378+
340379
/*
341380
* Better be last because it recreates the endpt
342381
*/

pjsip/src/test/test.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ void app_perror(const char *msg, pj_status_t status);
126126
int init_msg_logger(void);
127127
int msg_logger_set_enabled(pj_bool_t enabled);
128128
void flush_events(unsigned duration);
129-
129+
pjsip_transport *wait_loop_transport_clear(int secs);
130130

131131
void report_ival(const char *name, int value, const char *valname, const char *desc);
132132
void report_sval(const char *name, const char* value, const char *valname, const char *desc);

pjsip/src/test/transport_loop_test.c

Lines changed: 58 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ int transport_loop_multi_test(void)
109109
pj_bzero(loops, sizeof(loops));
110110
for (i=0; i<N; ++i) {
111111
PJ_TEST_SUCCESS(pjsip_loop_start(endpt, &loops[i]), NULL, ERR(-10));
112+
pjsip_transport_add_ref(loops[i]);
112113
}
113114

114115
for (i=0; i<N; ++i) {
@@ -158,14 +159,17 @@ int transport_loop_multi_test(void)
158159

159160
on_return:
160161
for (i=0; i<N; ++i) {
161-
if (loops[i])
162+
if (loops[i]) {
163+
/* Order must be shutdown then dec_ref so it gets destroyed */
162164
pjsip_transport_shutdown(loops[i]);
165+
pjsip_transport_dec_ref(loops[i]);
166+
}
163167
}
164168
if (loop_tester_mod.id != -1) {
165169
pjsip_endpt_unregister_module(endpt, &loop_tester_mod);
166170
}
167171
/* let transport destroy run its course */
168-
flush_events(100);
172+
flush_events(500);
169173
return rc;
170174
#undef ERR
171175
}
@@ -184,7 +188,7 @@ static void send_cb(pjsip_send_state *st, pj_ssize_t sent, pj_bool_t *cont)
184188
}
185189
}
186190

187-
static int loop_resolve_error()
191+
static int loop_resolve_error(pj_bool_t disable_no_selector)
188192
{
189193
pjsip_transport *loop = NULL;
190194
pj_sockaddr_in addr;
@@ -206,9 +210,12 @@ static int loop_resolve_error()
206210
return -210;
207211
}
208212

209-
url = pj_str("sip:bob@unresolved-host");
213+
url = pj_str("sip:bob@unresolved-host;transport=loop-dgram");
210214

211215
for (i=0; i<2; ++i) {
216+
if (i==0 && disable_no_selector)
217+
continue;
218+
212219
/* variant a: without tp_selector */
213220
status = pjsip_endpt_create_request( endpt, &pjsip_options_method,
214221
&url, &url, &url, NULL, NULL, -1,
@@ -235,14 +242,20 @@ static int loop_resolve_error()
235242
/* Success! (we're expecting error and got immediate error)*/
236243
loop_resolve_status = 0;
237244
} else {
238-
flush_events(500);
245+
unsigned j;
246+
247+
for (j=0; j<40 && loop_resolve_status==PJ_EPENDING; ++j)
248+
flush_events(500);
249+
239250
if (loop_resolve_status!=PJ_EPENDING && loop_resolve_status!=PJ_SUCCESS) {
240251
/* Success! (we're expecting error in callback)*/
241252
//PJ_PERROR(3, (THIS_FILE, loop_resolve_status,
242253
// " correctly got error"));
243254
loop_resolve_status = 0;
244255
} else {
245-
PJ_LOG(3,(THIS_FILE, " error: expecting error but status=%d", status));
256+
PJ_LOG(3,(THIS_FILE,
257+
" error (variant %d): expecting error but loop_resolve_status=%d",
258+
i, loop_resolve_status));
246259
loop_resolve_status = -240;
247260
goto on_return;
248261
}
@@ -255,23 +268,45 @@ static int loop_resolve_error()
255268
return loop_resolve_status;
256269
}
257270

258-
static int datagram_loop_test()
271+
int transport_loop_test()
259272
{
260273
enum { LOOP = 8 };
261274
pjsip_transport *loop = NULL;
262275
char host_port_transport[64];
276+
pj_bool_t disable_no_selector = PJ_FALSE;
263277
int i, pkt_lost;
264278
int status;
265279
long ref_cnt;
266280
int rtt[LOOP], min_rtt;
267281

268-
PJ_LOG(3,(THIS_FILE, "testing datagram loop transport"));
269282

270-
/* Test acquire transport. */
271-
PJ_TEST_SUCCESS(pjsip_loop_start(endpt, &loop), NULL, return -10);
272-
pjsip_transport_add_ref(loop);
273-
274-
pjsip_loop_set_failure(loop, 0, 0);
283+
PJ_LOG(3,(THIS_FILE, " Loop transport count: %d",
284+
pjsip_tpmgr_get_transport_count_by_type(
285+
pjsip_endpt_get_tpmgr(endpt),
286+
PJSIP_TRANSPORT_LOOP_DGRAM)));
287+
288+
/* if there is another transport, wait sometime until it's gone */
289+
loop = wait_loop_transport_clear(10);
290+
291+
if (loop) {
292+
/* We are not supposed to have another instance of loop transport, but
293+
* we found one. If there are more than one, test will fail. Otherwise
294+
* test should succeed
295+
*/
296+
PJ_LOG(2,(THIS_FILE,
297+
"Warning: found %d loop transport instances",
298+
pjsip_tpmgr_get_transport_count_by_type(
299+
pjsip_endpt_get_tpmgr(endpt),
300+
PJSIP_TRANSPORT_LOOP_DGRAM)));
301+
disable_no_selector = PJ_TRUE;
302+
pjsip_loop_set_discard(loop, 0, NULL);
303+
pjsip_loop_set_failure(loop, 0, NULL);
304+
pjsip_loop_set_delay(loop, 0);
305+
} else {
306+
PJ_TEST_EQ(loop, NULL, NULL, return -2);
307+
PJ_TEST_SUCCESS(pjsip_loop_start(endpt, &loop), NULL, return -3);
308+
pjsip_transport_add_ref(loop);
309+
}
275310

276311
pj_ansi_snprintf(host_port_transport, sizeof(host_port_transport),
277312
"%.*s:%d;transport=loop-dgram",
@@ -282,6 +317,11 @@ static int datagram_loop_test()
282317
/* Get initial reference counter */
283318
ref_cnt = pj_atomic_get(loop->ref_cnt);
284319

320+
/* Resolve error */
321+
status = loop_resolve_error(disable_no_selector);
322+
if (status)
323+
goto on_return;
324+
285325
/* Test basic transport attributes */
286326
status = generic_transport_test(loop);
287327
if (status != PJ_SUCCESS)
@@ -295,11 +335,6 @@ static int datagram_loop_test()
295335
goto on_return;
296336
}
297337

298-
/* Resolve error */
299-
status = loop_resolve_error();
300-
if (status)
301-
goto on_return;
302-
303338
min_rtt = 0xFFFFFFF;
304339
for (i=0; i<LOOP; ++i)
305340
if (rtt[i] < min_rtt) min_rtt = rtt[i];
@@ -311,16 +346,15 @@ static int datagram_loop_test()
311346

312347

313348
/* Multi-threaded round-trip test. */
349+
pjsip_loop_set_discard(loop, 0, NULL);
350+
pjsip_loop_set_failure(loop, 0, NULL);
351+
pjsip_loop_set_delay(loop, 0);
314352
status = transport_rt_test(PJSIP_TRANSPORT_LOOP_DGRAM, loop,
315353
"130.0.0.1;transport=loop-dgram", &pkt_lost);
316354
if (status != 0)
317355
goto on_return;
318356

319-
if (pkt_lost != 0) {
320-
PJ_LOG(3,(THIS_FILE, " error: %d packet(s) was lost", pkt_lost));
321-
status = -40;
322-
goto on_return;
323-
}
357+
PJ_TEST_EQ(pkt_lost, 0, NULL, { status = -40; goto on_return;});
324358

325359
/* Put delay. */
326360
PJ_LOG(3,(THIS_FILE," setting network delay to 10 ms"));
@@ -333,11 +367,7 @@ static int datagram_loop_test()
333367
if (status != 0)
334368
goto on_return;
335369

336-
if (pkt_lost != 0) {
337-
PJ_LOG(3,(THIS_FILE, " error: %d packet(s) was lost", pkt_lost));
338-
status = -50;
339-
goto on_return;
340-
}
370+
PJ_TEST_EQ(pkt_lost, 0, NULL, { status = -50; goto on_return;});
341371

342372
/* Restore delay. */
343373
pjsip_loop_set_delay(loop, 0);
@@ -357,14 +387,3 @@ static int datagram_loop_test()
357387
pjsip_transport_dec_ref(loop);
358388
return status;
359389
}
360-
361-
int transport_loop_test(void)
362-
{
363-
int status;
364-
365-
status = datagram_loop_test();
366-
if (status != 0)
367-
return status;
368-
369-
return 0;
370-
}

0 commit comments

Comments
 (0)