Changeset 123 for pjproject/trunk/pjsip/src/test-pjsip/tsx_uas_test.c
- Timestamp:
- Jan 18, 2006 11:34:15 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/test-pjsip/tsx_uas_test.c
r119 r123 67 67 ** Transaction also MUST terminate in T4 seconds. 68 68 ** 69 ** TEST10_BRANCH_ID70 ** Test where INVITE UAS transaction never receives ACK71 **72 69 ** 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 73 82 ** When UAS failed to deliver the response with the selected transport, 74 83 ** it should try contacting the client with other transport or begin … … 79 88 ** upon receiving request retransmission). 80 89 ** c. COMPLETED state. 81 **82 ** TEST12_BRANCH_ID83 ** Variant of previous test, where transaction fails to deliver the84 ** response using any kind of transports. Transaction should report85 ** transport error to its transaction user.86 90 ** 87 91 **/ … … 99 103 static char *TEST11_BRANCH_ID = PJSIP_RFC3261_BRANCH_ID "-UAS-Test11"; 100 104 static char *TEST12_BRANCH_ID = PJSIP_RFC3261_BRANCH_ID "-UAS-Test12"; 105 static char *TEST13_BRANCH_ID = PJSIP_RFC3261_BRANCH_ID "-UAS-Test13"; 101 106 102 107 #define TEST1_STATUS_CODE 200 … … 116 121 #define TEST7_STATUS_CODE 301 117 122 #define TEST8_STATUS_CODE 302 123 #define TEST9_STATUS_CODE 301 118 124 119 125 … … 211 217 status = pjsip_tsx_send_msg(tsx, r->tdata); 212 218 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); 214 222 pjsip_tx_data_dec_ref(r->tdata); 215 223 return; 216 224 } 225 226 pj_mutex_unlock(tsx->mutex); 217 227 } 218 228 … … 235 245 status = pjsip_tsx_send_msg(tsx, tdata); 236 246 if (status != PJ_SUCCESS) { 237 app_perror(" error: unable to send response", status);238 247 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; 240 251 return; 241 252 } … … 250 261 pj_status_t status; 251 262 pjsip_tx_data *tdata; 263 pj_timer_entry *t; 252 264 struct response *r; 253 265 pj_time_val delay; … … 269 281 pj_time_val_normalize(&delay); 270 282 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); 275 288 if (status != PJ_SUCCESS) { 289 pjsip_tx_data_dec_ref(tdata); 276 290 app_perror(" error: unable to schedule timer", status); 277 291 test_complete = -199; 278 pjsip_tx_data_dec_ref(tdata);279 292 return; 280 293 } … … 575 588 } 576 589 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 } 577 667 } 578 668 … … 613 703 614 704 if (msg->type == PJSIP_REQUEST_MSG) { 615 /* On received re sponse, create UAS and respond with final705 /* On received request, create UAS and respond with final 616 706 * response. 617 707 */ … … 653 743 654 744 if (msg->type == PJSIP_REQUEST_MSG) { 655 /* On received re sponse, create UAS and respond with provisional745 /* On received request, create UAS and respond with provisional 656 746 * response, then schedule timer to send final response. 657 747 */ … … 706 796 707 797 if (msg->type == PJSIP_REQUEST_MSG) { 708 /* On received re sponse, create UAS. */798 /* On received request, create UAS. */ 709 799 pjsip_transaction *tsx; 710 800 … … 787 877 if (msg->type == PJSIP_REQUEST_MSG) { 788 878 789 /* On received re sponse, create UAS. */879 /* On received request, create UAS. */ 790 880 pjsip_transaction *tsx; 791 881 … … 862 952 return PJ_TRUE; 863 953 864 } else if (pj_strcmp2(&branch_param, TEST9_BRANCH_ID) ) {954 } else if (pj_strcmp2(&branch_param, TEST9_BRANCH_ID) == 0) { 865 955 866 956 /* … … 871 961 if (msg->type == PJSIP_REQUEST_MSG) { 872 962 873 /* On received re sponse, create UAS. */963 /* On received request, create UAS. */ 874 964 pjsip_transaction *tsx; 875 965 … … 877 967 if (status != PJ_SUCCESS) { 878 968 app_perror(" error: unable to create transaction", status); 879 test_complete = -1 40;969 test_complete = -150; 880 970 return PJ_TRUE; 881 971 } 882 972 883 973 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 894 976 895 977 } else { 896 int code;897 978 898 979 ++recv_count; 899 980 900 if ( pj_strcmp2(&branch_param, TEST7_BRANCH_ID) == 0)901 code = TEST7_STATUS_CODE;902 else903 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 } 904 985 905 986 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 }911 987 912 988 recv_last = rdata->pkt_info.timestamp; 913 989 914 } else { 915 990 } else if (recv_count < 5) { 991 992 /* Let UAS retransmit some messages before we send ACK. */ 916 993 pj_time_val now; 917 994 unsigned msec, msec_expected; … … 931 1008 "time (%d ms expected, %d ms received", 932 1009 msec_expected, msec)); 933 test_complete = -1 42;1010 test_complete = -152; 934 1011 } 935 1012 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; 940 1034 } 941 1035 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 946 1094 return PJ_TRUE; 947 1095 } … … 1213 1361 1214 1362 1363 /***************************************************************************** 1364 ** 1365 ** TEST9_BRANCH_ID: retransmission of non-2xx INVITE final response must 1366 ** cease when ACK is received 1367 ** 1368 ***************************************************************************** 1369 */ 1370 static 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 */ 1400 static 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 } 1215 1470 1216 1471 /***************************************************************************** … … 1245 1500 } 1246 1501 1247 #if 01248 1502 /* TEST1_BRANCH_ID: Basic 2xx final response. 1249 1503 * TEST2_BRANCH_ID: Basic non-2xx final response. … … 1294 1548 return status; 1295 1549 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 1297 1566 1298 1567 pjsip_transport_dec_ref(loop);
Note: See TracChangeset
for help on using the changeset viewer.