diff options
Diffstat (limited to 'tests/mgcp_client')
-rw-r--r-- | tests/mgcp_client/mgcp_client_test.c | 184 | ||||
-rw-r--r-- | tests/mgcp_client/mgcp_client_test.err | 4 | ||||
-rw-r--r-- | tests/mgcp_client/mgcp_client_test.ok | 101 |
3 files changed, 266 insertions, 23 deletions
diff --git a/tests/mgcp_client/mgcp_client_test.c b/tests/mgcp_client/mgcp_client_test.c index 007b90c..9978f79 100644 --- a/tests/mgcp_client/mgcp_client_test.c +++ b/tests/mgcp_client/mgcp_client_test.c @@ -95,21 +95,26 @@ static int reply_to(mgcp_trans_id_t trans_id, int code, const char *comment, void test_response_cb(struct mgcp_response *response, void *priv) { + unsigned int i; OSMO_ASSERT(priv == mgcp); mgcp_response_parse_params(response); - printf("response cb received:\n" - " head.response_code = %d\n" - " head.trans_id = %u\n" - " head.comment = %s\n" - " audio_port = %u\n" - " audio_ip = %s\n", - response->head.response_code, - response->head.trans_id, - response->head.comment, - response->audio_port, - response->audio_ip - ); + printf("response cb received:\n"); + printf(" head.response_code = %d\n", response->head.response_code); + printf(" head.trans_id = %u\n", response->head.trans_id); + printf(" head.comment = %s\n", response->head.comment); + printf(" audio_port = %u\n", response->audio_port); + printf(" audio_ip = %s\n", response->audio_ip); + printf(" ptime = %u\n", response->ptime); + printf(" codecs_len = %u\n", response->codecs_len); + for(i=0;i<response->codecs_len;i++) + printf(" codecs[%u] = %u\n", i, response->codecs[i]); + printf(" ptmap_len = %u\n", response->ptmap_len); + for(i=0;i<response->ptmap_len;i++) { + printf(" ptmap[%u].codec = %u\n", i, response->ptmap[i].codec); + printf(" ptmap[%u].pt = %u\n", i, response->ptmap[i].pt); + } + } mgcp_trans_id_t dummy_mgcp_send(struct msgb *msg) @@ -149,8 +154,9 @@ void test_crcx(void) "s=-\r\n" "c=IN IP4 10.9.1.120\r\n" "t=0 0\r\n" - "m=audio 16002 RTP/AVP 98\r\n" - "a=rtpmap:98 AMR/8000\r\n" + "m=audio 16002 RTP/AVP 110 96\r\n" + "a=rtpmap:110 AMR/8000\r\n" + "a=rtpmap:96 GSM-EFR/8000\r\n" "a=ptime:20\r\n"); } @@ -166,7 +172,15 @@ void test_mgcp_msg(void) .audio_port = 1234, .call_id = 47, .conn_id = "11", - .conn_mode = MGCP_CONN_RECV_SEND + .conn_mode = MGCP_CONN_RECV_SEND, + .ptime = 20, + .codecs[0] = CODEC_GSM_8000_1, + .codecs[1] = CODEC_AMR_8000_1, + .codecs[2] = CODEC_GSMEFR_8000_1, + .codecs_len = 1, + .ptmap[0].codec = CODEC_GSMEFR_8000_1, + .ptmap[0].pt = 96, + .ptmap_len = 1 }; if (mgcp) @@ -183,6 +197,26 @@ void test_mgcp_msg(void) msg = mgcp_msg_gen(mgcp, &mgcp_msg); printf("%s\n", (char *)msg->data); + printf("Generated CRCX message (two codecs):\n"); + mgcp_msg.verb = MGCP_VERB_CRCX; + mgcp_msg.presence = + (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID | + MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE); + mgcp_msg.codecs_len = 2; + msg = mgcp_msg_gen(mgcp, &mgcp_msg); + mgcp_msg.codecs_len = 1; + printf("%s\n", (char *)msg->data); + + printf("Generated CRCX message (three codecs, one with custom pt):\n"); + mgcp_msg.verb = MGCP_VERB_CRCX; + mgcp_msg.presence = + (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID | + MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE); + mgcp_msg.codecs_len = 3; + msg = mgcp_msg_gen(mgcp, &mgcp_msg); + mgcp_msg.codecs_len = 1; + printf("%s\n", (char *)msg->data); + printf("Generated MDCX message:\n"); mgcp_msg.verb = MGCP_VERB_MDCX; mgcp_msg.presence = @@ -192,6 +226,28 @@ void test_mgcp_msg(void) msg = mgcp_msg_gen(mgcp, &mgcp_msg); printf("%s\n", (char *)msg->data); + printf("Generated MDCX message (two codecs):\n"); + mgcp_msg.verb = MGCP_VERB_MDCX; + mgcp_msg.presence = + (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID | + MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE | + MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT); + mgcp_msg.codecs_len = 2; + msg = mgcp_msg_gen(mgcp, &mgcp_msg); + mgcp_msg.codecs_len = 1; + printf("%s\n", (char *)msg->data); + + printf("Generated MDCX message (three codecs, one with custom pt):\n"); + mgcp_msg.verb = MGCP_VERB_MDCX; + mgcp_msg.presence = + (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID | + MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE | + MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT); + mgcp_msg.codecs_len = 3; + msg = mgcp_msg_gen(mgcp, &mgcp_msg); + mgcp_msg.codecs_len = 1; + printf("%s\n", (char *)msg->data); + printf("Generated DLCX message:\n"); mgcp_msg.verb = MGCP_VERB_DLCX; mgcp_msg.presence = @@ -242,6 +298,9 @@ void test_mgcp_client_cancel() .conn_mode = MGCP_CONN_RECV_SEND, .presence = (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID | MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE), + .ptime = 20, + .codecs[0] = CODEC_AMR_8000_1, + .codecs_len = 1 }; printf("\n%s():\n", __func__); @@ -376,6 +435,99 @@ void test_sdp_section_start() OSMO_ASSERT(!failures); } +static void test_map_pt_to_codec(void) +{ + /* Full form */ + OSMO_ASSERT(map_str_to_codec("PCMU/8000/1") == CODEC_PCMU_8000_1); + OSMO_ASSERT(map_str_to_codec("GSM/8000/1") == CODEC_GSM_8000_1); + OSMO_ASSERT(map_str_to_codec("PCMA/8000/1") == CODEC_PCMA_8000_1); + OSMO_ASSERT(map_str_to_codec("G729/8000/1") == CODEC_G729_8000_1); + OSMO_ASSERT(map_str_to_codec("GSM-EFR/8000/1") == CODEC_GSMEFR_8000_1); + OSMO_ASSERT(map_str_to_codec("GSM-HR-08/8000/1") == CODEC_GSMHR_8000_1); + OSMO_ASSERT(map_str_to_codec("AMR/8000/1") == CODEC_AMR_8000_1); + OSMO_ASSERT(map_str_to_codec("AMR-WB/16000/1") == CODEC_AMRWB_16000_1); + + /* Short form */ + OSMO_ASSERT(map_str_to_codec("GSM-EFR") == CODEC_GSMEFR_8000_1); + OSMO_ASSERT(map_str_to_codec("G729") == CODEC_G729_8000_1); + OSMO_ASSERT(map_str_to_codec("GSM-HR-08") == CODEC_GSMHR_8000_1); + + /* We do not care about what is after the first delimiter */ + OSMO_ASSERT(map_str_to_codec("AMR-WB/123///456") == CODEC_AMRWB_16000_1); + OSMO_ASSERT(map_str_to_codec("PCMA/asdf") == CODEC_PCMA_8000_1); + OSMO_ASSERT(map_str_to_codec("GSM/qwertz") == CODEC_GSM_8000_1); + + /* A trailing delimiter should not hurt */ + OSMO_ASSERT(map_str_to_codec("AMR/") == CODEC_AMR_8000_1); + OSMO_ASSERT(map_str_to_codec("G729/") == CODEC_G729_8000_1); + OSMO_ASSERT(map_str_to_codec("GSM/") == CODEC_GSM_8000_1); + + /* This is expected to fail */ + OSMO_ASSERT(map_str_to_codec("INVALID/1234/7") == -1); + OSMO_ASSERT(map_str_to_codec(NULL) == -1); + OSMO_ASSERT(map_str_to_codec("") == -1); + OSMO_ASSERT(map_str_to_codec("/////") == -1); + + /* The buffers are 64 bytes long, check what happens with overlong + * strings as input (This schould still work.) */ + OSMO_ASSERT(map_str_to_codec("AMR-WB/16000/1############################################################################################################") == CODEC_AMRWB_16000_1); + + /* This should not work, as there is no delimiter after the codec + * name */ + OSMO_ASSERT(map_str_to_codec("AMR-WB####################################################################################################################") == -1); +} + +static void test_map_codec_to_pt_and_map_pt_to_codec(void) +{ + struct ptmap ptmap[10]; + unsigned int ptmap_len; + unsigned int i; + + ptmap[0].codec = CODEC_GSMEFR_8000_1; + ptmap[0].pt = 96; + ptmap[1].codec = CODEC_GSMHR_8000_1; + ptmap[1].pt = 97; + ptmap[2].codec = CODEC_AMR_8000_1; + ptmap[2].pt = 98; + ptmap[3].codec = CODEC_AMRWB_16000_1; + ptmap[3].pt = 99; + ptmap_len = 4; + + /* Mappings that are covered by the table */ + for (i = 0; i < ptmap_len; i++) + printf(" %u => %u\n", ptmap[i].codec, map_codec_to_pt(ptmap, ptmap_len, ptmap[i].codec)); + for (i = 0; i < ptmap_len; i++) + printf(" %u <= %u\n", ptmap[i].pt, map_pt_to_codec(ptmap, ptmap_len, ptmap[i].pt)); + printf("\n"); + + /* Map some codecs/payload types from the static range, result must + * always be a 1:1 mapping */ + printf(" %u => %u\n", CODEC_PCMU_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_PCMU_8000_1)); + printf(" %u => %u\n", CODEC_GSM_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_GSM_8000_1)); + printf(" %u => %u\n", CODEC_PCMA_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_PCMA_8000_1)); + printf(" %u => %u\n", CODEC_G729_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_G729_8000_1)); + printf(" %u <= %u\n", CODEC_PCMU_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_PCMU_8000_1)); + printf(" %u <= %u\n", CODEC_GSM_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_GSM_8000_1)); + printf(" %u <= %u\n", CODEC_PCMA_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_PCMA_8000_1)); + printf(" %u <= %u\n", CODEC_G729_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_G729_8000_1)); + printf("\n"); + + /* Try to do mappings from statically defined range to danymic range and vice versa. This + * is illegal and should result into a 1:1 mapping */ + ptmap[3].codec = CODEC_AMRWB_16000_1; + ptmap[3].pt = 2; + ptmap[4].codec = CODEC_PCMU_8000_1; + ptmap[4].pt = 100; + ptmap_len = 5; + + /* Apply all mappings again, the illegal ones we defined should result into 1:1 mappings */ + for (i = 0; i < ptmap_len; i++) + printf(" %u => %u\n", ptmap[i].codec, map_codec_to_pt(ptmap, ptmap_len, ptmap[i].codec)); + for (i = 0; i < ptmap_len; i++) + printf(" %u <= %u\n", ptmap[i].pt, map_pt_to_codec(ptmap, ptmap_len, ptmap[i].pt)); + printf("\n"); +} + static const struct log_info_cat log_categories[] = { }; @@ -403,6 +555,8 @@ int main(int argc, char **argv) test_mgcp_msg(); test_mgcp_client_cancel(); test_sdp_section_start(); + test_map_codec_to_pt_and_map_pt_to_codec(); + test_map_pt_to_codec(); printf("Done\n"); fprintf(stderr, "Done\n"); diff --git a/tests/mgcp_client/mgcp_client_test.err b/tests/mgcp_client/mgcp_client_test.err index 7309242..1d5a1a0 100644 --- a/tests/mgcp_client/mgcp_client_test.err +++ b/tests/mgcp_client/mgcp_client_test.err @@ -62,4 +62,8 @@ test_sdp_section_start() test [9]: body: "some mgcp header data\r\nand header params\n\r\rm=audio 23\r\n" DLMGCP MGCP response: cannot find start of SDP parameters got rc=-22 +DLMGCP ptmap contains illegal mapping: codec=113 maps to pt=2 +DLMGCP ptmap contains illegal mapping: codec=0 maps to pt=100 +DLMGCP ptmap contains illegal mapping: codec=113 maps to pt=2 +DLMGCP ptmap contains illegal mapping: codec=0 maps to pt=100 Done diff --git a/tests/mgcp_client/mgcp_client_test.ok b/tests/mgcp_client/mgcp_client_test.ok index fc6db30..454ee3d 100644 --- a/tests/mgcp_client/mgcp_client_test.ok +++ b/tests/mgcp_client/mgcp_client_test.ok @@ -18,8 +18,9 @@ o=- 1 23 IN IP4 10.9.1.120 s=-
c=IN IP4 10.9.1.120
t=0 0
-m=audio 16002 RTP/AVP 98
-a=rtpmap:98 AMR/8000
+m=audio 16002 RTP/AVP 110 96
+a=rtpmap:110 AMR/8000
+a=rtpmap:96 GSM-EFR/8000
a=ptime:20
----- @@ -29,16 +30,39 @@ response cb received: head.comment = OK audio_port = 16002 audio_ip = 10.9.1.120 + ptime = 20 + codecs_len = 2 + codecs[0] = 112 + codecs[1] = 110 + ptmap_len = 2 + ptmap[0].codec = 112 + ptmap[0].pt = 110 + ptmap[1].codec = 110 + ptmap[1].pt = 96 Generated CRCX message: CRCX 1 23@mgw MGCP 1.0
C: 2f
I: 11
-L: p:20, a:AMR, nt:IN
+L: p:20, a:GSM, nt:IN
+M: sendrecv
+ +Generated CRCX message (two codecs): +CRCX 2 23@mgw MGCP 1.0
+C: 2f
+I: 11
+L: p:20, a:GSM;AMR, nt:IN
+M: sendrecv
+ +Generated CRCX message (three codecs, one with custom pt): +CRCX 3 23@mgw MGCP 1.0
+C: 2f
+I: 11
+L: p:20, a:GSM;AMR;GSM-EFR, nt:IN
M: sendrecv
Generated MDCX message: -MDCX 2 23@mgw MGCP 1.0
+MDCX 4 23@mgw MGCP 1.0
C: 2f
I: 11
M: sendrecv
@@ -48,18 +72,50 @@ o=- 2f 23 IN IP4 127.0.0.1 s=-
c=IN IP4 192.168.100.23
t=0 0
-m=audio 1234 RTP/AVP 255
+m=audio 1234 RTP/AVP 3
+a=ptime:20
+ +Generated MDCX message (two codecs): +MDCX 5 23@mgw MGCP 1.0
+C: 2f
+I: 11
+M: sendrecv
+
+v=0
+o=- 2f 23 IN IP4 127.0.0.1
+s=-
+c=IN IP4 192.168.100.23
+t=0 0
+m=audio 1234 RTP/AVP 3 112
+a=rtpmap:112 AMR/8000/1
+a=ptime:20
+ +Generated MDCX message (three codecs, one with custom pt): +MDCX 6 23@mgw MGCP 1.0
+C: 2f
+I: 11
+M: sendrecv
+
+v=0
+o=- 2f 23 IN IP4 127.0.0.1
+s=-
+c=IN IP4 192.168.100.23
+t=0 0
+m=audio 1234 RTP/AVP 3 112 96
+a=rtpmap:112 AMR/8000/1
+a=rtpmap:96 GSM-EFR/8000/1
+a=ptime:20
Generated DLCX message: -DLCX 3 23@mgw MGCP 1.0
+DLCX 7 23@mgw MGCP 1.0
C: 2f
I: 11
Generated AUEP message: -AUEP 4 23@mgw MGCP 1.0
+AUEP 8 23@mgw MGCP 1.0
Generated RSIP message: -RSIP 5 23@mgw MGCP 1.0
+RSIP 9 23@mgw MGCP 1.0
Overfolow test: @@ -102,4 +158,33 @@ test_sdp_section_start() test [7]: test_sdp_section_start() test [8]: test_sdp_section_start() test [9]: + 110 => 96 + 111 => 97 + 112 => 98 + 113 => 99 + 96 <= 110 + 97 <= 111 + 98 <= 112 + 99 <= 113 + + 0 => 0 + 3 => 3 + 8 => 8 + 18 => 18 + 0 <= 0 + 3 <= 3 + 8 <= 8 + 18 <= 18 + + 110 => 96 + 111 => 97 + 112 => 98 + 113 => 113 + 0 => 0 + 96 <= 110 + 97 <= 111 + 98 <= 112 + 2 <= 2 + 100 <= 100 + Done |