mgcp_client_test: add test_parse_response()
Change-Id: I842ce65a9a70f313570857b7df53727cc572b9e6
This commit is contained in:
parent
3a3e1b57c6
commit
c9df010416
|
@ -673,6 +673,214 @@ void test_mgcp_client_e1_epname(void)
|
|||
OSMO_ASSERT(epname == NULL);
|
||||
}
|
||||
|
||||
struct parse_response_test {
|
||||
const char *body;
|
||||
int expect_rc;
|
||||
struct mgcp_response expect_params;
|
||||
};
|
||||
|
||||
static struct parse_response_test parse_response_tests[] = {
|
||||
{
|
||||
.body = "200 2 OK\r\n"
|
||||
"I: foo\r\n"
|
||||
"\r\n"
|
||||
"v=0\r\n"
|
||||
"o=- name 23 IN IP4 0.0.0.0\r\n"
|
||||
"s=-\r\n"
|
||||
"c=IN IP4 1.2.3.4\r\n"
|
||||
"t=0 0\r\n"
|
||||
"m=audio 23 RTP/AVP 112 3\r\n" /* <-- implicit: 3 = GSM-FR */
|
||||
"a=rtpmap:112 AMR/8000\r\n"
|
||||
"a=ptime:20\r\n",
|
||||
.expect_rc = 0,
|
||||
.expect_params = {
|
||||
.audio_port = 23,
|
||||
.audio_ip = "1.2.3.4",
|
||||
.ptmap = {
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 112 },
|
||||
{ .codec = CODEC_GSM_8000_1, .pt = 3 },
|
||||
},
|
||||
.ptmap_len = 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
.body = "200 2 OK\r\n"
|
||||
"I: foo\r\n"
|
||||
"\r\n"
|
||||
"v=0\r\n"
|
||||
"o=- name 23 IN IP4 0.0.0.0\r\n"
|
||||
"s=-\r\n"
|
||||
"c=IN IP4 1.2.3.4\r\n"
|
||||
"t=0 0\r\n"
|
||||
"m=audio 23 RTP/AVP 112 3\r\n"
|
||||
"a=rtpmap:112 AMR/8000\r\n"
|
||||
"a=rtpmap:3 GSM/8000\r\n" /* 3 == GSM-FR implicitly, is an explicit entry a problem? */
|
||||
"a=ptime:20\r\n",
|
||||
.expect_rc = 0,
|
||||
.expect_params = {
|
||||
.audio_port = 23,
|
||||
.audio_ip = "1.2.3.4",
|
||||
.ptmap = {
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 112 },
|
||||
{ .codec = CODEC_GSM_8000_1, .pt = 3 }, /* no, not a problem */
|
||||
},
|
||||
.ptmap_len = 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
.body = "200 2 OK\r\n"
|
||||
"I: foo\r\n"
|
||||
"\r\n"
|
||||
"v=0\r\n"
|
||||
"o=- name 23 IN IP4 0.0.0.0\r\n"
|
||||
"s=-\r\n"
|
||||
"c=IN IP4 1.2.3.4\r\n"
|
||||
"t=0 0\r\n"
|
||||
"m=audio 23 RTP/AVP 3\r\n" /* <-- 112 is missing here. Will it still appear? */
|
||||
"a=rtpmap:112 AMR/8000\r\n"
|
||||
"a=ptime:20\r\n",
|
||||
.expect_rc = 0,
|
||||
.expect_params = {
|
||||
.audio_port = 23,
|
||||
.audio_ip = "1.2.3.4",
|
||||
.ptmap = {
|
||||
{ .codec = CODEC_GSM_8000_1, .pt = 3 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 112 }, /* <-- yes, it was added to the end. */
|
||||
},
|
||||
.ptmap_len = 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
/* test MGCP_MAX_CODECS */
|
||||
.body = "200 2 OK\r\n"
|
||||
"I: foo\r\n"
|
||||
"\r\n"
|
||||
"v=0\r\n"
|
||||
"o=- name 23 IN IP4 0.0.0.0\r\n"
|
||||
"s=-\r\n"
|
||||
"c=IN IP4 1.2.3.4\r\n"
|
||||
"t=0 0\r\n"
|
||||
"m=audio 23 RTP/AVP 101 102 103 104 105 106 107 108 109 110\r\n" /* <-- 10 codecs max */
|
||||
"a=rtpmap:101 AMR/8000\r\n"
|
||||
"a=rtpmap:102 AMR/8000\r\n"
|
||||
"a=rtpmap:103 AMR/8000\r\n"
|
||||
"a=rtpmap:104 AMR/8000\r\n"
|
||||
"a=rtpmap:105 AMR/8000\r\n"
|
||||
"a=rtpmap:106 AMR/8000\r\n"
|
||||
"a=rtpmap:107 AMR/8000\r\n"
|
||||
"a=rtpmap:108 AMR/8000\r\n"
|
||||
"a=rtpmap:109 AMR/8000\r\n"
|
||||
"a=rtpmap:110 AMR/8000\r\n"
|
||||
"a=ptime:20\r\n",
|
||||
.expect_rc = 0,
|
||||
.expect_params = {
|
||||
.audio_port = 23,
|
||||
.audio_ip = "1.2.3.4",
|
||||
.ptmap = {
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 101 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 102 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 103 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 104 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 105 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 106 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 107 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 108 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 109 },
|
||||
{ .codec = CODEC_AMR_8000_1, .pt = 110 },
|
||||
},
|
||||
.ptmap_len = 10,
|
||||
},
|
||||
},
|
||||
{
|
||||
/* test MGCP_MAX_CODECS */
|
||||
.body = "200 2 OK\r\n"
|
||||
"I: foo\r\n"
|
||||
"\r\n"
|
||||
"v=0\r\n"
|
||||
"o=- name 23 IN IP4 0.0.0.0\r\n"
|
||||
"s=-\r\n"
|
||||
"c=IN IP4 1.2.3.4\r\n"
|
||||
"t=0 0\r\n"
|
||||
"m=audio 23 RTP/AVP 101 102 103 104 105 106 107 108 109 110 3\r\n" /* <-- 11 > MGCP_MAX_CODECS */
|
||||
"a=rtpmap:101 AMR/8000\r\n"
|
||||
"a=rtpmap:102 AMR/8000\r\n"
|
||||
"a=rtpmap:103 AMR/8000\r\n"
|
||||
"a=rtpmap:104 AMR/8000\r\n"
|
||||
"a=rtpmap:105 AMR/8000\r\n"
|
||||
"a=rtpmap:106 AMR/8000\r\n"
|
||||
"a=rtpmap:107 AMR/8000\r\n"
|
||||
"a=rtpmap:108 AMR/8000\r\n"
|
||||
"a=rtpmap:109 AMR/8000\r\n"
|
||||
"a=rtpmap:110 AMR/8000\r\n"
|
||||
"a=ptime:20\r\n",
|
||||
.expect_rc = -EINVAL,
|
||||
},
|
||||
};
|
||||
|
||||
static void test_parse_response(void)
|
||||
{
|
||||
int i;
|
||||
int failures = 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(parse_response_tests); i++) {
|
||||
int rc;
|
||||
struct parse_response_test *t = &parse_response_tests[i];
|
||||
struct mgcp_response *r = talloc_zero(ctx, struct mgcp_response);
|
||||
int p;
|
||||
|
||||
r->body = talloc_strdup(r, t->body);
|
||||
|
||||
//printf("\n%s() test [%d]:\n", __func__, i);
|
||||
fprintf(stderr, "\n%s() test [%d]:\n", __func__, i);
|
||||
fprintf(stderr, "body: \"%s\"\n", osmo_escape_str(r->body, -1));
|
||||
|
||||
rc = mgcp_response_parse_params(r);
|
||||
|
||||
fprintf(stderr, "got rc=%d\n", rc);
|
||||
if (rc != t->expect_rc) {
|
||||
fprintf(stderr, "FAIL: Expected rc=%d\n", t->expect_rc);
|
||||
failures++;
|
||||
}
|
||||
if (rc) {
|
||||
talloc_free(r);
|
||||
continue;
|
||||
}
|
||||
|
||||
fprintf(stderr, "got audio_ip=\"%s\"\n", r->audio_ip);
|
||||
if (strcmp(r->audio_ip, t->expect_params.audio_ip)) {
|
||||
fprintf(stderr, "FAIL: Expected audio_ip=\"%s\"\n", t->expect_params.audio_ip);
|
||||
failures++;
|
||||
}
|
||||
fprintf(stderr, "got audio_port=%u\n", r->audio_port);
|
||||
if (r->audio_port != t->expect_params.audio_port) {
|
||||
fprintf(stderr, "FAIL: Expected audio_port=%u\n", t->expect_params.audio_port);
|
||||
failures++;
|
||||
}
|
||||
|
||||
for (p = 0; p < r->ptmap_len; p++) {
|
||||
struct ptmap *got = &r->ptmap[p];
|
||||
struct ptmap *expect = NULL;
|
||||
fprintf(stderr, " %d %s\n", got->pt, osmo_mgcpc_codec_name(got->codec));
|
||||
if (p >= t->expect_params.ptmap_len) {
|
||||
fprintf(stderr, " - ERROR: too many codec entries\n");
|
||||
failures++;
|
||||
continue;
|
||||
}
|
||||
expect = &t->expect_params.ptmap[p];
|
||||
if (ptmap_cmp(got, expect)) {
|
||||
fprintf(stderr, " - ERROR: expected: %d %s\n",
|
||||
expect->pt, osmo_mgcpc_codec_name(expect->codec));
|
||||
failures++;
|
||||
}
|
||||
}
|
||||
|
||||
talloc_free(r);
|
||||
}
|
||||
|
||||
OSMO_ASSERT(!failures);
|
||||
}
|
||||
|
||||
|
||||
static const struct log_info_cat log_categories[] = {
|
||||
};
|
||||
|
||||
|
@ -704,6 +912,8 @@ int main(int argc, char **argv)
|
|||
test_map_str_to_codec();
|
||||
test_mgcp_client_e1_epname();
|
||||
|
||||
test_parse_response();
|
||||
|
||||
printf("Done\n");
|
||||
fprintf(stderr, "Done\n");
|
||||
return EXIT_SUCCESS;
|
||||
|
|
|
@ -137,4 +137,51 @@ DLMGCP MGW(mgw) Cannot compose MGCP e1-endpoint name (ds/e1-15/s-1/su128-0@mgw),
|
|||
DLMGCP MGW(mgw) Cannot compose MGCP e1-endpoint name (ds/e1-15/s-1/su8-16@mgw), rate(8)/offset(16) combination is invalid!
|
||||
DLMGCP MGW(mgw) Cannot compose MGCP e1-endpoint name (ds/e1-15/s-0/su8-2@mgw), E1-timeslot number (0) is invalid!
|
||||
DLMGCP MGW(mgw) Cannot compose MGCP e1-endpoint name (ds/e1-15/s-64/su8-2@mgw), E1-timeslot number (64) is invalid!
|
||||
|
||||
test_parse_response() test [0]:
|
||||
body: "200 2 OK\r\nI: foo\r\n\r\nv=0\r\no=- name 23 IN IP4 0.0.0.0\r\ns=-\r\nc=IN IP4 1.2.3.4\r\nt=0 0\r\nm=audio 23 RTP/AVP 112 3\r\na=rtpmap:112 AMR/8000\r\na=ptime:20\r\n"
|
||||
got rc=0
|
||||
got audio_ip="1.2.3.4"
|
||||
got audio_port=23
|
||||
112 AMR/8000/1
|
||||
3 GSM/8000/1
|
||||
|
||||
test_parse_response() test [1]:
|
||||
body: "200 2 OK\r\nI: foo\r\n\r\nv=0\r\no=- name 23 IN IP4 0.0.0.0\r\ns=-\r\nc=IN IP4 1.2.3.4\r\nt=0 0\r\nm=audio 23 RTP/AVP 112 3\r\na=rtpmap:112 AMR/8000\r\na=rtpmap:3 GSM/8000\r\na=ptime:20\r\n"
|
||||
got rc=0
|
||||
got audio_ip="1.2.3.4"
|
||||
got audio_port=23
|
||||
112 AMR/8000/1
|
||||
3 GSM/8000/1
|
||||
|
||||
test_parse_response() test [2]:
|
||||
body: "200 2 OK\r\nI: foo\r\n\r\nv=0\r\no=- name 23 IN IP4 0.0.0.0\r\ns=-\r\nc=IN IP4 1.2.3.4\r\nt=0 0\r\nm=audio 23 RTP/AVP 3\r\na=rtpmap:112 AMR/8000\r\na=ptime:20\r\n"
|
||||
DLMGCP error in MGCP message: 'a=rtpmap:112' has no matching entry in 'm=audio ... 112'
|
||||
got rc=0
|
||||
got audio_ip="1.2.3.4"
|
||||
got audio_port=23
|
||||
3 GSM/8000/1
|
||||
112 AMR/8000/1
|
||||
|
||||
test_parse_response() test [3]:
|
||||
body: "200 2 OK\r\nI: foo\r\n\r\nv=0\r\no=- name 23 IN IP4 0.0.0.0\r\ns=-\r\nc=IN IP4 1.2.3.4\r\nt=0 0\r\nm=audio 23 RTP/AVP 101 102 103 104 105 106 107 108 109 110\r\na=rtpmap:101 AMR/8000\r\na=rtpmap:102 AMR/8000\r\na=rtpmap:103 AMR/8000\r\na=rtpmap:104 AMR/8"
|
||||
got rc=0
|
||||
got audio_ip="1.2.3.4"
|
||||
got audio_port=23
|
||||
101 AMR/8000/1
|
||||
102 AMR/8000/1
|
||||
103 AMR/8000/1
|
||||
104 AMR/8000/1
|
||||
105 AMR/8000/1
|
||||
106 AMR/8000/1
|
||||
107 AMR/8000/1
|
||||
108 AMR/8000/1
|
||||
109 AMR/8000/1
|
||||
110 AMR/8000/1
|
||||
|
||||
test_parse_response() test [4]:
|
||||
body: "200 2 OK\r\nI: foo\r\n\r\nv=0\r\no=- name 23 IN IP4 0.0.0.0\r\ns=-\r\nc=IN IP4 1.2.3.4\r\nt=0 0\r\nm=audio 23 RTP/AVP 101 102 103 104 105 106 107 108 109 110 3\r\na=rtpmap:101 AMR/8000\r\na=rtpmap:102 AMR/8000\r\na=rtpmap:103 AMR/8000\r\na=rtpmap:104 AMR"
|
||||
DLMGCP SDP: can parse only up to 10 payload type numbers
|
||||
DLMGCP Failed to parse SDP parameter payload types (RTP/AVP)
|
||||
got rc=-22
|
||||
Done
|
||||
|
|
Loading…
Reference in New Issue