neels has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-mgw/+/35422?usp=email )


Change subject: mgcp_client_test: add test_parse_response()
......................................................................

mgcp_client_test: add test_parse_response()

Change-Id: I842ce65a9a70f313570857b7df53727cc572b9e6
---
M tests/mgcp_client/mgcp_client_test.c
M tests/mgcp_client/mgcp_client_test.err
2 files changed, 266 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/22/35422/1

diff --git a/tests/mgcp_client/mgcp_client_test.c 
b/tests/mgcp_client/mgcp_client_test.c
index 3883c3a..9b356c3 100644
--- a/tests/mgcp_client/mgcp_client_test.c
+++ b/tests/mgcp_client/mgcp_client_test.c
@@ -673,6 +673,214 @@
        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 @@
        test_map_str_to_codec();
        test_mgcp_client_e1_epname();

+       test_parse_response();
+
        printf("Done\n");
        fprintf(stderr, "Done\n");
        return EXIT_SUCCESS;
diff --git a/tests/mgcp_client/mgcp_client_test.err 
b/tests/mgcp_client/mgcp_client_test.err
index 22ad3cc..94fe351 100644
--- a/tests/mgcp_client/mgcp_client_test.err
+++ b/tests/mgcp_client/mgcp_client_test.err
@@ -137,4 +137,51 @@
 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

--
To view, visit https://gerrit.osmocom.org/c/osmo-mgw/+/35422?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-mgw
Gerrit-Branch: master
Gerrit-Change-Id: I842ce65a9a70f313570857b7df53727cc572b9e6
Gerrit-Change-Number: 35422
Gerrit-PatchSet: 1
Gerrit-Owner: neels <[email protected]>
Gerrit-MessageType: newchange

Reply via email to