Ignore:
Timestamp:
May 23, 2019 5:21:59 PM (5 years ago)
Author:
riza
Message:

Close #1019: Support for multiple listeners.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/test/transport_udp_test.c

    r3553 r6002  
    2525#define THIS_FILE   "transport_udp_test.c" 
    2626 
     27static pj_status_t multi_transport_test(pjsip_transport *tp[], unsigned num_tp) 
     28{ 
     29    pj_status_t status; 
     30    pj_uint16_t i = 0; 
     31    pj_str_t s; 
     32    pjsip_transport *udp_tp; 
     33    pj_sockaddr_in rem_addr;     
     34    pjsip_tpselector tp_sel; 
     35 
     36    for (;i<num_tp;++i) 
     37    { 
     38        pj_sockaddr_in addr; 
     39 
     40        pj_sockaddr_in_init(&addr, NULL, TEST_UDP_PORT+i); 
     41 
     42        /* Start UDP transport. */ 
     43        status = pjsip_udp_transport_start( endpt, &addr, NULL, 1, &udp_tp); 
     44        if (status != PJ_SUCCESS) { 
     45            app_perror("   Error: unable to start UDP transport", status); 
     46            return -110; 
     47        } 
     48 
     49        /* UDP transport must have initial reference counter set to 1. */ 
     50        if (pj_atomic_get(udp_tp->ref_cnt) != 1) 
     51            return -120; 
     52 
     53        /* Test basic transport attributes */ 
     54        status = generic_transport_test(udp_tp); 
     55        if (status != PJ_SUCCESS) 
     56            return status; 
     57 
     58        tp[i] = udp_tp; 
     59    } 
     60 
     61    for (i = 0; i < num_tp; ++i) { 
     62        udp_tp = tp[i]; 
     63        if (pj_atomic_get(udp_tp->ref_cnt) != 1) 
     64            return -130; 
     65    } 
     66 
     67    /* Acquire transport test without selector. */ 
     68    pj_sockaddr_in_init(&rem_addr, pj_cstr(&s, "1.1.1.1"), 80); 
     69    status = pjsip_endpt_acquire_transport(endpt, PJSIP_TRANSPORT_UDP, 
     70                                           &rem_addr, sizeof(rem_addr), 
     71                                           NULL, &udp_tp); 
     72    if (status != PJ_SUCCESS) 
     73        return -140; 
     74 
     75    for (i = 0; i < num_tp; ++i) { 
     76        if (udp_tp == tp[i]) { 
     77            break; 
     78        } 
     79    } 
     80    if (i == num_tp) 
     81        return -150; 
     82 
     83    pjsip_transport_dec_ref(udp_tp); 
     84 
     85    if (pj_atomic_get(udp_tp->ref_cnt) != 1) 
     86        return -160; 
     87 
     88    /* Acquire transport test with selector. */ 
     89    pj_bzero(&tp_sel, sizeof(tp_sel)); 
     90    tp_sel.type = PJSIP_TPSELECTOR_TRANSPORT; 
     91    tp_sel.u.transport = tp[num_tp-1]; 
     92    pj_sockaddr_in_init(&rem_addr, pj_cstr(&s, "1.1.1.1"), 80); 
     93    status = pjsip_endpt_acquire_transport(endpt, PJSIP_TRANSPORT_UDP, 
     94                                           &rem_addr, sizeof(rem_addr), 
     95                                           &tp_sel, &udp_tp); 
     96    if (status != PJ_SUCCESS) 
     97        return -170; 
     98 
     99    if (udp_tp != tp[num_tp-1]) 
     100        return -180; 
     101 
     102    pjsip_transport_dec_ref(udp_tp); 
     103 
     104    if (pj_atomic_get(udp_tp->ref_cnt) != 1) 
     105        return -190; 
     106 
     107    return PJ_SUCCESS; 
     108} 
    27109 
    28110/* 
     
    32114{ 
    33115    enum { SEND_RECV_LOOP = 8 }; 
    34     pjsip_transport *udp_tp, *tp; 
    35     pj_sockaddr_in addr, rem_addr; 
     116    enum { NUM_TP = 4 }; 
     117    pjsip_transport *tp[NUM_TP], *udp_tp; 
     118    pj_sockaddr_in rem_addr; 
    36119    pj_str_t s; 
    37120    pj_status_t status; 
     
    39122    int i, pkt_lost; 
    40123 
    41     pj_sockaddr_in_init(&addr, NULL, TEST_UDP_PORT); 
    42  
    43     /* Start UDP transport. */ 
    44     status = pjsip_udp_transport_start( endpt, &addr, NULL, 1, &udp_tp); 
    45     if (status != PJ_SUCCESS) { 
    46         app_perror("   Error: unable to start UDP transport", status); 
    47         return -10; 
    48     } 
    49  
    50     /* UDP transport must have initial reference counter set to 1. */ 
    51     if (pj_atomic_get(udp_tp->ref_cnt) != 1) 
    52         return -20; 
    53  
    54     /* Test basic transport attributes */ 
    55     status = generic_transport_test(udp_tp); 
     124    status = multi_transport_test(&tp[0], NUM_TP); 
    56125    if (status != PJ_SUCCESS) 
    57126        return status; 
    58  
    59     /* Test that transport manager is returning the correct 
    60      * transport. 
    61      */ 
    62     pj_sockaddr_in_init(&rem_addr, pj_cstr(&s, "1.1.1.1"), 80); 
    63     status = pjsip_endpt_acquire_transport(endpt, PJSIP_TRANSPORT_UDP,  
    64                                            &rem_addr, sizeof(rem_addr), 
    65                                            NULL, &tp); 
    66     if (status != PJ_SUCCESS) 
    67         return -50; 
    68     if (tp != udp_tp) 
    69         return -60; 
    70  
    71     /* pjsip_endpt_acquire_transport() adds reference, so we need 
    72      * to decrement it. 
    73      */ 
    74     pjsip_transport_dec_ref(tp); 
    75  
    76     /* Check again that reference counter is 1. */ 
    77     if (pj_atomic_get(udp_tp->ref_cnt) != 1) 
    78         return -70; 
    79127 
    80128    /* Basic transport's send/receive loopback test. */ 
    81129    pj_sockaddr_in_init(&rem_addr, pj_cstr(&s, "127.0.0.1"), TEST_UDP_PORT); 
    82130    for (i=0; i<SEND_RECV_LOOP; ++i) { 
    83         status = transport_send_recv_test(PJSIP_TRANSPORT_UDP, tp,  
     131        status = transport_send_recv_test(PJSIP_TRANSPORT_UDP, tp[0],  
    84132                                          "sip:alice@127.0.0.1:"TEST_UDP_PORT_STR, 
    85133                                          &rtt[i]); 
     
    99147 
    100148    /* Multi-threaded round-trip test. */ 
    101     status = transport_rt_test(PJSIP_TRANSPORT_UDP, tp,  
     149    status = transport_rt_test(PJSIP_TRANSPORT_UDP, tp[0],  
    102150                               "sip:alice@127.0.0.1:"TEST_UDP_PORT_STR,  
    103151                               &pkt_lost); 
     
    108156        PJ_LOG(3,(THIS_FILE, "   note: %d packet(s) was lost", pkt_lost)); 
    109157 
    110     /* Check again that reference counter is 1. */ 
    111     if (pj_atomic_get(udp_tp->ref_cnt) != 1) 
    112         return -80; 
     158    for (i = 0; i < NUM_TP; ++i) { 
     159        udp_tp = tp[i]; 
    113160 
    114     /* Destroy this transport. */ 
    115     pjsip_transport_dec_ref(udp_tp); 
     161        /* Check again that reference counter is 1. */ 
     162        if (pj_atomic_get(udp_tp->ref_cnt) != 1) 
     163            return -80; 
    116164 
    117     /* Force destroy this transport. */ 
    118     status = pjsip_transport_destroy(udp_tp); 
    119     if (status != PJ_SUCCESS) 
    120         return -90; 
     165        /* Destroy this transport. */ 
     166        pjsip_transport_dec_ref(udp_tp); 
     167        status = pjsip_transport_destroy(udp_tp); 
     168        if (status != PJ_SUCCESS) 
     169            return -90; 
     170    } 
    121171 
    122172    /* Flush events. */ 
Note: See TracChangeset for help on using the changeset viewer.