Ignore:
Timestamp:
Jan 18, 2006 11:34:15 PM (18 years ago)
Author:
bennylp
Message:

Complete tsx layer selftest, implemented authentication framework

File:
1 edited

Legend:

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

    r119 r123  
    6767 **     Transaction also MUST terminate in T4 seconds. 
    6868 ** 
    69  ** TEST10_BRANCH_ID 
    70  **     Test where INVITE UAS transaction never receives ACK 
    71  ** 
    7269 ** TEST11_BRANCH_ID 
     70 **     Test scenario where transport fails before response is sent (i.e. 
     71 **     in TRYING state). 
     72 ** 
     73 ** TEST12_BRANCH_ID 
     74 **     As above, after provisional response is sent but before final 
     75 **     response is sent (i.e. in PROCEEDING state). 
     76 ** 
     77 ** TEST13_BRANCH_ID 
     78 **     As above, for INVITE, after final response has been sent but before 
     79 **     ACK is received (i.e. in CONNECTED state). 
     80 ** 
     81 ** TEST14_BRANCH_ID 
    7382 **     When UAS failed to deliver the response with the selected transport, 
    7483 **     it should try contacting the client with other transport or begin 
     
    7988 **            upon receiving request retransmission). 
    8089 **         c. COMPLETED state. 
    81  ** 
    82  ** TEST12_BRANCH_ID 
    83  **     Variant of previous test, where transaction fails to deliver the  
    84  **     response using any kind of transports. Transaction should report 
    85  **     transport error to its transaction user. 
    8690 ** 
    8791 **/ 
     
    99103static char *TEST11_BRANCH_ID = PJSIP_RFC3261_BRANCH_ID "-UAS-Test11"; 
    100104static char *TEST12_BRANCH_ID = PJSIP_RFC3261_BRANCH_ID "-UAS-Test12"; 
     105static char *TEST13_BRANCH_ID = PJSIP_RFC3261_BRANCH_ID "-UAS-Test13"; 
    101106 
    102107#define TEST1_STATUS_CODE       200 
     
    116121#define TEST7_STATUS_CODE       301 
    117122#define TEST8_STATUS_CODE       302 
     123#define TEST9_STATUS_CODE       301 
    118124 
    119125 
     
    211217    status = pjsip_tsx_send_msg(tsx, r->tdata); 
    212218    if (status != PJ_SUCCESS) { 
    213         PJ_LOG(3,(THIS_FILE,"    error: timer unable to send response")); 
     219        // Some tests do expect failure! 
     220        //PJ_LOG(3,(THIS_FILE,"    error: timer unable to send response")); 
     221        pj_mutex_unlock(tsx->mutex); 
    214222        pjsip_tx_data_dec_ref(r->tdata); 
    215223        return; 
    216224    } 
     225 
     226    pj_mutex_unlock(tsx->mutex); 
    217227} 
    218228 
     
    235245    status = pjsip_tsx_send_msg(tsx, tdata); 
    236246    if (status != PJ_SUCCESS) { 
    237         app_perror("    error: unable to send response", status); 
    238247        pjsip_tx_data_dec_ref(tdata); 
    239         test_complete = -197; 
     248        // Some tests do expect failure! 
     249        //app_perror("    error: unable to send response", status); 
     250        //test_complete = -197; 
    240251        return; 
    241252    } 
     
    250261    pj_status_t status; 
    251262    pjsip_tx_data *tdata; 
     263    pj_timer_entry *t; 
    252264    struct response *r; 
    253265    pj_time_val delay; 
     
    269281    pj_time_val_normalize(&delay); 
    270282 
    271     timer.user_data = r; 
    272     timer.cb = &send_response_timer; 
    273  
    274     status = pjsip_endpt_schedule_timer(endpt, &timer, &delay); 
     283    t = pj_pool_zalloc(tdata->pool, sizeof(*t)); 
     284    t->user_data = r; 
     285    t->cb = &send_response_timer; 
     286 
     287    status = pjsip_endpt_schedule_timer(endpt, t, &delay); 
    275288    if (status != PJ_SUCCESS) { 
     289        pjsip_tx_data_dec_ref(tdata); 
    276290        app_perror("    error: unable to schedule timer", status); 
    277291        test_complete = -199; 
    278         pjsip_tx_data_dec_ref(tdata); 
    279292        return; 
    280293    } 
     
    575588        } 
    576589 
     590 
     591    } else 
     592    if (pj_strcmp2(&tsx->branch, TEST9_BRANCH_ID)==0)  { 
     593        /* 
     594         * TEST9_BRANCH_ID tests that retransmission of INVITE final response 
     595         * must cease when ACK is received. 
     596         */ 
     597 
     598        if (tsx->state == PJSIP_TSX_STATE_TERMINATED) { 
     599 
     600            if (test_complete == 0) 
     601                test_complete = 1; 
     602 
     603            /* Check status code. */ 
     604            if (tsx->status_code != TEST9_STATUS_CODE) { 
     605                PJ_LOG(3,(THIS_FILE, "    error: incorrect status code")); 
     606                test_complete = -160; 
     607            } 
     608             
     609            /* Previous state. */ 
     610            if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_CONFIRMED) { 
     611                PJ_LOG(3,(THIS_FILE, "    error: incorrect prev_state")); 
     612                test_complete = -161; 
     613            } 
     614 
     615        } else if (tsx->state == PJSIP_TSX_STATE_COMPLETED) { 
     616 
     617            /* Check that status code is status_code. */ 
     618            if (tsx->status_code != TEST9_STATUS_CODE) { 
     619                PJ_LOG(3,(THIS_FILE, "    error: incorrect status code")); 
     620                test_complete = -162; 
     621            } 
     622             
     623            /* Previous state. */ 
     624            if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_TRYING) { 
     625                PJ_LOG(3,(THIS_FILE, "    error: incorrect prev_state")); 
     626                test_complete = -163; 
     627            } 
     628 
     629 
     630        } else if (tsx->state == PJSIP_TSX_STATE_CONFIRMED) { 
     631 
     632            /* Check that status code is status_code. */ 
     633            if (tsx->status_code != TEST9_STATUS_CODE) { 
     634                PJ_LOG(3,(THIS_FILE, "    error: incorrect status code")); 
     635                test_complete = -164; 
     636            } 
     637             
     638            /* Previous state. */ 
     639            if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_COMPLETED) { 
     640                PJ_LOG(3,(THIS_FILE, "    error: incorrect prev_state")); 
     641                test_complete = -165; 
     642            } 
     643 
     644        } else if (tsx->state != PJSIP_TSX_STATE_DESTROYED)  { 
     645 
     646            PJ_LOG(3,(THIS_FILE, "    error: unexpected state")); 
     647            test_complete = -166; 
     648 
     649        } 
     650 
     651 
     652    } else 
     653    if (pj_strcmp2(&tsx->branch, TEST10_BRANCH_ID)==0 || 
     654        pj_strcmp2(&tsx->branch, TEST11_BRANCH_ID)==0 || 
     655        pj_strcmp2(&tsx->branch, TEST12_BRANCH_ID)==0)   
     656    { 
     657        if (tsx->state == PJSIP_TSX_STATE_TERMINATED) { 
     658             
     659            if (!test_complete) 
     660                test_complete = 1; 
     661 
     662            if (tsx->status_code != PJSIP_SC_TSX_TRANSPORT_ERROR) { 
     663                PJ_LOG(3,(THIS_FILE,"    error: incorrect status code")); 
     664                test_complete = -170; 
     665            } 
     666        } 
    577667    } 
    578668 
     
    613703 
    614704        if (msg->type == PJSIP_REQUEST_MSG) { 
    615             /* On received response, create UAS and respond with final  
     705            /* On received request, create UAS and respond with final  
    616706             * response.  
    617707             */ 
     
    653743 
    654744        if (msg->type == PJSIP_REQUEST_MSG) { 
    655             /* On received response, create UAS and respond with provisional 
     745            /* On received request, create UAS and respond with provisional 
    656746             * response, then schedule timer to send final response. 
    657747             */ 
     
    706796 
    707797        if (msg->type == PJSIP_REQUEST_MSG) { 
    708             /* On received response, create UAS. */ 
     798            /* On received request, create UAS. */ 
    709799            pjsip_transaction *tsx; 
    710800 
     
    787877        if (msg->type == PJSIP_REQUEST_MSG) { 
    788878 
    789             /* On received response, create UAS. */ 
     879            /* On received request, create UAS. */ 
    790880            pjsip_transaction *tsx; 
    791881 
     
    862952        return PJ_TRUE; 
    863953 
    864     } else if (pj_strcmp2(&branch_param, TEST9_BRANCH_ID)) { 
     954    } else if (pj_strcmp2(&branch_param, TEST9_BRANCH_ID) == 0) { 
    865955 
    866956        /* 
     
    871961        if (msg->type == PJSIP_REQUEST_MSG) { 
    872962 
    873             /* On received response, create UAS. */ 
     963            /* On received request, create UAS. */ 
    874964            pjsip_transaction *tsx; 
    875965 
     
    877967            if (status != PJ_SUCCESS) { 
    878968                app_perror("    error: unable to create transaction", status); 
    879                 test_complete = -140; 
     969                test_complete = -150; 
    880970                return PJ_TRUE; 
    881971            } 
    882972 
    883973            save_key(tsx); 
    884  
    885             if (pj_strcmp2(&branch_param, TEST7_BRANCH_ID) == 0) { 
    886  
    887                 send_response(rdata, tsx, TEST7_STATUS_CODE); 
    888  
    889             } else { 
    890  
    891                 send_response(rdata, tsx, TEST8_STATUS_CODE); 
    892  
    893             } 
     974            send_response(rdata, tsx, TEST9_STATUS_CODE); 
     975 
    894976 
    895977        } else { 
    896             int code; 
    897978 
    898979            ++recv_count; 
    899980 
    900             if (pj_strcmp2(&branch_param, TEST7_BRANCH_ID) == 0) 
    901                 code = TEST7_STATUS_CODE; 
    902             else 
    903                 code = TEST8_STATUS_CODE; 
     981            if (rdata->msg_info.msg->line.status.code != TEST9_STATUS_CODE) { 
     982                PJ_LOG(3,(THIS_FILE,"    error: invalid status code")); 
     983                test_complete = -151; 
     984            } 
    904985 
    905986            if (recv_count==1) { 
    906                  
    907                 if (rdata->msg_info.msg->line.status.code != code) { 
    908                     PJ_LOG(3,(THIS_FILE,"    error: invalid status code")); 
    909                     test_complete = -141; 
    910                 } 
    911987 
    912988                recv_last = rdata->pkt_info.timestamp; 
    913989 
    914             } else { 
    915  
     990            } else if (recv_count < 5) { 
     991 
     992                /* Let UAS retransmit some messages before we send ACK. */ 
    916993                pj_time_val now; 
    917994                unsigned msec, msec_expected; 
     
    9311008                              "time (%d ms expected, %d ms received", 
    9321009                              msec_expected, msec)); 
    933                     test_complete = -142; 
     1010                    test_complete = -152; 
    9341011                } 
    9351012 
    936                 if (recv_count > 11) { 
    937                     PJ_LOG(3,(THIS_FILE,"    error: too many responses (%d)", 
    938                                         recv_count)); 
    939                     test_complete = -143; 
     1013                recv_last = rdata->pkt_info.timestamp; 
     1014 
     1015            } else if (recv_count == 5) { 
     1016                pjsip_tx_data *tdata; 
     1017                pjsip_sip_uri *uri; 
     1018                pjsip_via_hdr *via; 
     1019 
     1020                status = pjsip_endpt_create_request_from_hdr( 
     1021                            endpt, &pjsip_ack_method,  
     1022                            rdata->msg_info.to->uri, 
     1023                            rdata->msg_info.from, 
     1024                            rdata->msg_info.to, 
     1025                            NULL,  
     1026                            rdata->msg_info.cid, 
     1027                            rdata->msg_info.cseq->cseq, 
     1028                            NULL, 
     1029                            &tdata); 
     1030                if (status != PJ_SUCCESS) { 
     1031                    app_perror("    error: unable to create ACK", status); 
     1032                    test_complete = -153; 
     1033                    return PJ_TRUE; 
    9401034                } 
    9411035 
    942                 recv_last = rdata->pkt_info.timestamp; 
    943             } 
    944  
    945         } 
     1036                uri=(pjsip_sip_uri*)pjsip_uri_get_uri(tdata->msg->line.req.uri); 
     1037                uri->transport_param = pj_str("loop-dgram"); 
     1038 
     1039                via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL); 
     1040                via->branch_param = pj_str(TEST9_BRANCH_ID); 
     1041 
     1042                status = pjsip_endpt_send_request_stateless(endpt, tdata, 
     1043                                                            NULL, NULL); 
     1044                if (status != PJ_SUCCESS) { 
     1045                    app_perror("    error: unable to send ACK", status); 
     1046                    test_complete = -154; 
     1047                } 
     1048 
     1049            } else { 
     1050                PJ_LOG(3,(THIS_FILE,"    error: too many responses (%d)", 
     1051                                    recv_count)); 
     1052                test_complete = -155; 
     1053            } 
     1054 
     1055        } 
     1056        return PJ_TRUE; 
     1057 
     1058    } else if (pj_strcmp2(&branch_param, TEST10_BRANCH_ID) == 0 || 
     1059               pj_strcmp2(&branch_param, TEST11_BRANCH_ID) == 0 || 
     1060               pj_strcmp2(&branch_param, TEST12_BRANCH_ID) == 0)  
     1061    { 
     1062        int test_num, code1, code2; 
     1063 
     1064        if (pj_strcmp2(&branch_param, TEST10_BRANCH_ID) == 0) 
     1065            test_num=10, code1 = 100, code2 = 0; 
     1066        else if (pj_strcmp2(&branch_param, TEST11_BRANCH_ID) == 0) 
     1067            test_num=11, code1 = 100, code2 = 200; 
     1068        else 
     1069            test_num=12, code1 = 200, code2 = 0; 
     1070 
     1071        if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) { 
     1072 
     1073            /* On received response, create UAS. */ 
     1074            pjsip_transaction *tsx; 
     1075 
     1076            status = pjsip_tsx_create_uas(&tsx_user, rdata, &tsx); 
     1077            if (status != PJ_SUCCESS) { 
     1078                app_perror("    error: unable to create transaction", status); 
     1079                test_complete = -150; 
     1080                return PJ_TRUE; 
     1081            } 
     1082 
     1083            save_key(tsx); 
     1084             
     1085            schedule_send_response(rdata, &tsx_key, code1, 1000); 
     1086 
     1087            if (code2) 
     1088                schedule_send_response(rdata, &tsx_key, code2, 2000); 
     1089 
     1090        } else { 
     1091 
     1092        } 
     1093 
    9461094        return PJ_TRUE; 
    9471095    } 
     
    12131361 
    12141362 
     1363/***************************************************************************** 
     1364 ** 
     1365 ** TEST9_BRANCH_ID: retransmission of non-2xx INVITE final response must  
     1366 ** cease when ACK is received 
     1367 ** 
     1368 ***************************************************************************** 
     1369 */ 
     1370static int tsx_ack_test(void) 
     1371{ 
     1372    int status; 
     1373 
     1374    PJ_LOG(3,(THIS_FILE, 
     1375              "  test9: receiving ACK for non-2xx final response")); 
     1376 
     1377    status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
     1378                          "sip:129.0.0.1;transport=loop-dgram", 
     1379                          TEST9_BRANCH_ID, 
     1380                          20, /* allow 5 retransmissions */ 
     1381                          &pjsip_invite_method, 1, 0, 0); 
     1382    if (status != 0) 
     1383        return status; 
     1384 
     1385 
     1386    return 0; 
     1387} 
     1388 
     1389 
     1390 
     1391/***************************************************************************** 
     1392 ** 
     1393 ** TEST10_BRANCH_ID: test transport failure in TRYING state. 
     1394 ** TEST11_BRANCH_ID: test transport failure in PROCEEDING state. 
     1395 ** TEST12_BRANCH_ID: test transport failure in CONNECTED state. 
     1396 ** TEST13_BRANCH_ID: test transport failure in CONFIRMED state. 
     1397 ** 
     1398 ***************************************************************************** 
     1399 */ 
     1400static int tsx_transport_failure_test(void) 
     1401{ 
     1402    struct test_desc 
     1403    { 
     1404        int transport_delay; 
     1405        int fail_delay; 
     1406        char *branch_id; 
     1407        char *title; 
     1408    } tests[] =  
     1409    { 
     1410        { 0,  10,   TEST10_BRANCH_ID, "test10: failed transport in TRYING state (no delay)" }, 
     1411        { 50, 10,   TEST10_BRANCH_ID, "test10: failed transport in TRYING state (50 ms delay)" }, 
     1412        { 0,  1500, TEST11_BRANCH_ID, "test11: failed transport in PROCEEDING state (no delay)" }, 
     1413        { 50, 1500, TEST11_BRANCH_ID, "test11: failed transport in PROCEEDING state (50 ms delay)" }, 
     1414        { 0,  2500, TEST12_BRANCH_ID, "test12: failed transport in COMPLETED state (no delay)" }, 
     1415        { 50, 2500, TEST12_BRANCH_ID, "test12: failed transport in COMPLETED state (50 ms delay)" }, 
     1416    }; 
     1417    int i, status; 
     1418 
     1419    for (i=0; i<PJ_ARRAY_SIZE(tests); ++i) { 
     1420        pj_time_val fail_time, end_test, now; 
     1421 
     1422        PJ_LOG(3,(THIS_FILE, "  %s", tests[i].title)); 
     1423        pjsip_loop_set_failure(loop, 0, NULL); 
     1424        pjsip_loop_set_delay(loop, tests[i].transport_delay); 
     1425 
     1426        status = perform_test("sip:129.0.0.1;transport=loop-dgram", 
     1427                              "sip:129.0.0.1;transport=loop-dgram", 
     1428                              tests[i].branch_id, 
     1429                              0, 
     1430                              &pjsip_invite_method, 1, 0, 1); 
     1431        if (status && status != TEST_TIMEOUT_ERROR) 
     1432            return status; 
     1433        if (!status) { 
     1434            PJ_LOG(3,(THIS_FILE, "   error: expecting timeout")); 
     1435            return -40; 
     1436        } 
     1437 
     1438        pj_gettimeofday(&fail_time); 
     1439        fail_time.msec += tests[i].fail_delay; 
     1440        pj_time_val_normalize(&fail_time); 
     1441 
     1442        do { 
     1443            pj_time_val interval = { 0, 1 }; 
     1444            pj_gettimeofday(&now); 
     1445            pjsip_endpt_handle_events(endpt, &interval); 
     1446        } while (PJ_TIME_VAL_LT(now, fail_time)); 
     1447 
     1448        pjsip_loop_set_failure(loop, 1, NULL); 
     1449 
     1450        end_test = now; 
     1451        end_test.sec += 5; 
     1452 
     1453        do { 
     1454            pj_time_val interval = { 0, 1 }; 
     1455            pj_gettimeofday(&now); 
     1456            pjsip_endpt_handle_events(endpt, &interval); 
     1457        } while (!test_complete && PJ_TIME_VAL_LT(now, end_test)); 
     1458 
     1459        if (test_complete == 0) { 
     1460            PJ_LOG(3,(THIS_FILE, "   error: test has timed out")); 
     1461            return -41; 
     1462        } 
     1463 
     1464        if (test_complete != 1) 
     1465            return test_complete; 
     1466    } 
     1467 
     1468    return 0; 
     1469} 
    12151470 
    12161471/***************************************************************************** 
     
    12451500    } 
    12461501 
    1247 #if 0 
    12481502    /* TEST1_BRANCH_ID: Basic 2xx final response.  
    12491503     * TEST2_BRANCH_ID: Basic non-2xx final response.  
     
    12941548        return status; 
    12951549 
    1296 #endif 
     1550    /* TEST9_BRANCH_ID: retransmission of non-2xx INVITE final response must  
     1551     * cease when ACK is received 
     1552     */ 
     1553    status = tsx_ack_test(); 
     1554    if (status != 0) 
     1555        return status; 
     1556 
     1557    /* TEST10_BRANCH_ID: test transport failure in TRYING state. 
     1558     * TEST11_BRANCH_ID: test transport failure in PROCEEDING state. 
     1559     * TEST12_BRANCH_ID: test transport failure in CONNECTED state. 
     1560     * TEST13_BRANCH_ID: test transport failure in CONFIRMED state. 
     1561     */ 
     1562    status = tsx_transport_failure_test(); 
     1563    if (status != 0) 
     1564        return status; 
     1565 
    12971566 
    12981567    pjsip_transport_dec_ref(loop); 
Note: See TracChangeset for help on using the changeset viewer.