📄 tsx_uas_test.c
字号:
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_TRYING) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -112;
}
/* Check that status code is status_code. */
if (tsx->status_code != TEST3_PROVISIONAL_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -113;
}
/* Check that event must be TX_MSG */
if (e->body.tsx_state.type != PJSIP_EVENT_TX_MSG) {
PJ_LOG(3,(THIS_FILE, " error: incorrect event"));
test_complete = -114;
}
} else if (tsx->state == PJSIP_TSX_STATE_COMPLETED) {
/* Previous state must be PROCEEDING. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_PROCEEDING) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -115;
}
/* Check that status code is status_code. */
if (tsx->status_code != TEST3_STATUS_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -116;
}
/* Check that event must be TX_MSG */
if (e->body.tsx_state.type != PJSIP_EVENT_TX_MSG) {
PJ_LOG(3,(THIS_FILE, " error: incorrect event"));
test_complete = -117;
}
}
} else
if (pj_strcmp2(&tsx->branch, TEST4_BRANCH_ID)==0) {
/*
* TEST4_BRANCH_ID tests receiving retransmissions in TRYING state.
*/
if (tsx->state == PJSIP_TSX_STATE_TRYING) {
/* Request is received. */
} else if (tsx->state == PJSIP_TSX_STATE_TERMINATED) {
/* Check that status code is status_code. */
if (tsx->status_code != TEST4_STATUS_CODE) {
PJ_LOG(3,(THIS_FILE,
" error: incorrect status code %d "
"(expecting %d)", tsx->status_code,
TEST4_STATUS_CODE));
test_complete = -120;
}
/* Previous state. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_TRYING) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -121;
}
} else if (tsx->state != PJSIP_TSX_STATE_DESTROYED)
{
PJ_LOG(3,(THIS_FILE, " error: unexpected state %s (122)",
pjsip_tsx_state_str(tsx->state)));
test_complete = -122;
}
} else
if (pj_strcmp2(&tsx->branch, TEST5_BRANCH_ID)==0) {
/*
* TEST5_BRANCH_ID tests receiving retransmissions in PROCEEDING state
*/
if (tsx->state == PJSIP_TSX_STATE_TRYING) {
/* Request is received. */
} else if (tsx->state == PJSIP_TSX_STATE_TERMINATED) {
/* Check that status code is status_code. */
if (tsx->status_code != TEST5_STATUS_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -130;
}
/* Previous state. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_PROCEEDING) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -131;
}
} else if (tsx->state == PJSIP_TSX_STATE_PROCEEDING) {
/* Check status code. */
if (tsx->status_code != TEST5_PROVISIONAL_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -132;
}
} else if (tsx->state != PJSIP_TSX_STATE_DESTROYED) {
PJ_LOG(3,(THIS_FILE, " error: unexpected state %s (133)",
pjsip_tsx_state_str(tsx->state)));
test_complete = -133;
}
} else
if (pj_strcmp2(&tsx->branch, TEST6_BRANCH_ID)==0) {
/*
* TEST6_BRANCH_ID tests receiving retransmissions in COMPLETED state
*/
if (tsx->state == PJSIP_TSX_STATE_TRYING) {
/* Request is received. */
} else if (tsx->state == PJSIP_TSX_STATE_TERMINATED) {
/* Check that status code is status_code. */
if (tsx->status_code != TEST6_STATUS_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code %d "
"(expecting %d)", tsx->status_code,
TEST6_STATUS_CODE));
test_complete = -140;
}
/* Previous state. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_COMPLETED) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -141;
}
} else if (tsx->state != PJSIP_TSX_STATE_PROCEEDING &&
tsx->state != PJSIP_TSX_STATE_COMPLETED &&
tsx->state != PJSIP_TSX_STATE_DESTROYED)
{
PJ_LOG(3,(THIS_FILE, " error: unexpected state %s (142)",
pjsip_tsx_state_str(tsx->state)));
test_complete = -142;
}
} else
if (pj_strcmp2(&tsx->branch, TEST7_BRANCH_ID)==0 ||
pj_strcmp2(&tsx->branch, TEST8_BRANCH_ID)==0)
{
/*
* TEST7_BRANCH_ID and TEST8_BRANCH_ID test retransmission of
* INVITE final response
*/
int code;
if (pj_strcmp2(&tsx->branch, TEST7_BRANCH_ID) == 0)
code = TEST7_STATUS_CODE;
else
code = TEST8_STATUS_CODE;
if (tsx->state == PJSIP_TSX_STATE_TRYING) {
/* Request is received. */
} else if (tsx->state == PJSIP_TSX_STATE_TERMINATED) {
if (test_complete == 0)
test_complete = 1;
/* Check status code. */
if (tsx->status_code != PJSIP_SC_TSX_TIMEOUT) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -150;
}
/* Previous state. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_COMPLETED) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -151;
}
/* Check the number of retransmissions */
if (tp_flag & PJSIP_TRANSPORT_RELIABLE) {
if (tsx->retransmit_count != 0) {
PJ_LOG(3,(THIS_FILE, " error: should not retransmit"));
test_complete = -1510;
}
} else {
if (tsx->retransmit_count != 10) {
PJ_LOG(3,(THIS_FILE,
" error: incorrect retransmit count %d "
"(expecting 10)",
tsx->retransmit_count));
test_complete = -1510;
}
}
} else if (tsx->state == PJSIP_TSX_STATE_COMPLETED) {
/* Check that status code is status_code. */
if (tsx->status_code != code) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -152;
}
/* Previous state. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_TRYING) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -153;
}
} else if (tsx->state != PJSIP_TSX_STATE_DESTROYED) {
PJ_LOG(3,(THIS_FILE, " error: unexpected state (154)"));
test_complete = -154;
}
} else
if (pj_strcmp2(&tsx->branch, TEST9_BRANCH_ID)==0) {
/*
* TEST9_BRANCH_ID tests that retransmission of INVITE final response
* must cease when ACK is received.
*/
if (tsx->state == PJSIP_TSX_STATE_TRYING) {
/* Request is received. */
} else if (tsx->state == PJSIP_TSX_STATE_TERMINATED) {
if (test_complete == 0)
test_complete = 1;
/* Check status code. */
if (tsx->status_code != TEST9_STATUS_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -160;
}
/* Previous state. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_CONFIRMED) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -161;
}
} else if (tsx->state == PJSIP_TSX_STATE_COMPLETED) {
/* Check that status code is status_code. */
if (tsx->status_code != TEST9_STATUS_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -162;
}
/* Previous state. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_TRYING) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -163;
}
} else if (tsx->state == PJSIP_TSX_STATE_CONFIRMED) {
/* Check that status code is status_code. */
if (tsx->status_code != TEST9_STATUS_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -164;
}
/* Previous state. */
if (e->body.tsx_state.prev_state != PJSIP_TSX_STATE_COMPLETED) {
PJ_LOG(3,(THIS_FILE, " error: incorrect prev_state"));
test_complete = -165;
}
} else if (tsx->state != PJSIP_TSX_STATE_DESTROYED) {
PJ_LOG(3,(THIS_FILE, " error: unexpected state (166)"));
test_complete = -166;
}
} else
if (pj_strcmp2(&tsx->branch, TEST10_BRANCH_ID)==0 ||
pj_strcmp2(&tsx->branch, TEST11_BRANCH_ID)==0 ||
pj_strcmp2(&tsx->branch, TEST12_BRANCH_ID)==0)
{
if (tsx->state == PJSIP_TSX_STATE_TERMINATED) {
if (!test_complete)
test_complete = 1;
if (tsx->status_code != PJSIP_SC_TSX_TRANSPORT_ERROR) {
PJ_LOG(3,(THIS_FILE," error: incorrect status code"));
test_complete = -170;
}
}
}
}
/* Save transaction key to global variables. */
static void save_key(pjsip_transaction *tsx)
{
pj_str_t key;
pj_strdup(tsx->pool, &key, &tsx->transaction_key);
pj_strcpy(&tsx_key, &key);
}
#define DIFF(a,b) ((a<b) ? (b-a) : (a-b))
/*
* Message receiver handler.
*/
static pj_bool_t on_rx_message(pjsip_rx_data *rdata)
{
pjsip_msg *msg = rdata->msg_info.msg;
pj_str_t branch_param = rdata->msg_info.via->branch_param;
pj_status_t status;
if (pj_strcmp2(&branch_param, TEST1_BRANCH_ID) == 0 ||
pj_strcmp2(&branch_param, TEST2_BRANCH_ID) == 0)
{
/*
* TEST1_BRANCH_ID tests that non-INVITE transaction transmits 2xx
* final response using correct transport and terminates transaction
* after 32 seconds.
*
* TEST2_BRANCH_ID performs similar test for non-2xx final response.
*/
int status_code = (pj_strcmp2(&branch_param, TEST1_BRANCH_ID) == 0) ?
TEST1_STATUS_CODE : TEST2_STATUS_CODE;
if (msg->type == PJSIP_REQUEST_MSG) {
/* On received request, create UAS and respond with final
* response.
*/
pjsip_transaction *tsx;
status = pjsip_tsx_create_uas(&tsx_user, rdata, &tsx);
if (status != PJ_SUCCESS) {
app_perror(" error: unable to create transaction", status);
test_complete = -110;
return PJ_TRUE;
}
pjsip_tsx_recv_msg(tsx, rdata);
save_key(tsx);
send_response(rdata, tsx, status_code);
} else {
/* Verify the response received. */
++recv_count;
/* Verify status code. */
if (msg->line.status.code != status_code) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -113;
}
/* Verify that no retransmissions is received. */
if (recv_count > 1) {
PJ_LOG(3,(THIS_FILE, " error: retransmission received"));
test_complete = -114;
}
}
return PJ_TRUE;
} else if (pj_strcmp2(&branch_param, TEST3_BRANCH_ID) == 0) {
/* TEST3_BRANCH_ID tests provisional response. */
if (msg->type == PJSIP_REQUEST_MSG) {
/* On received request, create UAS and respond with provisional
* response, then schedule timer to send final response.
*/
pjsip_transaction *tsx;
status = pjsip_tsx_create_uas(&tsx_user, rdata, &tsx);
if (status != PJ_SUCCESS) {
app_perror(" error: unable to create transaction", status);
test_complete = -116;
return PJ_TRUE;
}
pjsip_tsx_recv_msg(tsx, rdata);
save_key(tsx);
send_response(rdata, tsx, TEST3_PROVISIONAL_CODE);
schedule_send_response(rdata, &tsx->transaction_key,
TEST3_STATUS_CODE, 2000);
} else {
/* Verify the response received. */
++recv_count;
if (recv_count == 1) {
/* Verify status code. */
if (msg->line.status.code != TEST3_PROVISIONAL_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -123;
}
} else if (recv_count == 2) {
/* Verify status code. */
if (msg->line.status.code != TEST3_STATUS_CODE) {
PJ_LOG(3,(THIS_FILE, " error: incorrect status code"));
test_complete = -124;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -